具有定义的列和行的Grid的WPF样式?

时间:2019-05-31 13:32:16

标签: wpf templates styles

在我的应用程序中,我有很多这样的网格:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="20"/>
        <ColumnDefinition Width="40"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <!-- ... -->
</Grid>

它们有4列和3行,并且列宽设置为某个值。

我可以创建样式或其他模板来简化使用20个网格的窗口吗?

我知道,我可以为列定义一个一个地创建样式以避免在任何地方Width="10",但是有可能这样做吗?

<Grid Style="{StaticResource GridWith4ColumnsAnd3Rows}">
    <!-- ... -->
</Grid>

2 个答案:

答案 0 :(得分:0)

您不能在RowDefinitions中设置ColumnDefinitionsStyle属性,因为它们不是依赖项属性。

但是您可以创建一个自Grid继承的自定义类,并在构造函数中添加ColumnDefinitionsRowDefinition

public class CustomGrid : Grid
{
    public CustomGrid()
    {
        ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(10) });
        //...
        ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
    }
}

用法:

<local:CustomGrid>...</local:CustomGrid>

或者,您可以定义创建RowDefinitionsColumnDefinitions的{​​{3}}。

答案 1 :(得分:0)

好的答案在这里:

How to create reusable WPF grid layout

我在<ItemsPanel>内部使用了Grid控件。

样式(在我的App.xaml中):

<Style x:Key="SchedulerFieldGridStyle1" TargetType="ItemsControl" >
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Grid Background="LightSteelBlue" Margin="4">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

MainWindow.xaml的一部分,之前

<Grid Background="LightSteelBlue" Margin="4">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Label Grid.ColumnSpan="4" Content="Day of week"/>
    <Label Grid.Column="0" Grid.Row="1" Content="From"/>
    <ComboBox Grid.Column="1" Grid.Row="1" />
    <Label Grid.Column="2" Grid.Row="1" Content="To"/>
    <ComboBox Grid.Column="3" Grid.Row="1" />
</Grid>

MainWindow.xaml的一部分,之后:

<ItemsControl Style="{StaticResource SchedulerFieldGridStyle1}">
    <Label Grid.ColumnSpan="4" Content="Day of week"/>
    <Label Grid.Column="0" Grid.Row="1" Content="From"/>
    <ComboBox Grid.Column="1" Grid.Row="1"/>
    <Label Grid.Column="2" Grid.Row="1" Content="To"/>
    <ComboBox Grid.Column="3" Grid.Row="1"/>
</ItemsControl>