xaml中网格元素的条件边界
我有一个2行4列的网格,宽度和高度如下所示。第二行在col=1中只有一个控件,该控件可能存在,也可能不存在(由于某些逻辑)xaml中网格元素的条件边界,xaml,margin,uwp-xaml,conditional-formatting,Xaml,Margin,Uwp Xaml,Conditional Formatting,我有一个2行4列的网格,宽度和高度如下所示。第二行在col=1中只有一个控件,该控件可能存在,也可能不存在(由于某些逻辑) 当控件不存在时: 因为第二行的高度是“自动”的,当我没有控制时,我将只有一行。在这种情况下,我需要有关于网格底部的特定余量。 因此,第0行的边距control=“0,0,0,14” 存在控件时: 当控件存在时,我有两行,需要在两行元素之间留有边距,如6px,第二行边距应该是网格底部的14w.r.t。 因此,第0行控制的边距=“0,0,0,6”和第1行控制的边距=“0,0
当控件不存在时:
因为第二行的高度是“自动”的,当我没有控制时,我将只有一行。在这种情况下,我需要有关于网格底部的特定余量。
因此,第0行的边距control=“0,0,0,14”
存在控件时:
当控件存在时,我有两行,需要在两行元素之间留有边距,如6px,第二行边距应该是网格底部的14w.r.t。
因此,第0行控制的边距=“0,0,0,6”和第1行控制的边距=“0,0,14”
如何根据第二行的存在情况实现这些不同的边距值。请帮忙。提前谢谢。
参考img:
根据您的要求,您可以使用
MarginConverter
根据第1行控件的存在与否设置第0行控件边距
比如说
public class MarginConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
Thickness newMargin;
var visibility = (Visibility)value;
switch (visibility)
{
case Visibility.Visible:
newMargin = new Thickness(0, 0, 0, 6);
break;
case Visibility.Collapsed:
newMargin = new Thickness(0, 0, 0, 14);
break;
default:
break;
}
return newMargin;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
用法
在代码隐藏中添加元素
private void Button_Click(object sender, RoutedEventArgs e)
{
var Row1Control = new Rectangle() { Height = 80, Margin = new Thickness(0, 0, 0, 14), Fill = new SolidColorBrush(Colors.Black), Name = "Row1Control" };
Row1Control.SetValue(Grid.ColumnProperty, 1);
Row1Control.SetValue(Grid.RowProperty, 1);
RootGrid.Children.Add(Row1Control);
}
谢谢,但这不起作用。它始终将“可见性”值视为可见,并应用“0,0,0,6”。但在我的案例中,Row1Control是在后端动态设置的。我已经更新了案例回复,它有效吗?如果答案解决了您的问题,请将其视为已接受
<Page.Resources>
<local:MarginConverter x:Key="Conveter" />
</Page.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Rectangle
Grid.Row="0"
Grid.Column="1"
Margin="{Binding ElementName=Row1Control, Path=Visibility, Converter={StaticResource Conveter}}"
Fill="Red" />
<Rectangle
x:Name="Row1Control"
Grid.Row="1"
Grid.Column="1"
Height="80"
Margin="0,0,0,14"
Fill="Black"
Visibility="Visible" />
</Grid>
private int oldCount;
private void RootGrid_LayoutUpdated(object sender, object e)
{
if(RootGrid.Children.Count > oldCount)
{
if (RootGrid.Children.Any(p => p.GetValue(NameProperty).ToString() == "Row1Control"))
{
Row0Control.SetValue(MarginProperty, new Thickness(0, 0, 0, 6));
}
else
{
Row0Control.SetValue(MarginProperty, new Thickness(0, 0, 0, 14));
}
oldCount = RootGrid.Children.Count;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var Row1Control = new Rectangle() { Height = 80, Margin = new Thickness(0, 0, 0, 14), Fill = new SolidColorBrush(Colors.Black), Name = "Row1Control" };
Row1Control.SetValue(Grid.ColumnProperty, 1);
Row1Control.SetValue(Grid.RowProperty, 1);
RootGrid.Children.Add(Row1Control);
}