xaml中网格元素的条件边界

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

我有一个2行4列的网格,宽度和高度如下所示。第二行在col=1中只有一个控件,该控件可能存在,也可能不存在(由于某些逻辑)


当控件不存在时:

因为第二行的高度是“自动”的,当我没有控制时,我将只有一行。在这种情况下,我需要有关于网格底部的特定余量。 因此,第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);

}