11 Stimmen

Wie kann ich erreichen, dass meine Rasterspalten immer die gleiche Breite haben?

Wenn ich die Breite der Säule auf * Wenn aber ein Element größer ist als der zulässige Wert, wird die Breite der Spalte gestreckt.

Wie kann ich mein Grid dazu zwingen, die gleiche Größe der Spalten beizubehalten, ohne explizit eine Größe zu definieren?

Ich kann kein UniformGrid verwenden, da dieses Raster in einem ItemsControl verwendet wird und die Items in bestimmten Bereichen platziert werden müssen. Grid.Row / Grid.Column Flecken

bearbeiten Hier ist ein Beispiel für meinen aktuellen Code.

<DockPanel>

    <!-- Not showing code here for simplicity -->
    <local:ColumnHeaderControl DockPanel.Dock="Top" />
    <local:RowHeaderControl DockPanel.Dock="Left" />

    <ItemsControl ItemsSource="{Binding Events}">
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Column" 
                        Value="{Binding DueDate.DayOfWeek, 
                            Converter={StaticResource EnumToIntConverter}}" />
            </Style>
        </ItemsControl.ItemContainerStyle>

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ItemsPanel>
    </ItemsControl>

</DockPanel>

Bearbeiten #2 Hier ist meine endgültige Lösung. Es macht die Spalten die richtige Größe, und es hält die Größe korrekt, wenn die Anwendung Größe geändert wird.

<ColumnDefinition Width="{Binding 
    ElementName=RootControl, 
    Path=ActualWidth, 
    Converter={StaticResource MathConverter}, 
    ConverterParameter=(@VALUE-150)/7}" />

150 ist die Breite der Zeilenüberschriften + alle Ränder und Umrandungen. Ich bin gerade dabei, meine Website zu aktualisieren. MathConverter zu einer IMultiValueConverter so dass ich beide Parameter binden kann (Wenn Sie am Code des Konverters interessiert sind, finden Sie ihn unter aquí (obwohl es sich nur um den Einwertkonverter handelt)

16voto

Louis Kottmann Punkte 15637

Das könnten Sie:

1) Hardcode einer Größe in DIP:

<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
...

2) Verwenden Sie SharedSizeGroup, es nimmt ein char

<ColumnDefinition SharedSizeGroup="A" />
<ColumnDefinition SharedSizeGroup="A" />
...

Sie können mehr darüber lesen aquí

5voto

msmucker0527 Punkte 5086

Sie könnten versuchen, die Breite Ihrer Spalten an eine Eigenschaft zu binden, die die Gesamtbreite des Fensters durch die Anzahl der Spalten teilt

3voto

Johan Larsson Punkte 16314

Der sauberste Weg ist die Verwendung einer UniformGrid wie diese:

<UniformGrid Rows="1">
    <Rectangle Fill="Blue" />
    <Rectangle Fill="Yellow" />
    <Rectangle Fill="Red" />
</UniformGrid>

Besonders schön bei Verwendung als ItemsPanel .

1voto

Bence Végert Punkte 668

Probieren Sie die IsSharedSizeScope-Funktion des Grids aus:

<StackPanel Margin="15" Grid.IsSharedSizeScope="True">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="Col 1"/>
        <TextBox Grid.Column="1" />
        <TextBlock Grid.Column="2" Text="3rd column here"/>
    </Grid>

    <Separator Margin="0,20"/>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition />
            <ColumnDefinition SharedSizeGroup="B"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="1"/>
        <TextBox Grid.Column="1"/>
    </Grid>
</StackPanel>

Ich hoffe, es hilft.

Eine ausführliche Beschreibung finden Sie unter diesem Link: https://wpf.2000things.com/tag/sharedsizegroup/

0voto

loxxy Punkte 12720

Ich habe es nicht ausprobiert, aber ich denke, das sollte funktionieren:

XAML:

<ColumnDefinition Width="*" Loaded="ColumnDefinition_Loaded"/>

C#:

private void ColumnDefinition_Loaded(object sender, RoutedEventArgs e)
        {
            ((ColumnDefinition)sender).MaxWidth = ((ColumnDefinition)sender).ActualWidth;
        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X