Как получить логическое потомство 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);
        }

    } 
Другие вопросы по тегам