如何在其他窗口中调用该控件时隐藏/启用userControl中的列?

时间:2014-08-22 07:43:01

标签: wpf xaml user-controls

我有一个用户控件。它有一些文本框。我需要隐藏该控件中的单个列,如果需要,我需要将其设置为可见。就像将可见性属性设置为文本框可见/隐藏/折叠一样。我需要在用户控件的列中执行相同的操作。

这是我的代码。

UserControl Xaml:

<UserControl x:Class="UserControls.UserControl"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">   
    <Grid>
        <Grid.RowDefinitions >
            <RowDefinition Height="45"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="15*" />
            <ColumnDefinition Width="10*" />
            <ColumnDefinition Width="10*" />                      
        </Grid.ColumnDefinitions>

        <TextBox Name="txt1"
                 Text="" 
                 Grid.Row="0" Grid.Column="0"/> 
        <TextBox Name="txt1"
                 Text="" 
                 Grid.Row="0" Grid.Column="1"/>
        //....some othr controls..

    </Grid>
</UserControl>

Window1.cs:

public partial class Window1
{
    public Window1()
    {
         InitializeComponent();
         var uc = new UserControl();
         grid1.RowDefinitions.Add(new RowDefinition());
         Grid.SetRow(uc, grid1.RowDefinitions.Count - 1);
         grid1.Children.Add(uc);         
    }
} 

我需要隐藏列1.如何隐藏此列,如果需要,我也需要启用此列。任何提供帮助??

2 个答案:

答案 0 :(得分:0)

正如您在MSDN上的ColumnDefinition Class页面上看到的那样,没有Visibility属性。因此,无法设置Visibililty的{​​{1}}。执行此操作的常规方法是在该列中的每个控件上设置Grid.Column

从其他控件设置一个或多个控件的Visibility的标准方法是提供一个或多个Visibility属性:

bool

然后我们可以将该属性数据绑定到相关控件的public bool IsVisible { get; set; } // Implement INotifyPropertychanged interface here 属性:

Control.Visibillity

您可以在列中的每个控件上使用相同的<TextBox Name="txt1" Text="" Grid.Row="0" Grid.Column="0" Visibillity="{ Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" /> ,以便可以一次隐藏它们:

Binding

最后,如果您为// Hide column controls IsVisible = false; // Show column controls IsVisible = true; 属性创建DependencyProperty,那么您就可以从IsVisible外部绑定数据:

UserControl

然后从对象设置为<Local:YourUserControl IsVisible="{Binding IsVisibleInMainWindowDataContext}" />

MainWindow.DataContext

答案 1 :(得分:0)

列无法自行隐藏。不过,您可以将列中的元素包装到一个面板,然后将其可见性设置为隐藏/折叠。您还可以从列中选择所有UI元素,然后设置其可见性

var elements = Grid.Children.OfType<FrameworkElement>().Where(x => Grid.GetColumn(x) == ColumnNumber).ToList();
elements.ForEach(x => x.Visibility = System.Windows.Visibility.Collapsed);

修改

我为您创建了附加属性问题。我有简单的网格面板,里面有2个元素

<Grid local:MyGrid.IsHidden="True" local:MyGrid.ColumnNumber="0">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="1" Grid.Column="0"/>
    <TextBlock Text="2" Grid.Column="1" Name="tekst"/>
</Grid>

类MyGrid如下所示:

public class MyGrid
{
    public static void SetIsHidden(DependencyObject obj, bool val)
    {
        obj.SetValue(IsHiddenProperty, val);
    }

    public static bool GetIsHidden(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsHiddenProperty);
    }

    public static void SetColumnNumber(DependencyObject obj, int val)
    {
        obj.SetValue(ColumnNumberProperty, val);
    }

    public static int GetColumnNumber(DependencyObject obj)
    {
        return (int)obj.GetValue(ColumnNumberProperty);
    }
    public static readonly DependencyProperty IsHiddenProperty = DependencyProperty.RegisterAttached("IsHidden", typeof(bool), typeof(MyGrid));
    public static readonly DependencyProperty ColumnNumberProperty = DependencyProperty.RegisterAttached("ColumnNumber", typeof(int), typeof(MyGrid),
        new FrameworkPropertyMetadata(-1, new PropertyChangedCallback((x, y) =>
        {
            if (x is Grid && GetIsHidden(x))
                ((Grid)x).Loaded += MyGrid_Loaded;
        })));

    static void MyGrid_Loaded(object sender, RoutedEventArgs e)
    {
        if (GetColumnNumber((DependencyObject)sender) >= 0 && GetColumnNumber((DependencyObject)sender) <= ((Grid)sender).ColumnDefinitions.Count - 1)
        {
            var elements = ((Grid)sender).Children.OfType<FrameworkElement>().Where(z => Grid.GetColumn(z) == GetColumnNumber((DependencyObject)sender)).ToList();
            elements.ForEach(s => s.Visibility = System.Windows.Visibility.Collapsed);
        }
    }
}

现在,如果将local:MyGrid.IsHidden设置为True并插入有效的ColumnNumber local:MyGrid.ColumnNumber将隐藏所有UI元素。 标准视图 enter image description here

如果您设置

local:MyGrid.IsHidden="True" local:MyGrid.ColumnNumber="0"

enter image description here

对于设置

local:MyGrid.IsHidden="False" local:MyGrid.ColumnNumber="0"

每一个都保持正常 enter image description here