C# 如何在 WPF/XAML 中绑定背景颜色?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1962149/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I bind a background color in WPF/XAML?
提问by Edward Tanguay
What do I have to change to the following code so that the background is red, neither of the 2 ways I tried worked:
我必须对以下代码进行什么更改才能使背景为红色,我尝试过的两种方法都不起作用:
(source: deviantsart.com)
(来源:deviansart.com)
XAML:
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 Behind:
背后的代码:
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
}
}
Update 1:
更新 1:
I tried Aviad's answer which didn't seem to work. I can do this manually with x:Name as shown here but I want to be able to bind the color to a INotifyPropertyChanged property, how can I do this?
我尝试了 Aviad 的答案,但似乎没有用。我可以使用 x:Name 手动执行此操作,如下所示,但我希望能够将颜色绑定到 INotifyPropertyChanged 属性,我该怎么做?
(source: deviantsart.com)
(来源:deviansart.com)
XAML:
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 Behind:
背后的代码:
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
}
}
回答by Aviad P.
The Background
property expects a Brush
object, not a string. Change the type of the property to Brush
and initialize it thus:
该Background
属性需要一个Brush
对象,而不是一个字符串。将属性的类型更改为Brush
并对其进行初始化:
Background = new SolidColorBrush(Colors.Red);
回答by Edward Tanguay
I figured this out, it was just a naming conflict issue: if you use TheBackgroundinstead of Backgroundit works as posted in the first example. The property Background was interfering with the Window property background.
我想通了,这只是一个命名冲突问题:如果您使用TheBackground而不是Background,它会像第一个示例中发布的那样工作。属性背景干扰了窗口属性背景。
回答by Oliver Hanappi
I recommend reading the following blog post about debugging data binding: http://beacosta.com/blog/?p=52
我建议阅读以下有关调试数据绑定的博客文章:http: //beacosta.com/blog/?p=52
And for this concrete issue: If you look at the compiler warnings, you will notice that you property has been hiding the Window.Background property (or Control or whatever class the property defines).
对于这个具体问题:如果您查看编译器警告,您会注意到您的属性一直隐藏 Window.Background 属性(或 Control 或该属性定义的任何类)。
回答by Gus Cavalcanti
You can still use "Background" as the property name, as long as you give your window a name and use this name on the "Source" of the Binding.
您仍然可以使用“背景”作为属性名称,只要您为窗口命名并在绑定的“源”上使用此名称即可。
回答by Simon_Weaver
Important:
重要的:
Make sure you're using System.Windows.Media.Brush
and not System.Drawing.Brush
确保您正在使用System.Windows.Media.Brush
而不是System.Drawing.Brush
They're not compatible and you'll get binding errors.
它们不兼容,您会收到绑定错误。
The color enumeration you need to use is also different
需要使用的颜色枚举也不同
System.Windows.Media.Colors.Aquamarine (class name isColors
) <--- use this one System.Drawing.Color.Aquamarine (class name isColor
)
If in doubt use Snoop
and inspect the element's background property to look for binding errors - or just look in your debug log.
如果有疑问,请使用Snoop
并检查元素的背景属性以查找绑定错误 - 或者仅查看您的调试日志。
回答by Andrzej Gis
Here you've got a copy-paste code:
在这里你有一个复制粘贴代码:
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;
}
}
回答by Eranda
The xaml code:
xaml 代码:
<Grid x:Name="Message2">
<TextBlock Text="This one is manually orange."/>
</Grid>
The c# 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;
}
This one works in windows 8 store app. Try and see. Good luck !
这个适用于 Windows 8 商店应用程序。试试看。祝你好运 !
回答by thewhiteambit
You assigned a string "Red". Your Background property should be of type 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
//...//
}
Then you can use the binding to the SolidColorBrush like this:
然后你可以像这样使用 SolidColorBrush 的绑定:
public Window1()
{
InitializeComponent();
DataContext = this;
Background = Colors.Red;
Message = "This is the title, the background should be " + Background.toString() + ".";
}
not 100% sure about the .toString() method on Color-Object. It might tell you it is a Color-Class, but you will figur this out ;)
不是 100% 确定 Color-Object 上的 .toString() 方法。它可能会告诉你它是一个颜色等级,但你会弄清楚的 ;)