我有一个用户控件。它有一些文本框。我需要隐藏该控件中的单个列,如果需要,我需要将其设置为可见。就像将可见性属性设置为文本框可见/隐藏/折叠一样。我需要在用户控件的列中执行相同的操作。
这是我的代码。
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.如何隐藏此列,如果需要,我也需要启用此列。任何提供帮助??
答案 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元素。 标准视图
如果您设置
local:MyGrid.IsHidden="True" local:MyGrid.ColumnNumber="0"
对于设置
local:MyGrid.IsHidden="False" local:MyGrid.ColumnNumber="0"
每一个都保持正常