我有一个名为WorkSheet的控件,它是ItemsControl的子类
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的子元素永远不会出现。我还尝试使用IsItemsHost="true"将Canvas放入ControlTemplate中-同样,没有任何项。有人知道我做错了什么吗?
同样,作为解释-我在表单上的按钮处理程序中放置了一个断点,并使用Visualizer查看可视化树。我得到的层次结构是:
WorkSheet -> Border -> ItemsPresenter ...下面什么都没有。
显然,这意味着使用了ControlTemplate,但从未调用过ItemsPanel。
发布于 2010-07-13 17:48:18
在你的ControlTemplate中也放置一个TargetType:
<ControlTemplate TargetType="{x:Type local:WorkSheet}">不工作;)
更新2:
我在一个辅助项目中复制了你的东西,你有两个问题:
第一个问题是您的风格中的ItemTemplate设置器,它将触发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>https://stackoverflow.com/questions/3235876
复制相似问题