ItemTemplateがDataTemplateにバインドされたListBoxがあります。私の問題は、テンプレート内の要素をリストボックスの全幅に拡大できないことです。
<ListBox x:Name="listPeople" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
Margin="0,0,0,0" Background="{x:Null}" SelectionMode="Extended" Grid.Row="1"
ItemTemplate="{StaticResource PersonViewModel.BrowserDataTemplate}"
ItemsSource="{Binding Mode=OneWay, Path=SearchResults}" >
</ListBox>
<DataTemplate x:Key="PersonViewModel.BrowserDataTemplate">
<ListBoxItem HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5,5,5,5">
<Border Opacity=".1" x:Name="itemBorder" Background="#FF000000"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
CornerRadius="5,5,5,5" MinWidth="100" Height="50"/>
</Grid>
</ListBoxItem>
</DataTemplate>
ご覧のとおり、テンプレートの幅を示すためにグリッド内に境界線を追加しました。私の目標は、この境界線がリストボックスの全幅に拡大することを確認することです。現在、その幅はその内容またはMinWidthによって決定されます。これは、現時点で表示されている唯一のものです。
ListBoxのデータテンプレートを作成するときは、<ListBoxItem>
を含めないでください。 DataTemplateのコンテンツは、生成されたコンテナ内に配置されます。 ItemContainerStyleを使用して、そのコンテナーの構築方法を制御できます。
ListBoxItemのデフォルトの制御スタイルは、デフォルトでItemContainerStyleを定義するために使用されます。このスタイルは、ListBoxItem.HorizontalContentAlignmentプロパティを「Left」に設定します。 ContentPresenterがHorizontalAlignmentをこのプロパティにバインドする方法に注目してください。
ListBoxにバインドするときに生成されるListBoxItemコンテナのスタイルを上書きする必要があります。これは、ItemContainerStyleを設定することで実行できます。 HorizontalContentAlignmentプロパティを「Stretch」に設定します。
以下は、デフォルトのListBoxItemスタイルです。参考のために含まれています。
<Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
<Setter Property="Padding" Value="3"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Top"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="TabNavigation" Value="Local"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid Background="{TemplateBinding Background}">
<!-- VSM excluded for readability -->
<Rectangle x:Name="fillColor" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
<Rectangle x:Name="fillColor2" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
<ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
<Rectangle x:Name="FocusVisualElement" Stroke="#FF6DBDD1" StrokeThickness="1" RadiusX="1" RadiusY="1" Visibility="Collapsed"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
私はこれを解決するために1時間を費やしました。非常に苛立たしい。あなたしないでください ListBoxItemのデフォルトスタイル全体を上書きする必要があります。これを機能させることができませんでした。最終的に、ListBox.ItemContainerStyleセクションのHorizontalContentAlignmentプロパティのみをオーバーライドすることで問題を解決しました。例:
<ListBox x:Name="ClassList" ItemsSource="{Binding LineClasses}"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionMode="Extended"
ScrollViewer.HorizontalScrollBarVisibility="Hidden" HorizontalContentAlignment="Stretch"
HorizontalAlignment="Stretch" Loaded="ClassList_Loaded"
VerticalAlignment="Stretch" Grid.Row="0">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" CornerRadius="3" Background="#FFE88D34"
BorderThickness="1" HorizontalAlignment="Stretch" >
<Grid Background="Transparent" HorizontalAlignment="Stretch" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0" HorizontalAlignment="Stretch"
Margin="2"
FontSize="10"
Text="{Binding DisplayClassNm}"/>
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
これは私にとっておやつでした。
マイルズ
ここ は、リストボックスコントロールにコントロールテンプレートとデータテンプレートを使用する例です。リストボックスアイテムの境界を超えるXAMLマークアップを参照してください。
VS2012でSilverlight5を使用しています。同じ問題が発生します。独自のカスタムオブジェクトをItemsSourceとして持つ水平リストボックスがあります。リストボックスの項目を拡張したい。しかし、彼らは拡大していません。すべてのリストボックスアイテムにハードコードされた幅を指定したくありません。ここですべての答えを試しましたが、何も機能しません。 ItemsSource = {Binding Persons} DisplayMemberPath = "FirstName"を指定しました。それで全部です
ListBoxItemにCheckBoxが含まれていて、上記のソリューションが機能しませんでした(おそらく、これらのソリューションではなく、CheckBoxの性質が原因です)。チェックボックスの「Content」プロパティにバインドしないことで、この機能を強制できましたが、 XAMLインラインを明示的に定義する:
<CheckBox HorizontalAlignment="Stretch" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}">
<TextBlock
MinWidth="130"
Margin="0,-2,0,0"
HorizontalAlignment="Stretch"
Text="{Binding Path=DisplayText}" />
</CheckBox>
TextBoxのテキストがCheckBoxのチェックマークと一致しなかったため、マージンが必要です。 MinWidthも必要でした。