私は、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ツリービジュアライザーを使用して、これがおそらくの問題であることに気付きましたContentPresenter's ActualWidth。次のスクリーンショットは、Canvas.LeftandCanvas.Rightプロパティが正しく設定されて
いることを示しています。
ただし、ActualWidthプロパティは4に設定されています(StrokeThickness含まれているのRectangleは4です)。このレイアウトの問題はどのように解決できますか?
さらに、私は上記の私の声明を修正しなければなりません。をで囲むContentPresenterとBorder、正しい結果が得られません。代わりに、レイアウト全体が壊れているようです。
アップデート2
MSDNは次のように述べています。
子要素のCanvas.Rightオフセットは、親Canvasのサイズには影響しません。
それらを指定すると、添付されたプロパティCanvas.TopまたはCanvas.LeftがCanvas.BottomまたはCanvas.Rightプロパティよりも優先されます
したがって、幅を明示的に指定する必要があるようです。これは、適切なコンバーターでは小さな問題になるはずです。