绑定背景类的样式颜色

时间:2017-11-29 06:37:53

标签: c# uwp windows-phone-silverlight

在我的应用程序中我有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"
<Page.Resources>
    <converters:ColorToBrushConverter x:Key="ColorToBrushConverter"/>
</Page.Resources>

//////////

<ListBox Grid.Row="2" Name="listBox" ScrollViewer.VerticalScrollBarVisibility="Disabled" SelectionChanged="lstColor_SelectionChanged" Width="460" Height="770" Margin="0,20,0,0"> 
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel x:Name="item" Orientation="Horizontal" Margin="10,10,0,0">
                <Border CornerRadius="5" BorderThickness="2" BorderBrush="{Binding Color, Converter={StaticResource ColorToBrushConverter}}">
                    <Rectangle Fill="{Binding Color, Converter={StaticResource ColorToBrushConverter}}" Width="50" Height="50" />
                 </Border>
             </StackPanel>
         </DataTemplate>
     </ListBox.ItemTemplate>
</ListBox>

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<ColorItem> item = new List<ColorItem>();
    for (int i = 0; i < 67; i++)
    {
        item.Add(new ColorItem() { Color = ConvertColor(uintColors[i])});
    };
    listBox.ItemsSource = item;
}

private void lstColor_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count > 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"
<Page.Resources>
    <converters:ColorToBrushConverter x:Key="ColorToBrushConverter"/>
</Page.Resources>

在我的一种风格中,我想用上面的颜色绑定它,因为我无法在c#中编辑或编辑样式

//SomeStyle
<DiscreteObjectKeyFrame.Value>
    <SolidColorBrush Color="{**i want to bind color here**}"/>
</DiscreteObjectKeyFrame.Value>

1 个答案:

答案 0 :(得分:1)

假设您的转换器工作正常,您的代码中实际缺少的是实际的绑定过程。

您的ColorItem类(需要从接口 INotifyPropertyChanged 派生)必须声明PropertyChanged事件。 当您的属性Color被修改时,您想要引发一个事件,因此UI会收到有关属性Color已更新的通知。

您可以通过调用与事件处理程序同名的方法在约定上执行该操作,前缀为&#34; On&#34;,因此您必须实现该方法 OnPropertyChanged,正如我所提到的,将负责实际提升PropertyChanged事件。

您可以通过多种方式定义此实现,但您可以在此处查看Microsoft自己的实现。 enter link description here

露出你的财产,

CheckBoxList

因此,当您定义{Binding ...}时,CLR将能够在运行时找到该属性。

在MainPage构造函数中,您可以初始化此属性

public ColorItem MyColor {get;set;}

并将页面的DataContext定义为:

MyColor = new ColorItem();

现在,您应该可以使用已定义的代码更新目标。如果您打算让UI将修改传播到源上,则必须使用 Mode = TwoWay 定义Binding,因为Binding的默认模式是 Mode = OneWay

修改

this.DataContext = MyColor;

公开属性并将其设置为页面的DataContext。 然后通过 {Binding MyColor.color ....}

在Binding中引用它