如何在没有 DependencyProperty 的情况下收到 DynamicResource 更改(相对于特定 Fra

本文关键字:更改 DynamicResource 相对于 Fra DependencyProperty 情况下 | 更新日期: 2023-09-27 18:22:27

有一个奇怪的请求。 当动态资源相对于框架元素发生更改时,我需要收到通知,但我没有在该框架元素设置属性。 因此,我不能在 XAML 中使用{DynamicResource someKey},也不能在代码隐藏中使用someElement.SetResourceReference()

现在获取当前值很容易。 您只需调用someElement.FindResource("someKey"),即可获得当前值,但这需要轮询。

我考虑过创建一个假绑定源对象,然后我可以绑定到该对象,但问题是它不是可视化树的一部分,因此除非在应用程序级别定义该资源,否则您将无法获得它。 您也不能只是将内容塞入可视化树中。

我见过一个答案,它使用可以定义依赖属性的行为,当附加到框架元素时,它们确实会像人们怀疑的那样更新,但这需要 XAML,因为我不知道如何调用 FrameworkElement 的 setResourceReference 的行为等效项。

所以......想法?

如何在没有 DependencyProperty 的情况下收到 DynamicResource 更改(相对于特定 Fra

如果没有用法,很难给出令人满意的答案。行为又名附加属性解决方案将起作用,但它使用DependencyProperty

public static class AttachedProperty
{
    public static readonly DependencyProperty DynamicResourceProperty = DependencyProperty.RegisterAttached("DynamicResource", typeof(object), typeof(AttachedProperty), new PropertyMetadata(null));
    public static object GetDynamicResource(DependencyObject obj)
    {
        return (object)obj.GetValue(DynamicResourceProperty);
    }
    public static void SetDynamicResource(DependencyObject obj, object value)
    {
        obj.SetValue(DynamicResourceProperty, value);
    }
}

在要跟踪其资源的元素上设置附加属性。

<Grid x:Name="grid" my:AttachedProperty.DynamicResource="{DynamicResource Brush}"/>

这是一个您可以绑定、获取通知并将值传递给转换器的DependecyProperty