Frage

Wir haben eine ziemlich ungeradee Anforderung. Die Sichtbarkeit einer Kontrolle in unserer WPF-Anwendung wird durch eine Datenbank-Tabelle angesteuert wird

Das bedeutet, dass haben wir eine Tabelle, die speichert den Namen des Elements und seine visiblity.

Nun ich bin auf der Suche nach einem eleganten Weg, um diese Funktion auf der Client-Seite zu implementieren.

Ich konnte meine eigene Usercontrol und vererben es überall schaffen, eine InitializeComponent Template-Methode bereitstellt. Aber was, wenn jemand fügt programmatisch mehr childcontrols?

Ich möchte nicht meine Kontrollen über diesen Mechanismus überhaupt kennen. Ich möchte an einem bestimmten Punkt (pre Steuer-Rendering) und stellen Sie die Sichtbarkeit der Steuerung gemäß der Datenbank in / Intercept einzuhaken.

Ist das irgendwie möglich? Und wenn nicht, wie würden Sie es entwerfen?

War es hilfreich?

Lösung

So, hier ist das, was ich getan habe:

ich geerbt von Usercontrol und setzen den Haken bei einem Eventhandler für das Loaded-Ereignis.

ich meine Kontrollen dann lassen Sie erben von meinem Custom, das funktioniert ziemlich gut.

Die Findname () Implementierung wird nicht die FrameworkElements aus irgendeinem Grund finde ich weiß nicht, obwohl ihre Namen in der XAML definiert sind. Also hier ist die Routine, die ich verwende, um die Kinder von ihren Namen zu finden:

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

Ich weiß nicht, wie diese Lösung aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top