我正在使用 ItemsControl,其中 ItemsPanel 设置为 Canvas(有关更多背景信息,请参阅 this 问题)。 ItemsControl 正在按我想要的方式执行,并且通过将子元素放入 ItemsControl.Items 来手动添加子元素时,它的工作方式就像一个魅力:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Items>
<Button Canvas.Left="500" Content="Button Text" />
</ItemsControl.Items>
</ItemsControl>
注意按钮上的 Canvas.Left 属性。这就像一个 super 按钮,按钮放置在距 ItemsControl 左侧 500 像素的位置。太棒了!
但是,当我定义绑定(bind)到列表的 ItemsSource 时,Canvas.left 没有任何效果:
<ItemsControl ItemsSource="{Binding Elements}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Canvas.Left="500" Content="Button Text" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
通过在运行时检查应用程序,我发现了一个差异。容器 ContentPresenter 已添加到 Canvas 和按钮之间。
如何设置 ContentPresenter 本身的 Canvas.Left 属性?或者有其他方法可以解决这个问题吗?
谢谢大家!
最佳答案
可以使用 ItemContainerStyle 设置 Canvas.Left 属性:
<ItemsControl ItemsSource="{Binding Elements}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="Button Text" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="500" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
关于wpf - 当使用 ItemsControl ItemsControl.ItemsPanel 设置为 Canvas 时,ContenPresenter 会出现并破坏子项上的 Canvas 属性 [WPF],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2415580/