2013-10-15 6 views
2

Considérez les éléments suivants: LinearGadientBrush, 'A'. Normalement, si vous spécifiez ce pinceau comme arrière-plan d'un rectangle, il remplit toute la zone avec le dégradé entier, quelle que soit la taille. (Voir B).Est-il possible de ne restituer qu'un pourcentage d'un GradientBrush?

Nous essayons de dire 'Pour ce contrôle particulier, n'utilisons que les premiers xx% du pinceau pour le remplissage' afin que nous puissions obtenir un remplissage en gradient basé sur le pourcentage, comme dans 'C'.

enter image description here

Note: Nous savons que nous allons être responsables de quel pourcentage de montrer car il n'y a aucun moyen pour le système de calculer automatiquement ce pourcentage représente.

La façon dont nous faisons actuellement ceci est montrée dans 'D'. Nous définissons un rectangle à 100% de la taille dont nous avons besoin (donc le remplissage est de 100%), puis placez-le dans un autre contrôle et alignez-le à gauche. Nous définissons ensuite le contrôle externe ClipsToBounds sur true et définissons sa largeur sur le pourcentage souhaité de la largeur du rectangle interne. (Voir D) Cette approche fonctionne, mais ajoute des éléments supplémentaires dans l'arbre visuel que nous essayons d'éliminer si possible.

Répondre

1

Utilisez la propriété EndPoint du LinearGradientBrush. Dans votre cas, si vous définissez EndPoint="2,0", vous devriez obtenir le résultat souhaité.

Si vous avez besoin de faire quelque chose de plus dynamique, vous pouvez lier un objet point à la propriété EndPoint. Si vous définissez la valeur sur 1,0, cela affichera 100% du dégradé ou 2,0 pour afficher les 50 premiers% du dégradé.

StartPoint vous permet de faire la même chose de l'autre côté du gradient.

+0

Close, mais il y a un problème ici. Puisque StartPoint et EndPoint sont des propriétés de la brosse elle-même, vous auriez besoin d'une instance de la brosse par valeur rendue. Pourtant, votant pour l'info, même si ce n'est pas un ajustement exact, car il m'a conduit à la réponse que je viens de poster, qui utilise MappingMode dans le même sens. – MarqueIV

1

Trouvé. C'est le MappingMode du pinceau. Si vous le définissez sur Absolute, il s'affiche en coordonnées réelles et non en pourcentage du contrôle lui-même, ce qui signifie que si la largeur totale est de 240 unités, définissez le point final sur 240. (Notez que les décalages GradientStop sont toujours L'inconvénient est que vous avez besoin d'un pinceau par 'largeur' de contrôles que vous voulez rendre, ce qui signifie que si vous avez dix graphiques à barres à 200 unités de largeur et six de plus à 150 unités de large, vous auriez besoin de deux pinceaux, un pour chaque largeur.

Voici un exemple de MSDN ...

<!-- The MappingMode property is set to "Absolute" which specifies that the coordinate 
    system used for the StartPoint and EndPoint properties is not relative to the 
    Brush output area. Values are interpreted directly in local space. --> 

<!-- Create a brush that is absolutely 200 units wide --> 
<LinearGradientBrush MappingMode="Absolute" 
    StartPoint="0,0" EndPoint="200,0"> 

    <GradientStop Color="Yellow" Offset="0" /> 
    <GradientStop Color="Red"  Offset="0.25" /> 
    <GradientStop Color="Blue"  Offset="0.75" /> 
    <GradientStop Color="LimeGreen" Offset="1" /> 

</LinearGradientBrush> 
Questions connexes