Comment lier une couleur de fond dans WPF / XAML?

Qu'est-ce que je dois changer pour le code suivant pour que le fond soit rouge, aucune des 2 façons que j'ai essayé n'a fonctionné:

texte alternatif http://www.deviantsart.com/upload/1okq25l.png

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 Behind:

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

    }
}

mise à Jour 1:

J'ai essayé la réponse D'Aviad qui ne semblait pas fonctionner. Je peux le faire manuellement avec x:Name comme montré ici mais je veux pouvoir lier la couleur d'une propriété INotifyPropertyChanged, Comment puis-je faire cela?

texte alternatif http://www.deviantsart.com/upload/7tp48m.png

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 Behind:

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

    }
}
27
demandé sur Dave Clemmer 2009-12-26 01:52:23

7 réponses

Important:

assurez-vous que vous utilisez System.Windows.Media.Brush et non System.Drawing.Brush

ils ne sont pas compatibles et vous obtiendrez des erreurs de liaison.

l'énumération des couleurs que vous devez utiliser est aussi différente

Système.Windows.Média.Couleur.L'aigue-marine (nom de la classe est Color)

en Cas de doute, utilisez Snoop et inspecter le fond de l'élément propriété pour la liaison des erreurs - ou tout simplement regarder dans votre journal de débogage.

46
répondu Simon_Weaver 2018-03-16 03:10:36

Background la propriété attend un Brush objet, pas une chaîne de caractères. Changer le type de la propriété Brush et l'initialiser ainsi:

Background = new SolidColorBrush(Colors.Red);
21
répondu Aviad P. 2013-07-16 11:23:57

ici vous avez un code copier-coller:

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
répondu gisek 2012-11-30 23:53:33

j'ai compris cela, c'était juste un nom du conflit question: si vous utilisez TheBackground au lieu de Background il fonctionne comme affiché dans le premier exemple. L'arrière-plan de la propriété interférait avec l'arrière-plan de la propriété Window.

3
répondu Edward Tanguay 2009-12-25 23:25:28

je vous recommande la lecture du blog suivant sur le débogage de liaison de données: http://beacosta.com/blog/?p=52

et pour ce problème concret: si vous regardez les avertissements du compilateur, vous remarquerez que votre propriété a caché la fenêtre.Propriété d'arrière-plan (ou contrôle ou n'importe quelle classe que la propriété définit).

3
répondu Oliver Hanappi 2009-12-25 23:34:25

le code xaml:

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

Le code c#:

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;

    }

celui-ci fonctionne dans windows 8 app store. Essayer et voir. Bonne chance !

1
répondu Eranda 2014-06-19 05:20:31

vous pouvez toujours utiliser " Background "comme nom de propriété, tant que vous donnez un nom à votre fenêtre et utilisez ce nom sur la" Source " de la reliure.

0
répondu Gus Cavalcanti 2009-12-26 23:41:47