如何获得RowDefinition的逻辑子代?

时间:2014-03-27 10:54:19

标签: wpf 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);
    }

} 

我的要求是什么,我需要检查所有LogicalChildrenVisibility并相应地更改其Height

我怎么能这样做?任何的想法?

更新

代码已更新,在加载我可以做到这一点,它工作正常。但我的问题是,在加载后更改控件可见性...所以在更改可见性时是否有任何通知?我正在寻找一个事件,当布局更新像..

我可以将它用于任何事件吗?

2 个答案:

答案 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);
        }

    }