Как связать цвет фона в WPF/XAML?
Что мне нужно изменить на следующий код, чтобы фон был красным, ни один из двух способов, которые я пробовал, не сработал:
(источник: 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, как я могу это сделать?
(источник: 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
}
}
Ответы
Ответ 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, но вы поймете это;)