根据颜色改变图像,wpf

时间:2013-12-03 10:29:44

标签: c# wpf dynamicresource

我有以下情况。在某处有DynamicResource颜色。此颜色决定了窗口的背景,并根据我想要选择要显示的右侧图标(明亮或黑暗)的颜色。

我想象以下场景:

  • 颜色发生变化,触发了我班级的变化
  • 我的课程检查,应选择哪个图标集
  • 强制这些图标的所有用户重新加载它们。

我想,这应该可以使用WPF机制。问题是,我不太清楚,如何构建架构,这将进行这样的处理。

  1. 捕捉颜色变化。我想,我可以编写一个名为DependencyProperty的{​​{1}}类,然后通过BackgroundColor添加该颜色。这样我就可以使用DynamicResource
  2. 捕获颜色变化
  3. 内部处理很容易。
  4. 我必须公开我的图标,以便它们可以通过PropertyChangedCallback机制附加。怎么样?通过某种收藏?每个人都有自己的DependencyProperty?
  5. 我必须通知这些图标的所有用户,他们已经更改了。怎么样?通过IObservableCollection?在代表图标的每个属性上调用NotifyPropertyChanged?也许以其他方式?
  6. 如果有更简单的方法来实现我提出的目标,我很乐意听到它:)

1 个答案:

答案 0 :(得分:1)

您可以创建一个浅色和深色WPF Theme,然后根据当前设置为background颜色的颜色在它们之间切换。使用此方法,WPF将处理所有图标更新。

如果您想创建自己的系统,可以使用DependencyProperty系统来帮助您:

Background颜色已更改:

您只需将PropertyChangedCallback处理程序添加到当前Background属性:

static YourControl()
{
    Control.BackgroundProperty.OverrideMetadata(typeof(YourControl), 
        new PropertyMetadata(Brushes.White, OnBackgroundChanged));
}

private static void OnBackgroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // The Background property value changed
}

公开图标并通知用户界面:

您可以按以下格式创建一个包含string属性的类,以便将数据绑定到每个Image.Source属性:

"\ApplicationName;component/ImageFolderName/ImageName.FileExtension"

只要此类实现INotifyPropertyChanged接口,您需要做的就是更改这些string值,UI将自动使用新图标或图像进行更新。