当使用ItemsControl ItemsControl.ItemsPanel设置为Canvas时,ContenPresenter进入并破坏了我在[WPF]上的Canvas属性

cod*_*oop 16 wpf canvas itemscontrol

我正在使用ItemsControl,其中ItemsPanel设置为Canvas(有关更多背景信息,请参阅问题).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>
Run Code Online (Sandbox Code Playgroud)

注意Button上的Canvas.Left属性.这就像魅力一样,Button位于ItemsControl左侧500像素的位置.大!

但是,当我定义与List的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> 
Run Code Online (Sandbox Code Playgroud)

通过在运行时检查应用程序,我看到了一个区别.在Canvas和按钮之间添加了容器ContentPresenter.

如何在ContentPresenter本身上设置Canvas.Left属性?或者有另一种方法可以解决这个问题吗?

谢谢大家!

Lia*_*amV 25

可以使用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>
Run Code Online (Sandbox Code Playgroud)


Mar*_*ser 4

我想到了几种解决方案:

  1. 使用布局/渲染转换而不是附加属性
  2. 使用边距而不是附加属性
  3. 从 ItemsControl 派生,并覆盖子容器的生成方式。(GetContainerForItemOverride、IsItemItsOwnContainerOverride)。本文很好地解释了它的工作原理:http://drwpf.com/blog/2008/07/20/itemscontrol-g-is-for-generator/