WPF:是否有资源更改时触发的事件
本文关键字:事件 是否 资源 WPF | 更新日期: 2023-09-27 17:56:31
有没有办法在特定 WPF 资源的值更改时收到通知?
我们需要动态调整 WPF 应用程序中的内容字体大小...对于 WPF 控件,我们将Control.FontSize
设置为动态资源,字体会自动调整大小。不幸的是,我们还有一个嵌入式 winforms 控件,其字体大小不能以这种方式设置。这个想法是订阅在每个资源值更改时触发的事件,并实现 winforms 控件的自定义刷新。有什么建议吗?
提前谢谢你!
所以,
在考虑了所有可能的方法之后,我引入了一个新行为,该行为会在每次更改特定WPF
资源时触发事件。
可以从 https://github.com/jeromerg/ResourceChangeEvent 下载或克隆源。
public class ResourceChangeNotifierBehavior
: System.Windows.Interactivity.Behavior<FrameworkElement>
{
public static readonly DependencyProperty ResourceProperty
= DependencyProperty.Register("Resource",
typeof(object),
typeof(ResourceChangeNotifierBehavior),
new PropertyMetadata(default(object), ResourceChangedCallback));
public event EventHandler ResourceChanged;
public object Resource
{
get { return GetValue(ResourceProperty); }
set { SetValue(ResourceProperty, value); }
}
private static void ResourceChangedCallback(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs args)
{
var resourceChangeNotifier = dependencyObject as ResourceChangeNotifierBehavior;
if (resourceChangeNotifier == null)
return;
resourceChangeNotifier.OnResourceChanged();
}
private void OnResourceChanged()
{
EventHandler handler = ResourceChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
}
以便事件处理程序OnResourceChanged
可以挂接在XAML
文件中,如下所示:
<i:Interaction.Behaviors>
<Behaviours:ResourceChangeNotifierBehavior
Resource="{DynamicResource MyDynamicResourceKey}"
ResourceChanged="OnResourceChanged"/>
</i:Interaction.Behaviors>
希望,它有帮助...
我遇到了同样的问题,但我确实想在任何资源发生变化时得到通知。在我的例子中,DynamicResource
用于某些不在可视化树中的DependencyObject
。因此,如果资源发生更改,该属性不会自动更新。
使用 jeromerg 找到的内部事件,我编写了一个小的扩展方法来注册ResourceChanged
事件:
public static void NotifyOnResourcesChanged(this FrameworkElement element, EventHandler onResourcesChanged)
{
ResourcesChangedEvent.AddMethod.Invoke(element, new object[] { onResourcesChanged });
}
private static readonly EventInfo ResourcesChangedEvent = typeof(FrameworkElement).GetEvent("ResourcesChanged", BindingFlags.Instance | BindingFlags.NonPublic);
在我的事件处理程序中,我通过 InvalidateProperty
通知目标属性以强制更新。