1

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

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

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

我可以创建自己的 UserControl 并在任何地方继承它,提供 InitializeComponent 模板方法。但是,如果有人以编程方式添加更多子控件怎么办?

我根本不想让我的控件知道这个机制。我想在某个点挂钩/拦截(预控件渲染)并根据数据库调整控件的可见性。

这有可能吗?如果没有,你将如何设计它?

4

1 回答 1

0

所以这就是我所做的:

我从 UserControl 继承并将检查放入 Loaded Event 的 EventHandler 中。

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

FindName() 实现由于某种我不知道的原因找不到 FrameworkElements,尽管它们的名称是在 xaml.xml 中定义的。所以这是我用来通过名字找到孩子的例程:

    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;
    }

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

于 2010-08-05T12:34:37.063 回答