【问题标题】:Conditional margining for a grid elements in xamlxaml 中网格元素的条件边距
【发布时间】:2021-06-07 18:09:59
【问题描述】:

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

          <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions></Grid>

当控制不存在时:

由于第二行的高度是“自动”,当我无法控制时,我将只有单行。在这种情况下,我需要相对于网格底部有特定的边距。 因此,第 0 行控件的边距 = "0,0,0,14"

当控制存在时:

当控件存在时,我有两行,我需要在两行元素之间留出 6px 的边距,第二行的边距应该是 14 w.r.t 网格底部。 因此,第 0 行控件的边距 = "0,0,0,6" 和第 1 行控件的边距 = "0,0,0,14"

如何根据第二行的存在来实现这些不同的边距值。请帮忙。提前致谢。 参考图片:

【问题讨论】:

    标签: xaml margin uwp-xaml conditional-formatting


    【解决方案1】:

    根据您的要求,您可以使用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();
        }
    }
    

    用法

     <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>
    

    更新

    但就我而言,Row1Control 是在后端动态设置的。

    你可以检测到RootGridLayoutUpdated事件,如果你添加了将被调用的控件,然后在下面的方法中重新设置MarginProperty。

    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);
    
    }
    

    【讨论】:

    • 谢谢,但这不起作用。它始终将“可见性”值视为可见并应用“0,0,0,6”。但就我而言,Row1Control 是在后端动态设置的。
    猜你喜欢
    • 2013-12-11
    • 2011-08-18
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多