Question

Ok, donc c'est juste une idée que j'ai dans la tête concernant une sorte de propriété de dépendance «pseudo-écriture uniquement». Je dis sorte de parce que je ne veux même pas que la valeur soit stockée, mais je veux plutôt que la valeur que je passe au setter définisse d'autres propriétés. À titre d'exemple hypothétique, j'aimerais faire ceci ...

<button UIHelper.Bounds="10,10,40,20" />

au lieu de ça ...

<button Canvas.Left="10" Canvas.Top="10" Width="40" Height="20" />

Juste un truc de commodité pour la saisie XAML qui me permet de définir les quatre propriétés réelles avec quelque chose de plus facile à taper grâce à une propriété jointe en écriture seule. Pensez aux règles CSS réduites. En fait, à cet effet, en voici une autre ...

<border UIHelper.BrushSpec="AliceBlue Red 2 4" />

au lieu de ...

<border Background="AliceBlue" BorderBrush="Red" BorderThickness="2" CornerRadius="4" />

En utilisant maintenant le premier comme exemple, une idée est de stocker une telle structure en interne, puis de la synchroniser avec les propriétés existantes Width, Height, Canvas.Left et Canvas.Top, mais je n'ai vraiment pas l'intention de lire il revient donc ce n'est pas nécessaire. (Techniquement, je pourrais ignorer complètement le stockage de celui-ci et appeler simplement ClearValue dans le gestionnaire de propriété modifiée mais encore une fois, ce n'est pas vraiment pour le relire, donc c'est juste pour la cohérence.)

Techniquement, je n'ai même pas envie / besoin que ce soit un DP, sauf si je comprends que si vous devez le définir à partir de XAML, ce doit être un DP, d'où ce que je recherche. Ce serait parfait si nous pouvions simplement définir une propriété .NET directe, car je pourrais rendre l'implémentation à la fois définie et se reconstruire si nécessaire, mais encore une fois, je comprends que vous ne pouvez pas accéder aux propriétés .NET à partir de XAML, donc je ' Je suis de retour ici.

Maintenant, oui, je sais que ce concept sera mal vu par beaucoup de gens, en particulier les puristes XAML, mais je demande comment pas pourquoi donc si c'est pour non autre raison, considérez ceci comme un exercice de «peut-il être fait» et non «devrait-il être fait». Je ne suggère même pas que c'est ce que j'utiliserai. J'essaie simplement de mieux comprendre les limites des DP et du XAML et je trouve que des exercices comme celui-ci sont vraiment utiles.

Alors, pensées ??

M

Pas de solution correcte

Autres conseils

Sans aller à l'extrême de l'écriture de votre propre compilateur XAML, je pense que le mieux que vous puissiez faire est une propriété jointe qui définit le groupe de propriétés qui vous intéresse en fonction d'une syntaxe compacte que vous définissez. Oui, cela signifie que vous avez alloué du stockage pour la représentation compacte, mais comme vous le dites, vous pouvez l'effacer immédiatement après l'application. Ce serait un peu peu orthodoxe, mais cela fonctionnerait techniquement.

Vous pouvez également essayer de ne pas déclarer du tout un champ de propriété attaché afin que la valeur soit accessible via les méthodes get / set (je n'ai pas essayé cela, mais je pense que cela fonctionne lorsque le DP est privé, alors peut-être que cela fonctionnera ). De cette façon, vous pourriez également le rendre lisible sans vous donner la peine d'écouter les modifications apportées aux propriétés pertinentes. Bien sûr, cela signifie que votre propriété ne recevra pas de notification de modification:

public static string GetBounds(UIElement uiElement)
{
    return Canvas.GetLeft(uiElement) + "," + ...;
}

public static void SetBounds(UIElement uiElement, string compact)
{
    // parse and apply compact
}

Je mets juste la représentation compacte dans un string ci-dessus, mais vous voudrez probablement utiliser un type spécifique. Encore une fois, ce qui précède peut ne pas fonctionner - vous pouvez avoir besoin de l'instance DependencyProperty associée. Si j'étais sur une machine Windows, je l'essayerais.

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