-1

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

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

我考虑创建一个人造绑定源对象,然后我可以绑定到该对象,但问题是它不是可视化树的一部分,因此除非该资源是在应用程序级别定义的,否则您将无法获得它。你也不能把东西塞进视觉树。

我已经看到一个使用可以定义 DependencyProperty 的行为的答案,并且当附加到 FrameworkElement 时,它们确实会像人们所怀疑的那样进行更新,但这需要 XAML,因为我不知道如何调用 FrameworkElement 的 setResourceReference 的等效行为.

所以……想法?

4

1 回答 1

0

如果没有使用,很难给出令人满意的答案。Behavior AKA 附加属性解决方案将起作用,但它使用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您可以绑定、获取通知并将值传递给转换器的方法。

于 2015-11-19T09:43:22.500 回答