我有一个来自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
确定,该<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>
被调用并且位置已正确确定。精确的姿势是在覆盖中确定的。不过,我在造型方面很丢失。我根本无法让物品出现。在Generic.xaml中,我定义了样式。他们工作,但不是他们应该:
ItemsPresenter
在这里,几乎在表示树中,ItemsPresenter
是最低元素。 Canvas
的子元素从未出现过。我还尝试将ControlTemplate
放入IsItemsHost="true"
WorkSheet -> Border -> ItemsPresenter
- 再次,没有任何项目。任何人都知道我在这里做错了什么?
再次,作为解释 - 我将断点放入表单上的按钮处理程序,并使用Visualizer查看可视树。我得到的层次结构是:
ControlTemplate
......以下没有。
显然这意味着使用ItemsPanel
,但永远不会调用{{1}}。
答案 0 :(得分:1)
在ControlTemplate中放置一个TargetType:
<ControlTemplate TargetType="{x:Type local:WorkSheet}">
不起作用;)
更新2:
我在侧面项目中复制了你的东西,你有两个问题:
第一个问题是你的Style中的ItemTemplate setter会触发StackOverflow异常(多么具有讽刺意味;))。删除ContentPresenter,删除整个模板或使用密钥。
第二个问题是GetContainerForItemOverride
方法。删除此方法将在屏幕上显示内容!
这是我的代码:
public sealed class WorkSheet : ItemsControl
{
/// <inheritdoc />
protected override bool IsItemItsOwnContainerOverride(object item)
{
return (item is WorkTile);
}
}
带有样式的窗口的xaml:
<Window x:Class="WpfApplication8.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication8="clr-namespace:WpfApplication8"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style TargetType="{x:Type WpfApplication8: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>
</Style>
</Window.Resources>
<Grid>
<WpfApplication8:WorkSheet x:Name="sheet" />
</Grid>
</Window>