我有一个网格,有几行。我有一个用户控件,我将其放在其中一行上,行数为2.所有行都具有相同的高度。我将用户控件的垂直对齐设置为居中,因此它显示在两行的中间。我想要的是用户控件的网格行高度为1,无论网格的高度如何。因此,实际上,用户控件的高度会相对于网格中行的高度增加,因为行高也与网格高度相关。
答案 0 :(得分:1)
似乎您可能希望将用户控件的高度数据绑定到RowDefinition的高度。这个问题有点相似,但他绑定行高,而不是包含的元素:How do I databind a ColumnDefinition's Width or RowDefinition's Height?
我尝试了一种可能不赞成的简单方法,但可能符合您的需求。
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Rectangle x:Name="measurementRect" VerticalAlignment="Stretch" Grid.Row="1" Fill="Blue" Width="1" Visibility="Hidden" />
<Rectangle Grid.Row="2" Grid.RowSpan="2"
VerticalAlignment="Center" Fill="Green" Height="{Binding ElementName=measurementRect,Path=ActualHeight}" Width="200" />
</Grid>
</Page>
答案 1 :(得分:0)
我首先想到通过公共属性将用户控件的高度数据绑定到行的高度可能会起作用,但是我发现你无法将行的高度绑定为RowDefinition子类DependencyObject,但是SetBinding方法是在FrameworkElement中定义。
也就是说,一个选项可能是以编程方式找到行的高度并将控制高度绑定到该高度。
示例属性
private int controlHeight;
public int ControlHeight
{
get
{
int row = Grid.GetRow(this.myControl);
return myGrid.RowDefinitions[row].Height;
}
set
{
controlHeight = value;
//Implement property changed event etc here if needed
}
}
如果要确保控件大小将动态扩展(除了加载时),则需要其他代码来更新属性并通知UI。您还可以检查网格的高度并除以此属性中的列数,但这可能不具有可伸缩性。
请注意,因为您使用的是colSpan,您可能需要将行高除以2。