Question

nous avons une exigence assez bizarre: La visibilité de tout contrôle dans notre WPF-application doit être tirée par une base de données table

.

Cela signifie que nous avons une table qui stocke le nom de l'élément et son visiblité.

Maintenant, je suis à la recherche d'une façon élégante de mettre en œuvre cette fonctionnalité sur le côté client.

Je pourrais créer mon propre UserControl et hériter de partout, en fournissant une méthode InitializeComponent modèle. Mais si quelqu'un ajoute plus childcontrols programme?

Je ne veux pas que mes contrôles de connaître ce mécanisme du tout. Je veux crochet / interception à un certain point (pré-commande de rendu) et ajuster la visibilité de la commande en fonction de la base de données.

Est-ce possible en quelque sorte? Et sinon, comment voulez-vous concevoir?

Était-ce utile?

La solution

Voici donc ce que je faisais:

Je hérité de UserControl et mettre le contrôle dans le un gestionnaire d'événements pour l'événement Loaded.

Je puis laisser mes contrôles hériteront de mon CustomControl, cela fonctionne assez bien.

La mise en œuvre FindName () ne trouvera pas les FrameworkElements pour une raison quelconque, je ne sais pas, bien que leurs noms sont définis dans le XAML. Voici donc la routine que j'utilise pour trouver les enfants par leurs noms:

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

Je n'aime pas cette solution, mais il fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top