WPF listagem largura fixa
Pergunta
Eu tenho um ListBox
em um PopupControl
. O problema é que, enquanto rolagem, redimensiona Popup
para caber o mais vasto elemento real.
Como posso evitar esse redimensionamento e ajustar automaticamente para o maior elemento em toda a lista?
Eu tentei colocá-lo em um Grid
mas sem sucesso.
Solução
Se você quiser manter a virtualização, você pode definir o Popup.Width
a uma constante.
Claro que, para escolher a constante direita, você vai ter que calcular (ou pelo menos palpite) como largura cada ListBoxItem
será, e escolher o máx. ... Normalmente não é muito difícil de obter uma estimativa aproximada, com base no seu conteúdo.
Outras dicas
ok esta é a solução: adicionando esta propriedade
<ListBox VirtualizingStackPanel.IsVirtualizing="False"
O redimensionamento pára porque agora o Painel contém todos os elementos e a largura é ajustada respeitando o mais vasto um. Com Painel Virtualizing, é apenas uma parte de itens exibidos eo ListBox ajusta a Largura para o maior elemento visível real.
Disadvantade é que não usamos Painel Virtualizing mais (que é padrão em)
Eu ter executado em exatamente o mesmo problema, como descrito acima - a minha caixa de listagem não iria Virtualizar porque seria ocupado layouting dentro de um controle PopUp redimensionável. A solução eu descobri é limitar o MaxWidth
e MaxHeight
da grade que contém o ListBox
. Meu controle PopUp
ainda é redimensionável com um aperto - não apenas a sua ilimitada no espaço pode levar até - Eu acho que isso é sair de uma solução fácil de implementar, uma vez conhecida esta pode corrigir o problema: -)
Eu sei que o ListBox
é virtualizar porque uma consulta com cerca de 18.000 elementos é respondida em 1-2 segundos em vez de 30-60 segundos e rolagem é rápido em vez de congelado.
<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>
controles UIElement
maioria WPF tem uma propriedade Width
que pode ser definido como "Auto
" para que eles ocupam tanto espaço como sua mais ampla elemento.