我已将RowDefinition
扩展为RowDefinitionExtended
而且,我何时可以LogicalChildren
属于此RowDefinition
。我的意思是我可以在哪个覆盖中获得LogicalChildren
?
public class RowDefinitionExtended : RowDefinition
{
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
Loaded += OnRowDefinitionExtendedLoaded;
}
void OnRowDefinitionExtendedLoaded(object sender, RoutedEventArgs e)
{
var parent = GetUIParentCore() as Grid;
if (parent == null) return;
if (parent.Children.Cast<UIElement>().Where(c => Grid.GetRow(c) == parent.RowDefinitions.IndexOf(this)).All(ctrl => ctrl.Visibility != Visibility.Visible))
Height = new GridLength(0);
}
}
我的要求是什么,我需要检查所有LogicalChildren
到Visibility
并相应地更改其Height
。
我怎么能这样做?任何的想法?
更新
代码已更新,在加载我可以做到这一点,它工作正常。但我的问题是,在加载后更改控件可见性...所以在更改可见性时是否有任何通知?我正在寻找一个事件,当布局更新像..
我可以将它用于任何事件吗?
答案 0 :(得分:2)
你不能通过派生的RowDefinition来做到这一点,但是这个小帮助方法应该完成这项工作(如果你的意图是将所有子元素放在Grid
的某一行中):
public static IEnumerable<UIElement> ChildrenInRow(Grid grid, int row)
{
return grid.Children.Cast<UIElement>().Where(c => Grid.GetRow(c) == row);
}
答案 1 :(得分:0)
加载行时,必须为行中的每个元素订阅IsVisibleChanged处理程序。
当能见度发生变化时,您可以做任何您需要的事情
public class RowDefinitionExtended : RowDefinition
{
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
Loaded += OnRowDefinitionExtendedLoaded;
}
void OnRowDefinitionExtendedLoaded(object sender, RoutedEventArgs e)
{
var parent = GetUIParentCore() as Grid;
if (parent == null) return;
//Subscribe to the IsVisibleChanged handler for each element in the row
var ElementInGridRow = parent.Children.Cast<UIElement>().Where(c => Grid.GetRow(c) == parent.RowDefinitions.IndexOf(this));
foreach (var element in ElementInGridRow)
{
element.IsVisibleChanged+=new DependencyPropertyChangedEventHandler(OnChildrenIsVisibleChanged);
}
}
private void OnChildrenIsVisibleChanged(object sender,DependencyPropertyChangedEventArgs e)
{
UIElement element = sender as UIElement;
//Do stuff...
var parent = GetUIParentCore() as Grid;
if (parent.Children.Cast<UIElement>().Where(c => Grid.GetRow(c) == parent.RowDefinitions.IndexOf(this)).All(ctrl => ctrl.Visibility != Visibility.Visible))
Height = new GridLength(0);
}
}