Entwickler-Ecke

WPF / Silverlight - Probleme mit Hintergrundfarbe // WPF-Anwendung


Fritziiiii - So 25.10.15 21:10
Titel: Probleme mit Hintergrundfarbe // WPF-Anwendung
Hi,

ich hab ein kleines Proble beim Binden der Hintergrundfarbe. Binde ich die Farbe im Quellcode, klappt die Zuweisung ganz gut. Versuche ich die Bindung im XAML-Teil, bekomme ich keine Farbe angezeigt.
(noch zur Info, die Farbe wird bei jedem MouseMove aktualisiert).

Im Konstruktor hab ich die Hintergrundfarbe auf Pink (255,0,255) gesetzt, diese wird auch dargestellt. Aber sobald ich das MouseMove auslöse, habe ich keine Hintergrundfarbe mehr.
"auswahl" ist die Methode, welche die Hintergrundfarbe bereitstellt.

Hoffe, irgendjemand kann mir weiterhelfen.

Gruß
Fritziiiii



C#-Quelltext
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:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
class aktuelleFarbe : INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null) PropertyChanged(this, e);
        }

        private Color _aktVT;
        public Color aktVT
        {
            get { return _aktVT; }
            set { _aktVT = value; }
        }

        private Color _auswahl;
        public Color auswahl
        {
            get { return _auswahl; }
            set
            {
                _auswahl = value;
                OnPropertyChanged(new PropertyChangedEventArgs("auswahl"));
            }
        }
       
        private string _test;
        public string test
        {
            get { return _test; }
            set { _test = value;
                OnPropertyChanged(new PropertyChangedEventArgs("test"));
            }
        }

        public aktuelleFarbe(byte r, byte g, byte b)
        {
            
           aktVT = Color.FromRgb(r, g, b);
           auswahl =  Color.FromRgb(255,0,255);
           
           test = "blub";

        }
    }


    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

       
        aktuelleFarbe Farbe = new aktuelleFarbe(255,255,0);


        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = Farbe;

        }
.
.
.
.




 private void Rectangle_MouseMove(object sender, MouseEventArgs e)
        {

            SolidColorBrush test = new SolidColorBrush();
            
            Rectangle Rect = (Rectangle)sender;
            Color Vollton = new Color();
            Vollton.R = 255; Vollton.G = 255; Vollton.B = 0;
            System.Windows.Point position = e.GetPosition(Grid1);
          
            Farbe.auswahl = FarbeBerechnen(position.X , position.Y, Vollton, Rect.Width, Rect.Height);
                     
            test.Color = Color.FromRgb(Farbe.auswahl.R, Farbe.auswahl.G, Farbe.auswahl.B);
            labelY.Background = test;  // Zeile wird bei Bindung im XAML-Teil auskommentiert
          
        }


Für die Bindung im XAML-Teil hab ich mal zwei Versuche gemacht, aber beide ohne Erfolg.
Versuch 1:

C#-Quelltext
1:
 <Label x:Name="labelY" Content="{Binding Path=test}" HorizontalAlignment="Left" Margin="327,230,0,0" VerticalAlignment="Top" Background="{Binding Path=auswahl}"/>                    


Versuch 2:

C#-Quelltext
1:
2:
3:
4:
5:
<Label x:Name="labelY" Content="{Binding Path=test}" HorizontalAlignment="Left" Margin="327,230,0,0" VerticalAlignment="Top">
            <Label.Background>
                <SolidColorBrush Color="{Binding Path=auswahl}"/>
            </Label.Background>
        </Label>


Fritziiiii - Mo 26.10.15 18:35

Hi,

habe das Problem jetzt lösen können:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public Color auswahl
{
    get { return Color.FromRgb(_auswahl.R,_auswahl.G,_auswahl.B); }
    set
    {             
         _auswahl = value;
         test = String.Format("R{0}#G{1}#B{2}",_auswahl.R,_auswahl.G,_auswahl.B);
         OnPropertyChanged(new PropertyChangedEventArgs("auswahl"));
    }
}

Nur verstehen tu ich es nicht:

bisher hab ich mit get { return _auswahl; } die Farbe zurückgegeben. _auswahl ist ja vom Typ Color.
Nun erzeuge ich mithilfe von get { return Color.FromRgb(_auswahl.R,_auswahl.G,_auswahl.B); } aus den RGB-Werten eine "neue" Farbe und gebe diese zurück. Und schon klappt es. Warum hat mein bisheriger Ansatz nicht funktioniert?????

Gruß
Fritziiiii

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Mo 26.10.15 19:50

Dein Code in MouseMove funzt so nicht weil du den Alphakanal nicht setzt. Vollton ist so zu 100% transparent. Entweder du benutzt für Vollton auch Color.FromRgb das setzt den Alphakanal auch auf 255 oder du setzt Vollton.A selbst.
Ich kann es deinem Code jetzt nicht ansehen aber ich vermute bei deiner auswahl Property liegt ein ähnliches Problem vor. Zumindest würde deine Lösung dafür sprechen.

Nebenbei Properties, Methoden und alle anderen öffentlichen Dinge einer Klasse schreibt man Groß. Deine Schreibweise sieht für die meisten hier vermutlich, genauso wie für mich, nach Fremdkörper aus da wir so erstmal öffentliches für privates halten und so durcheinander kommen.
Es mag nur eine Kleinigkeit sein diese Standards sind aber hilfreich insbesondere für potentielle Helfer wenn man sich daran hält.