如何在WPF / XAML中绑定背景颜色?
我需要更改为以下代码,以便背景为红色,我尝试的两种方式都没有:
替代文字http://www.deviantsart.com/upload/1okq25l.png
XAML:
代码背后:
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属性,我该怎么做?
替代文字http://www.deviantsart.com/upload/7tp48m.png
XAML:
代码背后:
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 } }
重要:
确保您使用的是System.Windows.Media.Brush
而不是System.Drawing.Brush
它们不兼容,你会遇到绑定错误。
您需要使用的颜色枚举也不同
System.Windows.Media.Colors.Aquamarine(类名是
Colors
)<---使用这一个System.Drawing.Color.Aquamarine(类名是Color
)
如果有疑问,请使用Snoop
并检查元素的background属性以查找绑定错误 – 或者只查看调试日志。
Background
属性需要Brush
对象,而不是字符串。 将属性的类型更改为Brush
并初始化它:
Background = new SolidColorBrush(Colors.Red);
在这里你有一个复制粘贴代码:
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; } }
我想出来了,这只是一个命名冲突问题 :如果你使用TheBackground而不是Background,它就像在第一个例子中发布一样。 属性Background干扰了Window属性背景。
我建议阅读以下有关调试数据绑定的博文: http : //beacosta.com/blog/?p = 52
对于这个具体问题:如果查看编译器警告,您会注意到您的属性一直隐藏了Window.Background属性(或Control或属性定义的任何类)。
xaml代码:
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商店应用程序。 试试看。 祝好运 !
您仍然可以使用“Background”作为属性名称,只要您为窗口指定名称并在Binding的“Source”上使用此名称即可。