【发布时间】:2019-01-11 14:40:42
【问题描述】:
我有一个从ItemsControl 继承的控件,称为WorkSheet:
public sealed class WorkSheet : ItemsControl {
它的元素被强制为WorkTiles:
/// <inheritdoc />
protected override bool IsItemItsOwnContainerOverride(object item) {
return (item is WorkTile);
}
/// <inheritdoc />
protected override DependencyObject GetContainerForItemOverride() {
return new WorkTile();
}
到目前为止 - 非常好。我希望WorkSheet 使用Canvas 来呈现WorkItems,位置由覆盖ArrangeOverride 确定,它被调用并正确确定位置。确切的位置正在覆盖中确定。不过,我对造型很迷茫。我根本无法让这些项目出现。在 Generic.xaml 中,我定义了样式。它们有效,但不是应有的效果:
<Style TargetType="{x:Type local:WorkSheet}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border>
<ItemsPresenter />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<ContentPresenter />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
在这里,几乎在表示树中,ItemsPresenter 是最低的元素。 ItemsPresenter 的子元素永远不会出现。我还尝试将Canvas 与IsItemsHost="true" 一起放入ControlTemplate - 再次,没有项目。有人知道我在这里做错了什么吗?
同样,作为解释 - 我在表单上的按钮处理程序中放置了一个断点,并使用 Visualizer 来查看可视化树。我得到的层次结构是:
WorkSheet -> Border -> ItemsPresenter ... 下面什么都没有。
显然这意味着使用了ControlTemplate,但从未调用过ItemsPanel。
【问题讨论】:
标签: c# wpf styles itemscontrol