web-dev-qa-db-ger.com

Wie kann ich eine Hintergrundfarbe in WPF / XAML binden?

Was muss ich in den folgenden Code ändern, damit der Hintergrund rot ist? Keine der beiden Möglichkeiten, die ich ausprobiert habe:

alt text
(Quelle: deviantsart.com )

XAML:

<Window x:Class="TestBackground88238.Window1"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>

        <TextBlock Text="{Binding Message}" Background="{Binding Background}"/>

        <TextBlock Text="{Binding Message}">
            <TextBlock.Background>
                <SolidColorBrush Color="{Binding Background}"/>
            </TextBlock.Background>
        </TextBlock>

    </StackPanel>
</Window>

Code dahinter:

using System.Windows;
using System.ComponentModel;

namespace TestBackground88238
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {

        #region ViewModelProperty: Background
        private string _background;
        public string Background
        {
            get
            {
                return _background;
            }

            set
            {
                _background = value;
                OnPropertyChanged("Background");
            }
        }
        #endregion

        #region ViewModelProperty: Message
        private string _message;
        public string Message
        {
            get
            {
                return _message;
            }

            set
            {
                _message = value;
                OnPropertyChanged("Message");
            }
        }
        #endregion



        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Background = "Red";
            Message = "This is the title, the background should be " + Background + ".";

        }

        #region INotifiedProperty Block
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }
}

Update 1:

Ich versuchte es mit Aviads Antwort, die anscheinend nicht funktionierte. Ich kann dies manuell mit x: Name tun, wie hier gezeigt, aber ich möchte die Farbe an eine INotifyPropertyChanged-Eigenschaft binden können. Wie kann ich das tun?

alt text
(Quelle: deviantsart.com )

XAML:

<Window x:Class="TestBackground88238.Window1"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>

        <TextBlock Text="{Binding Message}" Background="{Binding Background}"/>

        <TextBlock x:Name="Message2" Text="This one is manually orange."/>

    </StackPanel>
</Window>

Code dahinter:

using System.Windows;
using System.ComponentModel;
using System.Windows.Media;

namespace TestBackground88238
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {

        #region ViewModelProperty: Background
        private Brush _background;
        public Brush Background
        {
            get
            {
                return _background;
            }

            set
            {
                _background = value;
                OnPropertyChanged("Background");
            }
        }
        #endregion

        #region ViewModelProperty: Message
        private string _message;
        public string Message
        {
            get
            {
                return _message;
            }

            set
            {
                _message = value;
                OnPropertyChanged("Message");
            }
        }
        #endregion

        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Background = new SolidColorBrush(Colors.Red);
            Message = "This is the title, the background should be " + Background + ".";

            Message2.Background = new SolidColorBrush(Colors.Orange);

        }

        #region INotifiedProperty Block
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }
}
31
Edward Tanguay

Wichtig:

Stellen Sie sicher, dass Sie System.Windows.Media.Brush Und nicht System.Drawing.Brush Verwenden.

Sie sind nicht kompatibel und Sie erhalten Bindungsfehler.

Die zu verwendende Farbenzählung ist ebenfalls unterschiedlich

System.Windows.Media.Colors.Aquamarine (Klassenname ist Colors) <--- Verwenden Sie dieses System.Drawing.Color.Aquamarine (Klassenname ist Color)

Im Zweifelsfall verwenden Sie Snoop und überprüfen Sie die Hintergrundeigenschaft des Elements auf Bindungsfehler - oder schauen Sie einfach in Ihr Debug-Protokoll.

52
Simon_Weaver

Die Eigenschaft Background erwartet ein Brush -Objekt und keine Zeichenfolge. Ändern Sie den Typ der Eigenschaft in Brush und initialisieren Sie ihn folgendermaßen:

Background = new SolidColorBrush(Colors.Red);
22
Aviad P.

Hier haben Sie einen Code zum Kopieren und Einfügen:

class NameToBackgroundConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(value.ToString() == "System")
            {
                return new SolidColorBrush(System.Windows.Media.Colors.Aqua);
            }else
            {
                return new SolidColorBrush(System.Windows.Media.Colors.Blue);
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
7
Andrzej Gis

Ich habe das herausgefunden, es war nur ein Namenskonfliktproblem: Wenn Sie TheBackground anstelle von Background verwenden, funktioniert es wie im ersten Beispiel beschrieben. Die Eigenschaft Hintergrund hat den Hintergrund der Fenstereigenschaft beeinträchtigt.

3
Edward Tanguay

Ich empfehle, den folgenden Blogeintrag zum Debuggen der Datenbindung zu lesen: http://beacosta.com/blog/?p=52

Und zu diesem konkreten Problem: Wenn Sie sich die Compiler-Warnungen ansehen, werden Sie feststellen, dass Ihre Eigenschaft die Window.Background-Eigenschaft (oder Control oder eine von der Eigenschaft definierte Klasse) ausgeblendet hat.

3
Oliver Hanappi

Der XAML-Code:

<Grid x:Name="Message2">
   <TextBlock Text="This one is manually orange."/>
</Grid>

Der c # Code:

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        CreateNewColorBrush();
    }

    private void CreateNewColorBrush()
    {

        SolidColorBrush my_brush = new SolidColorBrush(Color.FromArgb(255, 255, 215, 0));
        Message2.Background = my_brush;

    }

Dieser funktioniert in Windows 8 Store App. Versuchen Sie und sehen Sie. Viel Glück !

2
Eranda

Sie haben eine Zeichenfolge "Rot" zugewiesen. Ihre Background-Eigenschaft sollte vom Typ Color sein:

using System.Windows;
using System.ComponentModel;

namespace TestBackground88238
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {

        #region ViewModelProperty: Background
        private Color _background;
        public Color Background
        {
            get
            {
                return _background;
            }

            set
            {
                _background = value;
                OnPropertyChanged("Background");
            }
        }
        #endregion

        //...//
}

Dann können Sie die Bindung an den SolidColorBrush wie folgt verwenden:

public Window1()
{
    InitializeComponent();
    DataContext = this;

    Background = Colors.Red;
    Message = "This is the title, the background should be " + Background.toString() + ".";

}

nicht 100% sicher über die .toString () -Methode für Color-Object. Es könnte dir sagen, dass es eine Farbklasse ist, aber du wirst es herausfinden;)

0
thewhiteambit

Sie können weiterhin "Hintergrund" als Eigenschaftsname verwenden, solange Sie Ihrem Fenster einen Namen geben und diesen Namen in der "Quelle" der Bindung verwenden.

0
Gus Cavalcanti