Frage

Ich habe eine ListBox, die ein Raster in seiner Vorlage 4 Spalten zu ermöglichen hat. Eine Spalte ist der eigentliche Text der ListBox. Ich möchte, dass Spalte der verfügbaren horizontalen Raum zu füllen.

Die Spaltendefinitionen sind:

<ControlTemplate TargetType="ListBoxItem">
    <Grid ScrollViewer.CanContentScroll="True" Margin="2">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20" />
            <ColumnDefinition Width="50" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="30" />
        </Grid.ColumnDefinitions>
        <CheckBox VerticalAlignment="Center" Grid.Column="0" IsChecked="{Binding IsSelected,
                  RelativeSource={RelativeSource TemplatedParent},
                  Mode=TwoWay}" />
        <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="{Binding Id}" />
        <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="{Binding Title}" />
        <Button HorizontalAlignment="Right" Grid.Column="3" Tag="{Binding Id}" Margin="5,0,5,0">-&gt;</Button>
    </Grid>
</ControlTemplate>

Ich habe mehrere Permutationen dieser versucht und nichts wird es im Fenster bis auf eine explizite Größe Einstellung zu beheben bekommen. Dann, wenn ich die Größe des Fensters ist es nicht mit ihr ändern.

Die ListBox in einem ScrollViewer gewickelt vertikales Scrollen zu ermöglichen (ich vermute, das ist, was mir vermasselt.)

Alle Ideen, wie die dritte Spalte erhält nur den verfügbaren Speicherplatz zu füllen und nicht mehr?

War es hilfreich?

Lösung 4

ich das endlich herausfinden.

Das enthält Listenfeld benötigt, um die horizontale Bildlaufleiste auf wie folgt deaktiviert:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 

Sobald ich tat, dass das Gitter dimensioniert perfekt.

Eines Tages werde ich herausfinden, wie das alles „deklarative Sachen“ funktioniert.

Andere Tipps

Sie benötigen die Steuerverhalten von ListBox, oder verwenden Sie es für das Layout nur.

Wenn Sie es nur für das Layout verwenden, können Sie die ListBox für eine ItemsControl innerhalb eines ScrollViewer tauschen könnte.

Dieser Code (schlachtete in Designer arbeiten) zeigen dies:

<ScrollViewer>
    <ItemsControl>
        <!--<ListBox>-->
        <Grid Margin="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20" />
                <ColumnDefinition Width="50" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="30" />
            </Grid.ColumnDefinitions>

            <CheckBox VerticalAlignment="Center" Grid.Column="0" IsChecked="True" />
            <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="Id" />
            <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="Title" />
            <Button HorizontalAlignment="Right" Grid.Column="3" Margin="5,0,5,0">-&gt;</Button>
        </Grid>
        <!--</ListBox>-->
    </ItemsControl>
</ScrollViewer>

Die ListBox hat eine Eigenschaft Breite des Tötens auf seine Kinder, wie ein TreeView tut. Also, wenn Sie es mit vermeiden können, nur für das Layout Gründen kann dies die schnellsten Optionen sein.

Ansonsten müssen Sie die Breite Databind von Ihnen auf die Breite des Dummy-Objekt außerhalb des Grid ListView, aber die unordentlichen Partei mit der Breitenänderung zu tun hat als die Scrollbar erscheint / verschwindet.

Warum brauchen Sie die List-Box in einem Scrollviewer wickeln? Die List-Box zeigt automatisch die Scroll, wenn sein Inhalt in dem verfügbaren Raum passen. Sie können es aus dem XAML entfernen und es sollte noch in Ordnung arbeiten. Immerhin hat es für mich. :)

Ich habe versucht, Ihre Control aus und es schien wirklich gut zu funktionieren. Das Problem ist, dass, während die dritte Spalte der Breite der List-Box paßt die Größe, wenn der Text in der dritten Spalte sehr lang ist, die vierte Spalte wird nicht angezeigt, bis die gesamte Text sichtbar ist.

Ich habe auch versucht, eine andere Layout-Methode, die ich nicht sicher Performance-weise bin, aber die Idee war es, ein DockPanel anstelle einem Grid zu verwenden. Ich fügte hinzu, die dritte Spalte zuletzt in der XAML, um es den verbleibenden Platz zu machen zu füllen, und koppelte es auf der linken Seite (ich die vierte Spalte rechts dockt). Es wäre immer noch die gesamte Zeichenfolge in der dritten Spalte angezeigt werden soll. Ich weiß nicht, warum dies geschieht, und warum der Text nicht umgebrochen oder ein Auslassungszeichen verwenden, wenn der zur Verfügung stehende Raum nicht genug für den Text ist angezeigt werden.

<Window.Resources>
    <Style TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <DockPanel Width="Auto">
                        <CheckBox Width="20" VerticalAlignment="Center" DockPanel.Dock="Left" IsChecked="{Binding IsSelected,
                                        RelativeSource={RelativeSource TemplatedParent},
                                        Mode=TwoWay}" />
                        <TextBlock Width="50" VerticalAlignment="Center" DockPanel.Dock="Left" Margin="5,0,5,0" Text="hi" />
                        <Button Width="30" HorizontalAlignment="Right" DockPanel.Dock="Right" Margin="5,0,5,0">-&gt;</Button>
                        <TextBlock VerticalAlignment="Center" DockPanel.Dock="Left" Margin="5,0,5,0" Text="afdjfksdhahjklfadshjlasffasdlhjsafdlhjasdfasfhdjlaslfhdjsfdhjlsfdlhjsfdhjsfdddsd" TextTrimming="CharacterEllipsis" TextWrapping="WrapWithOverflow" />
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>   

Ja, ich würde das Scroll-Betrachter vorschlagen wird verwirren Sie auf, Sie könnten der Grid Breite an die Mutter binden tatsächliche Breite Objekte, so gibt es eine definierte Größe, in der die * hat tatsächlich zu füllen.

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