Wpf:Grid:如何共享列/行的高度和宽度?
我有一个3列5行的网格:Wpf:Grid:如何共享列/行的高度和宽度?,wpf,Wpf,我有一个3列5行的网格: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Gri
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0">Gas Volume Fraction</Label>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=GasVolumeFraction}" MinWidth="40"></TextBox>
<Label Grid.Row="0" Grid.Column="2">-</Label>
<Label Grid.Row="1" Grid.Column="0">Density</Label>
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Path=Density}" MinWidth="40"></TextBox>
<Label Grid.Row="1" Grid.Column="2">kg/m3</Label>
<Label Grid.Row="2" Grid.Column="0" Content="Curve speed" Style="{StaticResource curveSpeed}" ></Label>
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=Density}" Style="{StaticResource curveSpeed}" MinWidth="40"></TextBox>
<Label Grid.Row="2" Grid.Column="2" Style="{StaticResource curveSpeed}">rpm</Label>
<WrapPanel Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3">
<RadioButton>Delta pressure</RadioButton>
<RadioButton>Head</RadioButton>
</WrapPanel>
<WrapPanel Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3">
<RadioButton>Efficiency</RadioButton>
<RadioButton>Power</RadioButton>
<RadioButton>Torque</RadioButton>
</WrapPanel>
</Grid>
气体体积分数
-
密度
千克/立方米
转速
三角洲压力
头
效率
权力
扭矩
文本框和单选按钮具有不同的空间要求,这使得行根据其内容呈现不同的高度。如何使行大小均匀,但不超过所需的大小?换句话说:对于包含文本框(我的网格中最大的元素)的行,我希望与设置height=“Auto”的高度相同,然后对所有行使用该高度。您可以使用绑定到最大文本块的实际宽度和实际高度
<Grid x:Name="grid" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="{Binding Path=ActualHeight, ElementName=biggestTB}"/>
<RowDefinition Height="{Binding Path=ActualHeight, ElementName=biggestTB}"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=biggestTB}"/>
<ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=biggestTB}"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" x:Name="biggestTB" Text="biggest textblock content" TextWrapping="Wrap"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="content" TextWrapping="Wrap"/>
</Grid>
理想情况下,您可以使用具有星形大小的行,并将网格设置为
VerticalAlignment=“Top”
,但不幸的是,当网格大小调整到其内容时,星形大小不起作用
不要使用单个栅格,而要对垂直布局使用栅格控件,对水平布局使用嵌套栅格控件。可以在内部轴网中的柱上设置尺寸,以便在柱之间共享柱尺寸
<UniformGrid Rows="5" VerticalAlignment="Top" Grid.IsSharedSizeScope="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition SharedSizeGroup="B"/>
<ColumnDefinition SharedSizeGroup="C"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0">Gas Volume Fraction</Label>
<TextBox Grid.Column="1" Text="{Binding Path=GasVolumeFraction}" MinWidth="40"></TextBox>
<Label Grid.Column="2">-</Label>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition SharedSizeGroup="B"/>
<ColumnDefinition SharedSizeGroup="C"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0">Density</Label>
<TextBox Grid.Column="1" Text="{Binding Path=Density}" MinWidth="40"></TextBox>
<Label Grid.Column="2">kg/m3</Label>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition SharedSizeGroup="B"/>
<ColumnDefinition SharedSizeGroup="C"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="Curve speed" Style="{StaticResource curveSpeed}"></Label>
<TextBox Grid.Column="1" Text="{Binding Path=Density}" Style="{StaticResource curveSpeed}" MinWidth="40"></TextBox>
<Label Grid.Column="2" Style="{StaticResource curveSpeed}">rpm</Label>
</Grid>
<WrapPanel>
<RadioButton>Delta pressure</RadioButton>
<RadioButton>Head</RadioButton>
</WrapPanel>
<WrapPanel>
<RadioButton>Efficiency</RadioButton>
<RadioButton>Power</RadioButton>
<RadioButton>Torque</RadioButton>
</WrapPanel>
</UniformGrid>
气体体积分数
-
密度
千克/立方米
转速
三角洲压力
头
效率
权力
扭矩
我知道这是一个老问题,但我会为任何在谷歌搜索时偶然发现这个问题的人解答
这个问题实际上有一个非常简单的解决方案,使用Quartermeister提到的SharedSizeScope
<Grid IsSharedSizeScope="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" SharedSizeGroup="groupName" />
<RowDefinition Height="Auto" SharedSizeGroup="groupName" />
<RowDefinition Height="Auto" SharedSizeGroup="groupName" />
</Grid.RowDefinitions>
...
</Grid>
...
只需确保将Grid.IsSharedSizeScope设置为true,并确保每个行定义都具有相同的SharedSizeGroup,并且行应该是自动且大小相同的。这也适用于列。我的问题与上述问题类似,但略有不同,因为无论是
IsSharedSizeScope
方法还是与ActualWidth的绑定,都无法为我解决此问题。因此,我发布了另一个解决方案,希望有人能发现这一点有用。所以,这里是我需要解决的问题:
我有一个应用程序,我有一个分割视图的控件——下面是蓝色部分——虽然我喜欢在显示器的中间有一个网格分割器,但是我想在单独的控件中实现蓝色部分,而它上面的部分应该在分离的组件中实现: …但是GridSplitter应该贯穿主视图并连接两个区域,而用户不知道实际的分离。我通过在拖动
TopSpliter
或MainSplitter
时设置列宽来实现这一点
这种方法没有性能惩罚,并且适用于“*”大小的列。
事实证明,同步两个或多个GridSplitter(如本例所示)实际上需要同步GridSplitter“调整大小”的列宽。拖动顶部或主拆分器,您将看到另一个区域的大小调整为一个拆分器:-)
那么你认为包装纸会发生什么呢?如果您限制了控件的高度,则它们必须有水平增长的空间。在绑定到ActualHeight和ActualWidth时要小心:在很多情况下,控件的动态大小调整可能会导致度量和排列过程中的性能降低循环。当您这样做时,那么所有的行是否都会变成最大的一行?@Dzyann:对于那些只需要高度而不需要贡献高度的行,您可以省略
Height=“Auto”
。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="3,3,3,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" Name="TopColumnA"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" Name="TopColumnB"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="AntiqueWhite"
Margin="0,0,3,3"
/>
<GridSplitter
Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" Name="TopSplitter"
HorizontalAlignment="Stretch"
Background="Gray" Width="6"
DragCompleted="GridSplitter_DragCompleted"
DragDelta="MainSplitter_DragDelta"
/>
<TextBlock Grid.Column="2" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="AntiqueWhite"
Margin="3,0,0,3"
/>
</Grid>
<Grid Grid.Row="1" Margin="3,0,3,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" Name="MainColumnA"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" Name="MainColumnB"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="Aqua"
Margin="0,0,3,0"
/>
<GridSplitter
Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" Name="MainSplitter"
HorizontalAlignment="Stretch"
Background="Black" Width="6"
DragCompleted="GridSplitter_DragCompleted"
DragDelta="MainSplitter_DragDelta"
/>
<TextBlock Grid.Column="2" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="Aqua"
Margin="3,0,0,0"
/>
</Grid>
</Grid>
private void GridSplitter_DragCompleted(object sender, DragCompletedEventArgs e)
{
if (sender == MainSplitter)
{
TopColumnA.Width = MainColumnA.Width;
TopColumnB.Width = MainColumnB.Width;
}
else
{
if (sender == TopSplitter)
{
MainColumnA.Width = TopColumnA.Width;
MainColumnB.Width = TopColumnB.Width;
}
}
}
private void MainSplitter_DragDelta(object sender, DragDeltaEventArgs e)
{
if (sender == MainSplitter)
{
TopColumnA.Width = MainColumnA.Width;
TopColumnB.Width = MainColumnB.Width;
}
else
{
if (sender == TopSplitter)
{
MainColumnA.Width = TopColumnA.Width;
MainColumnB.Width = TopColumnB.Width;
}
}
}