Frage

Ich habe eine ListBox in einem PopupControl. Das Problem ist, dass beim Scrollen, Popup ändert die Größe das tatsächliche größte Element passen.

Wie kann ich diese Größenanpassung vermeiden und automatisch auf das breiteste Element in der gesamten Liste einstellen?

Ich habe versucht, es in einem Grid zu setzen, aber ohne Erfolg.

War es hilfreich?

Lösung

Wenn Sie virtualisieren auf behalten möchten, können Sie die Popup.Width auf eine Konstante gesetzt.

Natürlich das Recht konstant zu holen, werden Sie (oder zumindest erraten) berechnen müssen, wie weit jeder ListBoxItem sein wird, und den max holen. ... In der Regel ist es nicht zu schwer, eine grobe Schätzung zu erhalten, basierend auf dem Inhalt.

Andere Tipps

ok das ist die Lösung: Das Hinzufügen dieser Eigenschaft

<ListBox VirtualizingStackPanel.IsVirtualizing="False"

Die Redimensionierung stoppt, weil nun das Gremium alle Elemente enthält und die Breite eingestellt wird Wahrung der breiteste. Mit Virtualisieren-Panel, dann ist es nur ein Teil der Objekte angezeigt und die List-Box paßt die widht des eigentlichen sichtbar breiteste Element.

Disadvantade ist, dass wir nicht verwenden Virtualisieren-Panel mehr (das ist standardmäßig auf)

Ich habe in das exakt gleiche Problem wie weiter oben beschrieben - meine ListBox würde virtualisieren, weil sie damit beschäftigt Layouten in einer resizable PopUp Kontrolle wären. Die Lösung, die ich gefunden habe, ist die MaxWidth und MaxHeight des Grid zu begrenzen, die die ListBox enthält. Meine PopUp Kontrolle ist noch resizable mit einem Griff - es ist einfach nicht unbegrenzt in dem Raum, der sie in Anspruch nehmen kann - ich denke, das ist eine einfache Lösung beenden zu implementieren, sobald es bekannt ist, das Problem zu beheben: -)

Ich weiß, die ListBox virtualisieren, da eine Abfrage mit etwa 18.000 Elementen in 1-2 Sekunden beantwortet wird anstelle von 30-60 Sekunden und Scrollen sind schnell statt eingefroren.

<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>

Die meisten WPF UIElement Kontrollen haben eine Width Eigenschaft, die auf „Auto“ eingestellt werden können, so dass sie so viel Platz wie ihre breiteste Element aufzunehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top