【问题标题】:Binding Background Color of style from a class类中样式的绑定背景颜色
【发布时间】:2018-05-12 19:01:36
【问题描述】:

在我的应用程序中,我有 ColorToBrushConverter.cs、ColorItem.cs 和一个包含一些颜色集合的框页面,当用户单击任何颜色并返回主页时,它会保存到设置隔离存储,然后我可以将我的堆栈面板设置为任何从该颜色框页面中选择颜色的任何元素背景。

但问题是我有一种我想要颜色绑定的样式,所以我们可以从 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>

【问题讨论】:

  • 你需要通知属性。

标签: c# uwp windows-phone-silverlight


【解决方案1】:

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

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

您按照惯例通过调用与事件处理程序同名的方法来执行此操作,前缀为“On”,因此您必须实现该方法 OnPropertyChanged,正如我所提到的,它将负责实际引发 PropertyChanged 事件。

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

暴露你的财产,

public ColorItem MyColor {get;set;}

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

在MainPage构造函数中,可以初始化这个属性

MyColor = new ColorItem();

并将页面的DataContext定义为:

this.DataContext = MyColor;

现在您应该可以让您的源使用您定义的代码更新目标。如果您打算让您的 UI 将修改传播到源,您必须使用 Mode=TwoWay 定义绑定,因为 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 中引用它

【讨论】:

  • 那么如何绑定 SolidColorBrush Color="{我想在这里绑定颜色}"
  • 仍然没有发生任何事情,你可以用代码显示我应该怎么做,可能是我在实现 INotifyPropertyChanged 时错过的东西,我是第一次使用它
  • 如果您改为使用 INotifyPropertyChanged 的​​实现更新您的帖子,公开您的属性并将其设置到您的 Page DataContext 上,会更容易!
  • 一切正常 :( 错误请为我的案例分享一些代码以便我理解,我在我的问题中粘贴了所有代码,转换器没有问题,它工作正常,我唯一的问题是更新 xaml用户单击列表框中的任何颜色时的模板
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多