Правильная настройка ширины виртуального списка в WPF

#wpf #listbox #virtualization

#wpf #список #виртуализация

Вопрос:

У меня есть список WPF, который виртуализирован с большим количеством строк. Размер списка изменяется по мере прокрутки объектов. Я пытался:

 <Setter Property="MinWidth" Value="{Binding Path=ExtentWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollViewer}}}" />
  

К сожалению, у меня недостаточно репутации, чтобы публиковать фотографии проблемы, но в основном, когда я прокручиваю виртуальный список, ширина поля меняется по мере появления более длинных элементов. Я полагаю, что мог бы попытаться измерить самую длинную строку в codebehind и установить ширину в это значение, но я надеюсь, что есть более чистое решение.

Вот мой текущий шаблон управления (без кубиков):

         <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <Border x:Name="ListItemContainer"
                             MinWidth="{Binding Path=ExtentWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollViewer}}}"
                            BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter></ContentPresenter>                                               
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">                            
                            <Setter Property="Background" TargetName="ListItemContainer" Value="{DynamicResource AxisValueSelectedBackground}"/>
                            <Setter Property="Foreground" Value="{DynamicResource AxisValueSelectedForeground}"/>
                        </Trigger>

                        <Trigger Property="IsSelected" Value="false">
                            <Setter Property="Background" TargetName="ListItemContainer" Value="{DynamicResource AxisValueBackground}"/>
                            <Setter Property="Foreground" Value="{Binding IsEnabled, Converter={StaticResource AxisValueForegroundConverter}}" />
                            <Setter Property="FontStyle" Value="{Binding IsEnabled, Converter={StaticResource AxisValueFontStyleConverter}}" />
                        </Trigger>

                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsAxisSelected}" Value="True"/>
                                <Condition Binding="{Binding IsAxisValueSelected}" Value="False"/>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Background" TargetName="ListItemContainer" Value="White" />
                        </MultiDataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
  

Альтернативный текст
Альтернативный текст

Ответ №1:

Попробуйте тот же трюк с относительной привязкой, но внутри самого внешнего элемента вашей DataTemplate (возможно, сетки). Таким образом, все элементы будут одинакового размера.