我有一个ListBox
,它基本上是一个画布。项目应显示为Rectangles
。矩形的位置通过ListBoxItem's
Canvas.Left
andCanvas.Right
属性绑定到项目的数据。
这是ListBox'
Template
,它生成Canvas
:
<ListBox.Template>
<ControlTemplate>
<Canvas IsItemsHost="True"/>
</ControlTemplate>
</ListBox.Template>
ListBox'
ItemContainerStyle
设置项目的位置:
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Canvas.Left">
<Setter.Value>
<MultiBinding Converter="{StaticResource ...}">
...
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="Canvas.Right">
<Setter.Value>
<MultiBinding Converter="{StaticResource ...}">
...
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
这实际上有效。当我ContentPresenter
用边框包围时,边框具有正确的位置和大小。
现在,矩形Width
应该等于ListBoxItem's
实际宽度。所以ItemTemplate
看起来像这样:
<DataTemplate>
<Rectangle Height="..."
Width="{Binding ActualWidth,
RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}}"
Fill="..."/>
</DataTemplate>
但是应用此绑定后,矩形永远不会显示。当我设置一个恒定的宽度时,一切都会正确呈现。
有没有办法在 中设置矩形的位置Canvas
?
更新
使用 WPF Tree Visualizer 我意识到这可能是ContentPresenter's
ActualWidth
. 以下屏幕截图显示Canvas.Left
andCanvas.Right
属性设置正确:
但是,该ActualWidth
属性设置为 4(StrokeThickness
包含的Rectangle
是 4)。如何解决这个布局问题?
此外,我必须修改我的上述陈述。ContentPresenter
用 a包围Border
不会产生正确的结果。相反,整个布局似乎已损坏。
更新 2
MSDN 说如下:
子元素的 Canvas.Right 偏移量不会影响父 Canvas 的大小。
如果您指定它们,附加属性 Canvas.Top 或 Canvas.Left 优先于 Canvas.Bottom 或 Canvas.Right 属性
所以看来我必须明确指定宽度,这应该是适当转换器的一个小问题。