Xaml RegisterPropertyChangedCallback仅在第一次工作时起作用

Xaml RegisterPropertyChangedCallback仅在第一次工作时起作用,xaml,uwp,uwp-xaml,Xaml,Uwp,Uwp Xaml,这是一个与控件相关的后续问题,该控件在公共控件属性更改时需要拦截()。 当任何基本属性发生更改(foregound、字体样式、大小…)时,我需要使画布无效并重新绘制内容 我最终在UserControl构造函数中调用了此方法: RegisterPropertyChangedCallback(DependencyProperty dp,DependencyPropertyChangedCallback回调); 例如: RegisterPropertyChangedCallback(Foregro

这是一个与控件相关的后续问题,该控件在公共控件属性更改时需要拦截()。 当任何基本属性发生更改(foregound、字体样式、大小…)时,我需要使画布无效并重新绘制内容

我最终在UserControl构造函数中调用了此方法:

RegisterPropertyChangedCallback(DependencyProperty dp,DependencyPropertyChangedCallback回调);
例如:

RegisterPropertyChangedCallback(ForegroundProperty、OnPropertyChanged);
RegisterPropertyChangedCallback(FontFamilyProperty,OnPropertyChanged);
RegisterPropertyChangedCallback(FontSizeProperty,OnPropertyChanged);
OnPropertyChanged
内部,我继续重新布线一些属性并使画布无效,以便更新图片

控件位于数据透视引用的数据模板(PivotHeaderTemplate)内。默认前景是未选择的状态(半透明的
SystemControlForegroundBaseMediumBrush
),选中时应获得默认的“白色”(SystemControlHighlightAltBaseHighBrush)

控件
前台
属性由模板应用,并根据活动树进行更新,但OnPropertyChanges仅在第一次调用。 例如,轴有两个视图:第一个视图开始选中,为白色;第二个视图未选中,为“灰色”。 如果我更改选择,视图将更改,两个控件上的前台属性也会相应更改,但不会调用
OnPropertyChanges
,我的画布也不会更改(因为无效逻辑在该方法中)

[更新:作为一种解决方法,我使用事件布局更新来检查更改的内容。]

对于测试项目,使用新的MyCanvas UserControl创建一个新的UWP XAML项目

MyCanvas.xaml:


MyCanvas.xaml.cs

使用系统;
使用Windows.UI;
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Media;
命名空间继承ControlProperty.Controls
{
公共密封部分类MyCanvas:UserControl
{
私有颜色值
{
获取{return(前景作为SolidColorBrush)?.Color??Colors.Black;}
}
公共MyCanvas()
{
初始化组件();
RegisterPropertyChangedCallback(ForegroundProperty、OnPropertyChanged);
}
私有void OnPropertyChanged(DependencyObject发送方,DependencyProperty dp)
{
content.Background=新的SolidColorBrush(值);
//这里的逻辑用于更复杂的画布管理
}
}
}
MainPage.xaml


项目1
项目2

您确定要在
UserControl
上更改这些属性吗?我不是以编程方式更改它们,它们是由模板应用的。在live property explorer窗口中,我看到它们已被更改。好的,我添加了一个点击事件来强制更改点击时的前景,在这种情况下,效果良好。似乎只有通过模板应用时才会出现问题。我已更改OP上的描述以匹配情况。请通过模板显示有关如何更新前景代码的代码。您应该始终显示出现问题的代码,无论它看起来多么简单或标准。您确定要在
UserControl
上更改这些属性吗?我不是以编程方式更改它们,它们是由模板应用的。在live property explorer窗口中,我看到它们已被更改。好的,我添加了一个点击事件来强制更改点击时的前景,在这种情况下,效果良好。似乎只有通过模板应用时才会出现问题。我已经更改了OP上的描述以符合情况。请显示有关如何通过模板更新前景代码的代码。您应该始终显示出现问题的代码,无论它看起来多么简单或标准。