375

ListItems をオレンジ色の背景で Listbox の全幅に拡張したいと考えています。

現在、FirstName + LastName の幅しかありません。

可能なすべての要素を次のように設定しました: Horizo​​ntalAlignment="Stretch".

ユーザーが Listbox を拡大すると、ListboxItems の背景を拡大したいので、絶対値を入れたくありません。

ListBoxItems の背景色が ListBox の幅いっぱいになるようにするにはどうすればよいですか?

<Window x:Class="TestListBoxSelectedItemStyle.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestListBoxSelectedItemStyle"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>
        <local:CustomerViewModel x:Key="TheDataProvider"/>

        <DataTemplate x:Key="CustomerItemTemplate">
            <Border CornerRadius="5" Background="Orange" HorizontalAlignment="Stretch" Padding="5" Margin="3">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" Width="Auto">
                    <TextBlock HorizontalAlignment="Stretch">
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0} {1}">
                            <Binding Path="FirstName"/>
                            <Binding Path="LastName"/>
                        </MultiBinding>
                    </TextBlock.Text>
                    </TextBlock>
                </StackPanel>
            </Border>
        </DataTemplate>

    </Window.Resources>

    <Grid>
        <ListBox ItemsSource="{Binding Path=GetAllCustomers, Source={StaticResource TheDataProvider}}"
                 ItemTemplate="{StaticResource CustomerItemTemplate}"/>
    </Grid>
</Window>
4

6 に答える 6

661

私は両方の投稿に遭遇したので、ここで別の解決策を見つけました...

これはMylesの回答によるものです。

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 

これは私のために働いた。

于 2010-05-27T19:30:46.520 に答える
503

これは重複していると確信していますが、同じ答えの質問が見つかりません。

リストボックスに追加HorizontalContentAlignment="Stretch"します。これでうまくいくはずです。HorizontalAlignmentオートコンプリートは間違えやすいので気をつけてください。

于 2009-05-08T08:44:12.617 に答える
78

アイテムの幅が よりも広いListBox場合、ここでの他の回答は役に立ちません。 のアイテムはItemTemplateよりも幅が広いままListBoxです。

私にとってうまくいった修正は、水平スクロールバーを無効にすることでした。これは、明らかに、これらすべてのアイテムのコンテナーにリストボックスと同じ幅だけを残すように指示します.

したがって、リスト ボックスと同じ幅の ListBox 項目を取得するための組み合わせた修正は、それらが小さくてストレッチが必要か、幅が広くて折り返しが必要かを問わず、次のようになります。

<ListBox HorizontalContentAlignment="Stretch" 
         ScrollViewer.HorizontalScrollBarVisibility="Disabled">

スクロールバーのアイデアのクレジット

于 2012-08-23T16:44:00.010 に答える
0

私も同じ問題を抱えていました。簡単な回避策として、追加されるパディングの量を判断するためにブレンドを使用しました。私の場合は 12 だったので、負のマージンを使用してそれを取り除きました。これで、すべてを適切に中央に配置できるようになりました

于 2016-10-17T10:33:18.797 に答える
0

私にとっての修正は、r..内でプロパティHorizontalAlignment="Stretch"を設定することでした。ItemsPresenterScrollViewe

これが誰かに役立つことを願っています...

<Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}" HorizontalAlignment="Stretch">
                        <ItemsPresenter  Height="252" HorizontalAlignment="Stretch"/>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
于 2016-02-17T13:02:43.263 に答える
0

境界線は視覚的な外観のためだけに使用されるため、ListBoxItem の ControlTemplate に配置して、そこでプロパティを変更できます。ItemTemplate には、StackPanel と TextBlock のみを配置できます。このようにして、コントロールの外観は ControlTemplate によって制御され、表示されるデータは DataTemplate によって制御されるため、コードもクリーンなままになります。

于 2015-02-08T22:53:16.947 に答える