WPF ListBox larghezza fissa
Domanda
Ho un ListBox
in un PopupControl
. Il problema è che durante lo scorrimento, Popup ridimensiona
per adattare l'elemento effettivo più ampio.
Come posso evitare questo ridimensionamento e regolare automaticamente l'elemento più ampia in tutta la lista?
Ho provato a metterlo in un Grid
ma senza successo.
Soluzione
Se si desidera mantenere la virtualizzazione, è possibile impostare il Popup.Width
a una costante.
Naturalmente, per scegliere il giusto costante, dovrete calcolare (o almeno indovinare) la larghezza di ogni ListBoxItem
sarà, e scegliere il max. ... Di solito non è troppo difficile ottenere un occhio e croce, in base al contenuto.
Altri suggerimenti
ok questa è la soluzione: L'aggiunta di questa proprietà
<ListBox VirtualizingStackPanel.IsVirtualizing="False"
Il ridimensionamento arresta perché ora il pannello contiene tutti gli elementi e la larghezza viene regolata rispettando la più ampia uno. Con Pannello di Virtualizzazione, è solo una parte di elementi visualizzati e il ListBox regola la widht per l'elemento effettivo visibile più ampia.
Disadvantade è, che non usiamo La virtualizzazione Pannello più (che è attiva per default)
ho incontrato lo stesso problema, come descritto in precedenza - la mia ListBox non avrebbe virtualizzare perché sarebbe occupato interfaccia grafica all'interno di un controllo PopUp ridimensionabile. La soluzione che ho trovato è quello di limitare il MaxWidth
e MaxHeight
della griglia che contiene il ListBox
. Il mio controllo PopUp
è ancora ridimensionabile con un Grip - non è solo illimitata nello spazio si può richiedere fino - credo che sia così smettere di una soluzione facile da implementare una volta che si sa questo può risolvere il problema: -)
So che il ListBox
è virtualizzando perché una query con circa 18.000 elementi di soluzione 1-2 secondi invece di 30-60 secondi e lo scorrimento è rapido al posto di surgelati.
<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>
La maggior parte dei controlli UIElement
WPF hanno una proprietà Width
che può essere impostato su "Auto
" in modo che si occupano tanto spazio quanto il loro elemento più largo.