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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top