【问题标题】:Replacing ItemsControl ContentPresenter entirely with control being rendered用正在呈现的控件完全替换 ItemsControl ContentPresenter
【发布时间】:2012-12-02 23:08:39
【问题描述】:

我正在使用 ItemsControl 根据我的模型生成控件列表。 在查看可视化树时,我注意到每个呈现的控件都包含在 ContentPresenter 中。添加的控件是第 3 方控件,如果它们是同级控件,则设计为在每个控件之间显示拆分器。这允许用户调整每个控件的大小。例如,以下将显示运行时每个控件之间的拆分器。

<StackPanel>
<3rdPartyControl />
<3rdPartyControl />
<3rdPartyControl />
</StackPanel>

使用 ItemsControl 时,每个 3rdPartyControl 都包装在 ContentPresenter 中,因此不显示拆分器。我尝试了各种方法来尝试解决这个问题,但除非我在后面编写代码来添加每个控件而不是依赖 Xaml,否则无法让它工作。 有谁知道完全替换 contentpresenter 的方法(在我的例子中是 3rdpartyControl)?

谢谢

【问题讨论】:

  • 为什么你认为 ContentPresenter 是 splitter 不起作用的原因?
  • 因为如果我在我的示例中添加 3 个控件而不使用 ItemsControl,它会按预期工作。使用 snoop 来查看差异,我看到在它不起作用的情况下,contentpresenter 包装了控件......这是唯一的区别。
  • 当你为 ItemsControl 指定你自己的 ItemsPanelTemplate (StackPanel) 时是这样吗?
  • ItemsPanel 模板将包含我相信的整个项目列表。我需要的是在生成的每个控件周围生成一个没有 ContentPresenter 的可视化树。出于绝望和好奇..我尝试指定自定义 ItemsControl.ItemsPanel、ItemsControl.Template 和 ItemsControl.ItemContainerStyle 以使这些控件呈现为顺序同级。在这些情况下,预期的行为都没有起作用,当检查可视化树时,我继续看到 ContentPresenter 包装的每个控件。

标签: c# wpf silverlight xaml


【解决方案1】:

为了替换 ContentPresenter,您可以从 ItemsControl 派生并覆盖 GetContainerForItemOverride 方法以创建专门的容器控件。

例如,ListBox 会覆盖此方法以创建一个 ListBoxItem 作为新项目对象的容器。

【讨论】:

  • 这似乎可以解决问题,但由于某种原因,它没有调用我的 DataTemplate 来呈现内容。我确实在可视化树中看到了自定义控件,但是它们只是没有内容。不知道为什么...
  • 为了使 DataTemplate 工作,您需要一个可以处理 DataTemplate 的控件(例如 ContentPresenter :-)。但是,您可以通过设置 ItemContainerStyle 属性为您的容器提供样式。
  • 嗯..这越来越乱了。新容器是一个 DevExpress LayoutGroup 控件,我想在其中添加一个图表控件作为子控件... LayoutGroup 甚至没有模板属性。
  • 对不起,我不知道那个。
  • 没关系,我认为您的回答会对遇到相同问题的其他人有所帮助。谢谢
【解决方案2】:

确实如此,您添加到 ItemsControl 的每个元素都使用 ContentPresenter 包装,您可以在 dr.wpf ItemsControl a-z 的系列文章中找到更多详细信息

我建议尝试的一种方法是将 ItemsControl 更改为 ListBox 并使 ListBox 的行为类似于 ItemsControl。在这种情况下,您可以重新样式/重新模板 ListBoxItem 并用您的控件替换 ContentPresenter。您还需要停止选择支持。 Here 是您需要更改的 ListBox 样式。

【讨论】:

  • 我确实尝试通过重新模板来使用列表框...但如果回想一下,这里的问题是相似的,呈现的每个控件都包装在 ListBoxItem 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多