web-dev-qa-db-fra.com

Comment lier une couleur d'arrière-plan dans WPF / XAML?

Que dois-je changer pour le code suivant afin que l'arrière-plan soit rouge, aucune des 2 méthodes que j'ai essayées n'a fonctionné:

alt text
(source: 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 derrière:

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 indiqué ici mais je veux pouvoir lier la couleur à une propriété INotifyPropertyChanged, comment puis-je faire cela?

alt text
(source: 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 derrière:

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

Important:

Assurez-vous que vous utilisez System.Windows.Media.Brush et pas 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 également différente

System.Windows.Media.Colors.Aquamarine (le nom de la classe est Colors) <--- utilisez celui-ci System.Drawing.Color.Aquamarine (le nom de la classe est Color)

En cas de doute, utilisez Snoop et inspectez la propriété background de l'élément pour rechercher des erreurs de liaison - ou recherchez simplement dans votre journal de débogage.

52
Simon_Weaver

La propriété Background attend un objet Brush, pas une chaîne. Changez le type de la propriété en Brush et initialisez-le ainsi:

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

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
Andrzej Gis

J'ai compris cela, c'était juste un problème de conflit de nommage: si vous utilisez TheBackground au lieu de Background cela fonctionne comme indiqué 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
Edward Tanguay

Je recommande de lire l'article de blog suivant sur le débogage de la 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 masqué la propriété Window.Background (ou Control ou toute classe définie par la propriété).

3
Oliver Hanappi

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 l'application Windows 8 Store. Essayez de voir. Bonne chance !

2
Eranda

Vous avez attribué une chaîne "Rouge". Votre propriété d'arrière-plan doit être de type Couleur:

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

        //...//
}

Ensuite, vous pouvez utiliser la liaison au SolidColorBrush comme ceci:

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

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

}

pas sûr à 100% de la méthode .toString () sur Color-Object. Cela pourrait vous dire qu'il s'agit d'une classe de couleurs, mais vous comprendrez cela;)

0
thewhiteambit

Vous pouvez toujours utiliser "Arrière-plan" comme nom de propriété, tant que vous donnez un nom à votre fenêtre et utilisez ce nom sur la "Source" de la liaison.

0
Gus Cavalcanti