通过反射修改调度程序对象中的_dispatcher字段,以跨线程修改调度程序对象对象的属性?



是否可以通过反射修改调度程序对象中的_dispatcher字段,以跨线程修改调度器对象对象的属性?

我是 wpf 开发的新手。通过观察 DispatcherObject 的源代码,我了解到 DispatcherObject 对象只能由其关联的 Dispatcher 访问。在跨线程的情况下,我可以通过修改_dispatcher字段来修改访问权限,以便当前线程可以正常运行吗?调度程序对象,这个问题已经困扰了我很长时间。

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread threadOri = Thread.CurrentThread;
Thread thread = new Thread(() =>
{
FieldInfo field = typeof(DispatcherObject).GetField("_dispatcher", BindingFlags.NonPublic | BindingFlags.Instance);
DispatcherObject obj = new UIElement();
field.SetValue(btn, obj.Dispatcher);
try
{
btn.Width = 100;
}
catch
{ }
try
{
btn.Height = 100;
}
catch
{ }
try
{
//There is an error here
TextBox tbx = new TextBox();
field.SetValue(tbx, Dispatcher.FromThread(threadOri));
btn.Content = tbx;
}
catch
{ }

field.SetValue(btn, Dispatcher);
});
thread.TrySetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
//Why is there no automatic redraw?
btn.Visibility = Visibility.Collapsed;
btn.Visibility = Visibility.Visible;
}
}

更改可视化树中单个 UI 元素的Dispatcher属性没有意义,因为树中的所有元素都必须具有相同的线程相关性。

如果需要从后台线程创建 UI 元素,则必须在 UI 线程的调度程序中调用创建代码,就像对 UI 元素的任何其他访问一样:

btn.Dispatcher.Invoke(() =>
{
btn.Content = new TextBlock { Text = "Click Me!" };
});

最新更新