1

かなり奇妙な要件があります。WPF アプリケーションのコントロールの可視性は、データベース テーブルによって駆動される必要があります。

つまり、要素の名前とその可視性を格納するテーブルがあるということです。

現在、クライアント側でこの機能を実装するエレガントな方法を探しています。

独自の UserControl を作成し、それをどこからでも継承して、InitializeComponent テンプレート メソッドを提供できます。しかし、誰かがプログラムで childcontrols をさらに追加するとどうなるでしょうか?

コントロールにこのメカニズムをまったく知らせたくありません。特定の時点 (コントロール レンダリング前) でフックイン/インターセプトし、データベースに従ってコントロールの可視性を調整したいと考えています。

それはどういうわけか可能ですか?そうでない場合、どのように設計しますか?

4

1 に答える 1

0

だからここに私がしたことがあります:

UserControl から継承し、Loaded イベントの EventHandler にチェックを入れました。

次に、Controls に CustomControl を継承させます。これは非常にうまく機能します。

名前は xaml で定義されていますが、FindName() の実装では、何らかの理由で FrameworkElements が見つかりません。そこで、名前で子供を見つけるために私が使用するルーチンは次のとおりです。

    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 に答える