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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top