绑定背景类的样式颜色
在我的应用程序中我有ColorToBrushConverter.cs,ColorItem.cs和一个包含一些颜色集合的框页,当用户点击任何颜色并返回到主页它保存到设置隔离存储然后我能够设置我的stackpanel任何元素背景从该颜色框页面中选择颜色。
但问题是我有一种样式,我想要颜色绑定,所以我们可以从c#中做到这一点,或者在下面的类中使用xaml中的颜色绑定。
ColorToBrushConverter.cs
namespace CustomColorsPicker.Converters { public class ColorToBrushConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value != null) { return new SolidColorBrush((Color)(value)); } return null; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } }
ColorItem.cs
namespace ColorBox { public class ColorItem { public Color Color { get; set; } } }
BoxPage.Xaml
包含颜色列表
xmlns:converters="clr-namespace:CustomColorsPicker.Converters"
//////////
BoxPage.xaml.cs
//Constructor. list of colors static uint[] uintColors = { 0xFFD9325D, 0xFFFFFF00,0xFFFFE135,0xFFFFFF66,0xFFF8DE7E,0xFF008000,0xFF008A00 }; public BoxPage() { InitializeComponent(); this.Loaded += BoxPage_Loaded; } private async void BoxPage_Loaded(object sender, RoutedEventArgs e) { List item = new List(); for (int i = 0; i 0) { (Application.Current as App).CurrentColorItem = ((ColorItem)e.AddedItems[0]); } }
MainPage.xaml.cs中
//Constructor IsolatedStorageSettings ColourSettings = IsolatedStorageSettings.ApplicationSettings; public MainPage() { InitializeComponent(); InitializeSettings(); } private void InitializeSettings() { if (!ColourSettings.Contains("LastColorItem")) { ColorItem item = new ColorItem(); item.Color = Colors.Cyan; ColourSettings.Add("LastColorItem", item); } } protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); ColourSettings["LastColorItem"] = _colorItem; } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); if (ColourSettings.Contains("LastColorItem")) { _colorItem = (ColorItem)ColourSettings["LastColorItem"]; } ColorItem myColorItem = (Application.Current as App).CurrentColorItem; if (myColorItem != null) { _colorItem = (ColorItem)myColorItem; } MyFillStackPanel.Background = new SolidColorBrush(_colorItem.Color); MyCtrlPanelBorder.Background = new SolidColorBrush(_colorItem.Color); }
MainPage.xaml中
xmlns:converters="clr-namespace:CustomColorsPicker.Converters"
在我的一个风格中,我想用上面的颜色绑定它,因为我无法在c#中执行或编辑样式
//SomeStyle
假设您的转换器工作正常,代码中实际缺少的是实际的绑定过程。
您的ColorItem类(需要从接口INotifyPropertyChanged派生)必须声明PropertyChanged事件。 当您的属性Color被修改时,您想要引发一个事件,因此UI会收到有关属性Color已更新的通知。
你通过调用一个与前缀为“On”的事件处理程序同名的方法来执行约定,因此你必须实现OnPropertyChanged方法,正如我所提到的那样,它将负责实际引发PropertyChanged事件。
您可以通过多种方式定义此实现,但您可以在此处查看Microsoft自己的实现。 在此输入链接描述
揭露你的财产,
public ColorItem MyColor {get;set;}
因此,当您定义{Binding …}时,CLR将能够在运行时找到该属性。
在MainPage构造函数中,您可以初始化此属性
MyColor = new ColorItem();
并将页面的DataContext定义为:
this.DataContext = MyColor;
现在,您应该可以使用已定义的代码更新目标源。 如果您打算让UI将修改传播到源上,则必须使用Mode = TwoWay定义Binding,因为Binding的默认模式是Mode = OneWay
编辑
public class ColorItem: INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged = delegate { }; public Color color { get { return _color; } set { _color = value; this.OnPropertyChanged(); } } public void OnPropertyChanged([CallerMemberName] string propertyName = null) { // Raise the PropertyChanged event, passing the name of the property whose value has changed. this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
公开属性并将其设置为页面的DataContext。 然后通过{Binding MyColor.color ….}在Binding中引用它。