C#检测WinRT XAML中的强调颜色变化

3
我正在尝试检测Application.Resources资源字典中的更改,以便在更新时自动将Titlebar更改为强调颜色。所有XAML控件和元素都会自动更改,并且当将纯色刷子设置为DSDFS刷子的地址时,其内部值会更改。
这是我尝试使用的代码来检测更改:
public static DependencyProperty accent = DependencyProperty.Register("DictChange", typeof(ResourceDictionary), typeof(Shell), new PropertyMetadata(Application.Current.Resources, new PropertyChangedCallback(accent_PropertyChanged)));

public ResourceDictionary DictChange
{
    get { return (ResourceDictionary)GetValue(accent); }
    set { SetValue(accent, value); }
}

private static void accent_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    _app.SetTitlebar();
}

我猜这样做是错误的,或者我不确定这是否是检测更改的正确方法。之前有一次迭代中,我使用了Application.Current.Resources["SystemControlBackgroundAccentBrush"] as SolidColorBrush并尝试检测其属性,但那也没有起作用。

我做错了什么?请帮忙 :)

2个回答

8

这并不一定是错误的,但可能不是最好的解决方案。

在WinRT XAML中,我们有这个新的ThemeResource,它会自动更新资源。棘手的部分是找到一种方法将ApplicationView.GetForCurrentView().TitleBar.BackgroundColor绑定到SystemControlBackgroundAccentBrush

我对这个问题的回答中,我创建了一个Behavior,将自定义TitleBar附加到页面上。如果你将Background属性修改为以下内容-

<local:FullScreenModeTitleBarBehavior Background="{ThemeResource SystemControlBackgroundAccentBrush}" />

现在运行应用程序,当您更改系统的强调颜色时,您将看到背景色得到更新,如下图所示 -

enter image description here

基本上在您的情况下,您只需要创建一个类似(& 更简单?)的Behavior,作为桥梁将TitleBarBackgroundColorSystemControlBackgroundAccentBrush通过ThemeResource绑定连接起来。

希望这可以帮助你!


我做过类似的事情,你如何响应SystemNavigationManager返回按钮?你有在边距上移动的东西吗? - William Bradley

0
我猜这样做是错误的,或者我不确定这是否是检测更改的正确方法。
你不能通过注册DependencyProperty来检测Resource Dictionary中的键值更改,因为ResourceDictionay不是ObservableCollection类。
没有内置支持来检测Resource Dictionary中的键值更改。
作为解决方法,您可以考虑创建一个内部可观察集合来检测更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接