代码之家  ›  专栏  ›  技术社区  ›  Falcon

WPF:从数据库/预渲染挂钩控制可见性

  •  1
  • Falcon  · 技术社区  · 14 年前

    我们有一个非常奇怪的要求:WPF应用程序中任何控件的可见性都是由数据库表驱动的。

    这意味着我们有一个存储元素名称及其可见性的表。

    现在,我正在寻找一种在客户端实现此功能的优雅方法。

    我可以创建自己的UserControl并从中继承,提供InitializeComponent模板方法。但是如果有人通过编程添加了更多的childcontrols呢?

    我不想让我的控件知道这个机制。我想在某个点(pre-control-rendering)钩住/截获,并根据数据库调整控件的可见性。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Falcon    14 年前

    下面是我所做的:

    我从UserControl继承并将检查放在已加载事件的EventHandler中。

    然后我让我的控件继承我的CustomControl,这很好。

        public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                string controlName = child.GetValue(Control.NameProperty) as string;
    
                if (controlName == name)
                {
                    return child as T;
                }
                else
                {
                    T result = FindVisualChildByName<T>(child, name);
                    if (result != null)
                    {
                        return result;
                    }
                }
            }
    
            return null;
        }
    

    我不喜欢这个解决方案,但它是有效的。