WPF ListBox фиксированная ширина - PullRequest
2 голосов
/ 17 июля 2009

У меня есть ListBox в PopupControl. Проблема в том, что во время прокрутки Popup изменяет размеры чтобы соответствовать самому широкому элементу.

Как мне избежать этого изменения размера и автоматически настроить на самый широкий элемент во всем списке?

Я пытался поместить его в Grid, но безуспешно.

Ответы [ 4 ]

6 голосов
/ 17 июля 2009

хорошо, это решение: добавление этого свойства

<ListBox VirtualizingStackPanel.IsVirtualizing="False"

Изменение размера прекращается, потому что теперь панель содержит все элементы и ширина отрегулирована уважая самый широкий. С панелью виртуализации отображается только часть элементов, а ListBox настраивает виджет на фактический видимый самый широкий элемент.

Недостатком является то, что мы больше не используем Панель виртуализации (которая по умолчанию включена)

1 голос
/ 17 июля 2009

Если вы хотите продолжать виртуализацию, вы можете установить Popup.Width на постоянную величину.

Конечно, чтобы выбрать правильную константу, вам нужно будет вычислить (или хотя бы угадать), какова будет ширина каждого ListBoxItem, и выбрать макс. ... Обычно на основе вашего контента нетрудно получить приблизительное предположение.

0 голосов
/ 14 января 2019

Я столкнулся с точно такой же проблемой, как описано выше - мой ListBox НЕ будет виртуализироваться, потому что он будет занят макетом внутри изменяемого размера элемента управления PopUp. Решение, которое я нашел, состоит в том, чтобы ограничить MaxWidth и MaxHeight Сетки, которая содержит ListBox. Мой PopUp элемент управления по-прежнему можно изменять с помощью Grip - он просто не безграничен в пространстве, которое он может занять - я думаю, что это простое решение для реализации, как только станет известно, что это может решить проблему: -)

Я знаю, что ListBox виртуализируется, потому что на запрос, содержащий около 18 000 элементов, отвечают в течение 1-2 секунд вместо 30-60 секунд, а прокрутка выполняется быстрее, а не замораживается.

<Popup x:Name="PART_Popup"
       AllowsTransparency="true"  
       PlacementTarget="{Binding ElementName=PART_ContentHost}"                                   
       Placement="Bottom"                                                        
       IsOpen="{Binding IsPopupOpened, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"                                     
       PopupAnimation="None"
       Focusable="False"
       StaysOpen="True"
    >
    <Border BorderBrush="{TemplateBinding PopupBorderBrush}"
            BorderThickness="{TemplateBinding PopupBorderThickness}"
            Background="{DynamicResource {x:Static reskeys:ResourceKeys.ControlPopupBackgroundBrushKey}}"  
            >
        <!-- Do NOT REMOVE MaxHeight and MaxWidth
             These ensure that containing ListBox is virtualizing -->
        <Grid x:Name="PART_ResizeableGrid" Background="Transparent"
              MaxHeight="600"
              MaxWidth="600"
              >
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <Border
                x:Name="DropDownBorder"
                Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"  
                Width="{Binding ActualWidth, ElementName=PART_ContentHost}"                                             
                Height="{Binding ActualHeight, ElementName=PART_ContentHost}"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                Grid.RowSpan="2"
                BorderThickness="0"
                />

            <ListBox
                x:Name="PART_ItemList" Grid.Row="0"
                HorizontalAlignment="Stretch" VerticalAlignment="Top"
                ItemsSource="{Binding Suggestions, RelativeSource={RelativeSource TemplatedParent}}"
                BorderThickness="0"
                ItemTemplate="{TemplateBinding ItemTemplate}"
                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"                                                             
                Template="{DynamicResource {x:Static reskeys:ResourceKeys.PopListBoxControlTemplate}}"
                ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                ScrollViewer.VerticalScrollBarVisibility="Auto" 
                ScrollViewer.CanContentScroll="True"

                DisplayMemberPath="{TemplateBinding DisplayMemberPath}"
                SelectedValuePath="{TemplateBinding ValuePath}"

                KeyboardNavigation.AcceptsReturn="True"
                KeyboardNavigation.DirectionalNavigation="Cycle"

                BorderBrush="{TemplateBinding BorderBrush}"
                VirtualizingPanel.IsVirtualizing="True"
                VirtualizingPanel.VirtualizationMode="Recycling"
                ScrollViewer.IsDeferredScrollingEnabled="True"
                />

            <!-- RezizeGrip Thumb to support resizing the suggestion lib -->
            <Thumb x:Name="PART_ResizeGripThumb"
                   Grid.Row="0"
                   Style="{DynamicResource {x:Static reskeys:ResourceKeys.ResizeGripStyleKey}}"
                   HorizontalAlignment="Right"
                   VerticalAlignment="Bottom"
                   Margin="0"
                   Background="Transparent"
                   Width="16"
                   Height="16" />
        </Grid>
    </Border>
</Popup>
0 голосов
/ 17 июля 2009

Большинство элементов управления WPF UIElement имеют свойство Width, которое можно установить на "Auto", поэтому они будут занимать столько же места, сколько и их самый широкий элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...