Как я могу связать цвет фона в WPF / XAML? - PullRequest
30 голосов
/ 26 декабря 2009

Что мне нужно изменить на следующий код, чтобы фон был красным, ни один из двух способов, которые я пробовал, не сработал:

alt text
(источник: 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>

Код сзади:

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

    }
}

Обновление 1:

Я попробовал ответ Авиад, который, похоже, не сработал. Я могу сделать это вручную с помощью x: Name, как показано здесь, но я хочу иметь возможность привязать цвет к свойству INotifyPropertyChanged. Как это сделать?

alt text
(источник: 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>

Код сзади:

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

    }
}

Ответы [ 7 ]

51 голосов
/ 02 ноября 2012

Важно:

Убедитесь, что вы используете System.Windows.Media.Brush, а не System.Drawing.Brush

Они не совместимы, и вы получите ошибки привязки.

Перечисление цветов, которое вам нужно использовать, также отличается

System.Windows.Media.Colors.Aquamarine (имя класса Colors) <--- используйте этот System.Drawing.Color.Aquamarine (имя класса <code>Color)

Если сомневаетесь, используйте Snoop и проверьте свойство фона элемента, чтобы найти ошибки привязки - или просто загляните в свой журнал отладки.

21 голосов
/ 26 декабря 2009

Свойство Background ожидает объект Brush, а не строку. Измените тип свойства на Brush и инициализируйте его следующим образом:

Background = new SolidColorBrush(Colors.Red);
7 голосов
/ 01 декабря 2012

Здесь у вас есть код для копирования-вставки:

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;
        }
    }
3 голосов
/ 26 декабря 2009

Я рекомендую прочитать следующий пост в блоге об отладке привязки данных: http://beacosta.com/blog/?p=52

И для этой конкретной проблемы: если вы посмотрите на предупреждения компилятора, вы заметите, что ваше свойство скрывало свойство Window.Background (или Control или любой другой класс, определяемый свойством).

3 голосов
/ 26 декабря 2009

Я понял это, это была просто проблема конфликта имен : если вы используете TheBackground вместо Background , это работает, как показано в первом примере. Свойство Background мешало фону свойства Window.

2 голосов
/ 19 июня 2014

Код xaml:

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

Код 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;

    }

Это работает в приложении Windows 8 Store. Попробуй и посмотри. Удачи!

0 голосов
/ 27 декабря 2009

Вы все еще можете использовать «Фон» в качестве имени свойства, если вы даете своему окну имя и используете это имя в «Источнике» Связывания.

...