Как получить логическое потомство RowDefinition?
Я продлил 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
соответственно.
Как я мог это сделать? Любая идея?
Обновить:
Код был обновлен, при загрузке я мог сделать это, и он отлично работает. Но моя проблема в том, что я изменяю видимость элементов управления после загрузки... Так есть ли какие-либо уведомления при изменении видимости? ищу событие, когда макет обновляется как..
Любое событие я могу использовать его для?
2 ответа
Вы не можете сделать это с помощью производного RowDefinition, но этот маленький вспомогательный метод должен выполнить эту работу (если вы намеревались получить все дочерние элементы в определенной строке Grid
):
public static IEnumerable<UIElement> ChildrenInRow(Grid grid, int row)
{
return grid.Children.Cast<UIElement>().Where(c => Grid.GetRow(c) == row);
}
Вы должны подписаться на обработчик 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);
}
}