gpt4 book ai didi

wpf - 不能使用属于与其父 Freezable 不同的线程的 DependencyObject

转载 作者:行者123 更新时间:2023-12-03 20:02:35 26 4
gpt4 key购买 nike

WPF - 我正在使用 BackgroundWorker 创建一个 Model3D 对象,但是当我想将它添加到 XAML 中定义的 Model3DGroup 时,出现异常:

Cannot use a DependencyObject that belongs to a different thread than its parent Freezable.



这是后面的全部代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
GeometryModel3D geometryModel3D = (GeometryModel3D)e.Result;
model3DGroup.Children.Add(geometryModel3D);
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
GeometryModel3D geometryModel3D = new GeometryModel3D();
e.Result = geometryModel3D;
}
}

这是整个 XAML:
    <Grid>
<Viewport3D Margin="4,4,4,4" Grid.Row="0" Grid.Column="0">
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup x:Name="model3DGroup">
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
</Grid>

最佳答案

在您的 RunWorkerCompleted 处理程序中,您将 GeometryModel3D 实例添加到 Model3DGroup 中,该实例显然是在 UI 线程以外的线程中创建的,因为 BackgroundWorker.DoWork 处理程序是在单独的线程中执行的。

简而言之,WPF 不允许这样做,正如您可能已经从异常消息中注意到的那样。所有 UI 元素,或者更准确地说,所有 DispatcherObject应用程序中的派生对象必须在同一个线程中创建。

获取 WPF 概述 Threading Model并参见 BackgroundWorker 中的备注部分文档。

编辑:但是,您可以通过同步调用 Dispatcher 来创建新的 GeometryModel3D 实例。您的 MainWindow 类(未经测试):

private void bw_DoWork(object sender, DoWorkEventArgs e)   
{
e.Result = Dispatcher.Invoke(
(Func<GeometryModel3D>)(() => new GeometryModel3D()));
}

关于wpf - 不能使用属于与其父 Freezable 不同的线程的 DependencyObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com