IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Binding sur VisualBrush - Comment faire ? [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Binding sur VisualBrush - Comment faire ?
    Bonjour Forum !

    J'ai un problème pour réaliser un Binding sur un VisualBrush.

    Explications :

    J'ai un canvas sur lequel j'applique un VisualBrush afin de faire une grille. Je souhaite pouvoir modifier une propriété du VisualBrush (par exemple la couleur de la grille) mais je ne parviens pas à faire référence à une propriété de l'élément sur lequel est appliqué le VisualBrush (en l'occurrence le canvas)... (j'espère que je suis clair ). L'idée est de pouvoir adapter la couleur de la grille à la couleur du canvas qui porte la dite grille afin que celle-ci soit toujours visible (i.e. si le canvas est noir alors la grille sera blanche et si le canvas est blanc alors la grille sera noire, etc.).

    Code du VisualBrush :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<VisualBrush x:Key="SnappingGridBrush_Ponits"
    	             TileMode="Tile"
    	             Viewport="0,0,8,8"
    	             ViewportUnits="Absolute"
    	             Viewbox="0,0,8,8"
    	             ViewboxUnits="Absolute">
    		<VisualBrush.Visual>
    			<Ellipse Fill="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:DesignerCanvas2},  Converter={StaticResource ResourceKey=ConvertColor}}"
    			         Width="2"
    			         Height="2" />
    		</VisualBrush.Visual>
    	</VisualBrush>

    Pour mieux comprendre j'ai mis les sources en pièce jointe.

    Si vous avez une idée je suis preneur !!

    Merci par avance pour votre aide !

    SebHeb
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    J'utiliserai ma foi ,pour le "dessin" d'un simple Background un DrawingBrush en DynamicResources !!!

    1/ je me passe du Converter et pour l'exemple j'ai équipé le UserControl d'une DP BrushGrid carrément pour illustrer la difficulté ...
    2/ 2 Brushes en Resources permettent de basculer la couleur du BrushGrid
    3/ De plus ,même le "Geometry" du DrawingBrush peut être "trigguerré" si l'on s'équipe de plusieurs "Géométries"

    code XAML du UserControl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <UserControl x:Class="SampleProblem.MyControl"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:SampleProblem" 
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300" 
                 Background="{DynamicResource  drawing}">
        <UserControl.Resources>
     
            <ContextMenu x:Key="contextMenu">
                <MenuItem Name="CM_MODE" Header="Activer/Désactiver" Margin="-2,0,0,0" Click="CM_MODE_Click"/>
            </ContextMenu>
            <!--02 bruses au choix -->
            <SolidColorBrush x:Key="brushRed" Color="Red"   />
            <SolidColorBrush x:Key="brushGreen" Color="Green"   />
     
            <!--01 Geometry   -->
            <EllipseGeometry  x:Key="MyGeometry"
                    RadiusX="1" RadiusY="1" Center="0.5 0.5">
            </EllipseGeometry >
            <DrawingBrush x:Key="drawing"
                TileMode="Tile"
    	        Viewport="0,0,8,8"
    	        ViewportUnits="Absolute" 
    	        Viewbox="0,0,8,8"
    	        ViewboxUnits="Absolute">
                <DrawingBrush.Drawing>
                    <GeometryDrawing Brush="{Binding  RelativeSource={RelativeSource AncestorType=local:MyControl,Mode=FindAncestor},Path=BrushGrid }" Geometry="{StaticResource MyGeometry}"/>
                </DrawingBrush.Drawing>
            </DrawingBrush>
     
            <Style  TargetType="{x:Type local:MyControl}">
                <Setter Property="ContextMenu" Value="{StaticResource contextMenu}" />
                <!--default brush => Red-->
                <Setter Property="BrushGrid"
                        Value="{StaticResource brushRed }"/>
                <Style.Triggers>
                    <Trigger
                        Property="IsValid" Value="True"> 
                        <Setter
                            Property="BrushGrid"
    					    Value="{StaticResource brushGreen }"/>  
                    </Trigger>
                </Style.Triggers>
            </Style>
        </UserControl.Resources>
        </UserControl>
    Et son code behind.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
     
    namespace SampleProblem
    {
        /// <summary>
        /// Logique d'interaction pour UserControl2.xaml
        /// </summary>
        public partial class MyControl : UserControl
        {
            public MyControl()
            {
                InitializeComponent();
     
     
            }
     
            private void CM_MODE_Click(object sender, RoutedEventArgs e)
            {
                this.IsValid = !this.IsValid;
            }
     
     
            public bool IsValid
            {
                get { return (bool)GetValue(IsValidProperty); }
                set { SetValue(IsValidProperty, value); }
            }
     
            // Using a DependencyProperty as the backing store for IsValid.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty IsValidProperty =
                DependencyProperty.Register("IsValid",
                typeof(bool),
                typeof(MyControl ),
                new FrameworkPropertyMetadata(false,
                    FrameworkPropertyMetadataOptions.AffectsRender));
     
     
            public Brush BrushGrid
            {
                get { return (Brush)GetValue(ColorProperty); }
                set { SetValue(ColorProperty, value); }
            }
     
            // Using a DependencyProperty as the backing store for Foreground.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty ColorProperty =
              DependencyProperty.Register("BrushGrid",
                typeof(Brush),
                typeof(MyControl),
                new FrameworkPropertyMetadata(Brushes.WhiteSmoke,
                    FrameworkPropertyMetadataOptions.AffectsRender));
     
     
        }
    }
    N.B : ton converter est mal codé ,si tu veux l'utiliser et son code revu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    using System;
    using System.Windows.Data;
    using System.Windows.Media;
     
    namespace SampleProblem
    {
        [ValueConversion(typeof(Color), typeof(SolidColorBrush))]
        public class ColorBrushConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                Color color = (Color)value;
                return new SolidColorBrush(color);
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
        }
     
    }
    bon code...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bonjour MABROUKI,

    Merci pour ton message ! Je vais tester ta solution de ce pas ! :-)

    ***** rajout suite à test *****

    Ca marche nickel ! :-) Merci !!!

    sebheb

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    si ca te branche j'ai fait un makup qui permet de faire ca direct
    OpacityMask="{VisualBrush appbar_cogs}"

    si tu veux tu me dis
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ikeas Voir le message
    si ca te branche j'ai fait un makup qui permet de faire ca direct
    OpacityMask="{VisualBrush appbar_cogs}"

    si tu veux tu me dis
    Bonjour ikeas,

    Merci pour ta proposition ! Je suis intéressé par ton makup (et curieux d'en connaître plus...) ! Tu peux m'en faire part ?

    Merci d'avance !! :-D

    sebheb

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    voici le code du markup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
       [MarkupExtensionReturnType(typeof(object))]
        public class VisualBrushExtension : MarkupExtension
        {
            private VisualBrush v;
     
            public VisualBrushExtension() { }
            public VisualBrushExtension(string key)
            {
                FrameworkElement c = Application.Current.FindResource(key) as FrameworkElement;
                v = new VisualBrush(c);
            }
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                if ((v != null))
                    return v;
                else throw new InvalidOperationException("Inputs cannot be blank");
            }
        }
    si tu veux pas etre obligé de ce coller xmlns specifique
    utilise mon tuto ici http://ultimatespy.sytes.net/wpf/ind...ult-namespace/
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2018
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ikeas Voir le message
    voici le code du markup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
       [MarkupExtensionReturnType(typeof(object))]
        public class VisualBrushExtension : MarkupExtension
        {
            private VisualBrush v;
     
            public VisualBrushExtension() { }
            public VisualBrushExtension(string key)
            {
                FrameworkElement c = Application.Current.FindResource(key) as FrameworkElement;
                v = new VisualBrush(c);
            }
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                if ((v != null))
                    return v;
                else throw new InvalidOperationException("Inputs cannot be blank");
            }
        }
    si tu veux pas etre obligé de ce coller xmlns specifique
    utilise mon tuto ici http://ultimatespy.sytes.net/wpf/ind...ult-namespace/
    Bonjour ikeas !

    Merci beaucoup pour ton code et le lien vers ton tuto !! C'est super intéressant et cela va bien m'aider !

    sebheb

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Impression sur Brother Comment Faire
    Par filos dans le forum Solaris
    Réponses: 2
    Dernier message: 03/09/2013, 13h24
  2. Eclipse sur Windows et dev local sur Linux : comment faire ?
    Par fredouille31 dans le forum Eclipse PHP
    Réponses: 2
    Dernier message: 17/01/2011, 10h26
  3. [AC-2007] Sur Réseau - comment faire ?
    Par CrasherSEP dans le forum IHM
    Réponses: 9
    Dernier message: 18/11/2010, 11h35
  4. [XL-2003] Bouton pour calcul sur ordre - comment faire ?
    Par nikolok dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 15/07/2010, 11h24
  5. Réponses: 9
    Dernier message: 29/01/2008, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo