【问题标题】:How to get the Logical Children of a RowDefinition?如何获得 RowDefinition 的逻辑子代?
【发布时间】:2014-03-27 10:54:19
【问题描述】:

我已经将RowDefinition 扩展为RowDefinitionExtended,并且我什么时候可以得到属于这个RowDefinitionLogicalChildren。我的意思是我可以在哪个覆盖中获得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

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

更新:

代码已更新,在加载时我可以这样做并且效果很好。但我的问题是,加载后正在更改控件的可见性......那么在更改可见性时是否有任何通知?当布局更新时,我正在寻找一个事件..

我可以在任何活动中使用它吗?

【问题讨论】:

  • 您希望 RowDefinition 的 LogicalChildren 集合中包含什么?至少,Grid 的子元素不是 RowDefinition 的子元素。
  • 您可以将 RowDefinition 的初始高度设置为 Auto。当该行中所有 Grid 子项的 Visibily 更改为 Collapsed 时,该行将自动消失。
  • @Clemens:我有一些情况可以将可见性设置为隐藏..
  • 好的,您可以订阅特定行中每个孩子的 IsVisibleChanged 事件。

标签: wpf rowdefinition


【解决方案1】:

您不能通过派生的 RowDefinition 来做到这一点,但是这个小助手方法应该可以完成这项工作(如果您的意图是获取 Grid 的某一行中的所有子元素):

public static IEnumerable<UIElement> ChildrenInRow(Grid grid, int row)
{
    return grid.Children.Cast<UIElement>().Where(c => Grid.GetRow(c) == row);
}

【讨论】:

    【解决方案2】:

    加载行时,您必须为该行中的每个元素订阅 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);
            }
    
        } 
    

    【讨论】:

    • 这是为所有控件设置处理程序的最佳方式吗?它会影响性能...
    • 我认为这是最好的方法...试着告诉我。
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2023-03-25
    • 2014-07-17
    • 2019-12-14
    相关资源
    最近更新 更多