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