拦截任何第三方内部类的创建以修改属性

问题描述 投票:0回答:1

首先介绍一下背景。在我的应用程序中,我有许多第三方控件,其中之一包括对普通 WPF 控件的主题和样式更改。我遇到的问题是我还使用了来自不同第三方的控件,该控件内是一个内部窗口。

我遇到的问题是第一个第三方样式使该窗口的布局全部错误。

我希望实现的是在创建此内部窗口时拦截并修改其属性的某种方法。如果我可以在此实例上将“ThemeName”属性设置为“None”,则窗口的样式和布局是固定的。我已经使用 Snoop 尝试并测试了这一点。我还可以拦截 Window 的 Show() / ShowDialog() 方法并执行一些检查?

通过搜索 Castle 似乎是我发现的所有示例都推荐的,需要类来配置,但我不能这样做,因为它将无法编译,因为该类是内部的,因此无法访问。

不幸的是,我不确定可以分享什么代码。我可以使用 Type.GetType 获取类型,然后可以使用 Activator.CreateInstance 创建实例,但我坚持设置属性并连接拦截。

我对AOB不太熟悉。

c# castle-dynamicproxy
1个回答
0
投票

好吧,事实证明我把这个问题搞得太复杂了,而实际的修复结果却非常简单。

在 App.xaml.cs App() 构造函数中,我注册了以下类处理程序来侦听任何 Window Loaded 事件。

EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent, new RoutedEventHandler(WindowLoaded));

然后在该方法中,我检查窗口的类型并根据需要重写该属性。

static void WindowLoaded(object sender, RoutedEventArgs e)
{
    if (sender.GetType().Name.Contains("InternalWindowClassName"))
        ThemeManager.SetThemeName(sender as DependencyObject, Theme.NoneName);
}

也可以用

(sender as DependencyObject).SetValue(DependencyProperty, value);
© www.soinside.com 2019 - 2024. All rights reserved.