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 :

Création d'une collection de propriétés [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    février 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 72
    Points : 95
    Points
    95
    Par défaut Création d'une collection de propriétés
    Bonjour,
    Je cherche un conseil, j’ai une cinquantaine de propriétés (brush) binder sur des rectangles.
    Comment je peux faire une collection de ces propriétés ?
    Merci de votre aide
    Cordialement

    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
            private Brush _rec1;
            public Brush Rec1
            {
                get { return _rec1; }
                set { _rec1= value;
                }
            }
            private Brush _rec2;
            public Brush Rec2
            {
                get { return _rec2; }
                set { _rec2= value;
                }
            }
            ...
            private Brush _recX;
            public Brush RecX
            {
                get { return _recX; }
                set { _recX= value;
                }
            }
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            <StackPanel>
                <Rectangle x:Name="Rec1" Fill="{Binding Rec1}" Width="10" Height="10" />
                <Rectangle x:Name="Rec2" Fill="{Binding Rec2}" Width="10" Height="10" /><Rectangle x:Name="RecX" Fill="{Binding RecX}" Width="10" Height="10" />
            </StackPanel>

  2. #2
    Membre expert
    Inscrit en
    avril 2008
    Messages
    2 289
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : avril 2008
    Messages : 2 289
    Points : 3 852
    Points
    3 852
    Par défaut
    bonjour

    On ignore le contexte du probleme mais...mais au lieu d'empiler 50 props et se les "taper", il vaut mieux recourir à
    - un itemscontrol ou un listbox
    - au multibindind couplé à NameToBrushConverter
    - un class Data approprie comme celui qui suit(ci-après)...il suffit ensuite d'initialiser ta List<item>
    Le rôle du converter est de faire un "mapping" ou bijection entre le nom d'un rectangle et son pinceau...

    code behind.cs du class Data:
    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
     
    namespace WpfRectangleCouleut
    {
        public class BrushInfo
        {
            public string RectName { get; set; }
     
            public SolidColorBrush MyBrush{ get; set; }
     
            public BrushInfo()
            {
                MyBrush =Brushes.Red;
                RectName = "rect1";
            }
            public BrushInfo(SolidColorBrush pbrush, string prectname):this()
            {
                MyBrush = pbrush; ;
                RectName = prectname;
            }
        }
        public class BrushInfos:List<BrushInfo>
        {
            private BrushInfo brushInfo;
            public BrushInfos()
            {
                brushInfo = new BrushInfo(Brushes.Yellow, "Rec1");
                this.Add(brushInfo);
                brushInfo = new BrushInfo(Brushes.Violet, "Rec2");
                this.Add(brushInfo);
                brushInfo = new BrushInfo(Brushes.Magenta , "Rec3");
                this.Add(brushInfo);
                brushInfo = new BrushInfo(Brushes.DarkOrange, "RecX");
                this.Add(brushInfo);
            }
     
        }
    }
    code behind.cs du class NameToBrushConverter;
    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
     
    namespace WpfRectangleCouleut
    {
        public class NameToBrushConverter :IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
                if (values == null || values.Length < 2) return false;
                if (values[0] == System.Windows.DependencyProperty.UnsetValue) return false;
                if (values[1] == System.Windows.DependencyProperty.UnsetValue) return false;
                SolidColorBrush br = (SolidColorBrush)values[1];  
                switch ((string)parameter)
                {
                    case "BrushToRect":
                        br = (SolidColorBrush)values[1];
                        break;
                    case "NormalBrush":
                        br = new SolidColorBrush(Colors.SteelBlue);
                        break;
                    default:
                        br = new SolidColorBrush(Colors.SteelBlue);  
                        break;           
                }
     
                return br;
     
            }
     
            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }
    code xaml du form:
    Code XAML : 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
     
    <Window x:Class="WpfRectangleCouleut.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfRectangleCouleut" 
            xmlns:sys="clr-namespace:System.Collections;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
        <Window.DataContext>
            <local:BrushInfos />
        </Window.DataContext>
        <Window.Resources>
            <local:NameToBrushConverter x:Key="myBrushConverter"/>
            <DataTemplate x:Key="templateRect">
                <Rectangle  Width="100" Height="50" >
                    <Rectangle.Fill>
                        <MultiBinding 
                            Converter="{StaticResource myBrushConverter}"
                            ConverterParameter="BrushToRect">
                            <Binding Path="RectName"/>
                            <Binding Path="MyBrush"/>
                        </MultiBinding>
                    </Rectangle.Fill>
                </Rectangle>
            </DataTemplate>
        </Window.Resources>
        <StackPanel DataContext="{Binding Source={StaticResource myBrushes}}">
            <ListBox ItemsSource="{Binding }"
                     ItemTemplate="{StaticResource templateRect}">
     
            </ListBox>
     
        </StackPanel>
    </Window>

    bon code...

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    février 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 72
    Points : 95
    Points
    95
    Par défaut
    Bonjour Mabrouki,
    Merci beaucoup pour ta réponse, je vais essayer de la comprendre. Entre temps j'ai trouvé une solution qui me convient très bien et très simple :

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Rectangle x:Name="R1" Fill="{Binding Couleurs[0]}" />
    <Rectangle x:Name="R2" Fill="{Binding Couleurs[1]}" />
    <Rectangle x:Name="Rx" Fill="{Binding Couleurs[2]}" />

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            public ObservableCollection<Brush> Couleurs{ get; private set; } =  new ObservableCollection<Brush>()
                {
                    Brushes.Red,
                    Brushes.Green,
                    Brushes.Blue,
                };
    Encore merci pour ton aide
    Cordialement

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/03/2010, 16h56
  2. [WSS 3.0] Création d'une collection à partir d'un template
    Par aurelien.tournier dans le forum Configuration
    Réponses: 2
    Dernier message: 24/02/2010, 10h21
  3. Réponses: 0
    Dernier message: 26/10/2009, 16h02
  4. Une collection en propriété d'un control ?
    Par le_chomeur dans le forum ASP.NET
    Réponses: 4
    Dernier message: 26/08/2009, 11h09
  5. création d'une collection de sites
    Par Stu4ever dans le forum SharePoint
    Réponses: 1
    Dernier message: 20/03/2008, 15h55

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