WPF ListBox Width / MaxWidth - PullRequest
       8

WPF ListBox Width / MaxWidth

3 голосов
/ 30 июня 2009

У меня есть ListBox с привязкой к данным с настройкой DataTemplate. DataTemplate содержит элемент управления Grid с двумя значениями ширины столбца Auto и *. Мне бы хотелось, чтобы этот столбец всегда заполнял ListBoxItem и никогда не выходил за пределы элемента управления LisBox, чтобы сделать горизонтальную полосу прокрутки видимой.

Я могу привязать MaxWidth к сетке DataTemplate, используя:

MaxWidth="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=ActualWidth}"

Это лучший способ сделать это?

У меня также есть настройка ItemContainerStyle к следующему. Триггеры были удалены, чтобы сделать код меньше и легче для чтения.

<Style x:Key="ListBoxItemContainer" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Padding" Value="3"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border x:Name="Border" BorderBrush="{x:Null}" CornerRadius="4" BorderThickness="1" Margin="1">
                    <Border x:Name="InnerBorder" BorderBrush="{x:Null}" CornerRadius="4" BorderThickness="1">
                        <ContentPresenter x:Name="ContentPresenter" Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                    </Border>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 Ответ

10 голосов
/ 30 июня 2009

Вы хотите избегать привязки к ActualWidth и ActualHeight, когда это возможно, для повышения эффективности. 90% времени вы пропускаете встроенную функциональность, если обнаружите, что привязываетесь к любому из этих свойств (хотя есть редкие исключения, в которых это имеет смысл).

Чтобы выполнить то, что вы хотите, вам просто нужно отключить горизонтальную полосу прокрутки ListBox следующим образом:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" />

Это ограничит горизонтальную комнату, выделенную каждому ListBoxItem, тем самым позволяя динамическим столбцам * быть определенным как оставшееся пространство.

...