Подтвердить что ты не робот

Как связать цвет фона в WPF/XAML?

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

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:

Я попробовал Aviad ответ, который, похоже, не работает. Я могу сделать это вручную с помощью 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

    }
}
4b9b3361

Ответ 1

Важный:

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

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

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

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

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

Ответ 2

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

Background = new SolidColorBrush(Colors.Red);

Ответ 3

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

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;
        }
    }

Ответ 4

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

Ответ 5

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

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

Ответ 6

Код xaml:

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

Код С#:

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. Попробуй и посмотри. Удачи!

Ответ 7

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

Ответ 8

Вы назначили строку "Красный". Ваше свойство Background должно иметь тип Color:

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

        //...//
}

Затем вы можете использовать привязку к SolidColorBrush следующим образом:

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

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

}

не уверен на 100% о методе .toString() в Color-Object. Это может сказать вам, что это Color-Class, но вы поймете это;)