gpt4 book ai didi

c# - 可以等待 XamlReader.LoadAsync() 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:58 25 4
gpt4 key购买 nike

我有一个程序,用户可以在其中查看保存在 XAML 中的各种 3D 模型,然后使用 TrackballDecorator 操作 Viewport3D。这些 XAML 文件中包含转换,我使用问题 WPF 3D - How can I save and load a Camera view? 的答案中的修改将其应用于 TrackballDecorator。

我最近将项目切换到 .net 4.5 框架以利用 XamlReader 类的新异步功能,这导致与我访问随模型保存的转换的方式发生冲突。

我目前正在做的是:

private Task<TrackballDecorator> loadModel(string path)
{
var tempVP = new XamlReader().LoadAsync(XmlReader.Create(path)) as Viewport3D;
return new TrackballDecorator() { Content = tempVP, Transform = (tempVP.Camera.Transform as Transform3DGroup) };
}

这不起作用,因为 XamlReader 未完成加载,因此返回 null Transform。

我想做的是:

private async Task<TrackballDecorator> loadModelAsync(string path)
{
var tempVP = await new XamlReader().LoadAsync(XmlReader.Create(path)) as Viewport3D;
return new TrackballDecorator() { Content = tempVP, Transform = (tempVP.Camera.Transform as Transform3DGroup) };
}

但是因为 LoadAsync 方法返回一个 object而不是 Task<object>我不能使用 await 关键字。有什么方法可以克服或解决此限制?

最佳答案

这里有两个问题。

一方面,将 EAP 操作转换为任务的“规范”方法是使用 TaskCompletionSource并返回源的 Task属性(property)。事件处理程序调用 SetResult表示任务已完成并设置其结果。

你可以这样写:

public Task<ViewPort3D> LoadViewPortAsync(string path)
{
var tcs=new TaskCompletionSource();
var reader=XmlReader.Create(path);
ViewPort3D port=null;
var xr = new XamlReader();
xr.LoadCompleted += (o,e)=>{
tcs.SetResult(port);
reader.Dispose();
};
port=xr.LoadAsync(reader);

return tcs.Task;
}

一旦获得 ViewPort3D 对象,就可以创建转换

另一方面,“规范的”WPF 方法是观察发生变化的对象并对它们的变化使用react。 LoadAsync 返回根 XAML 对象并向其异步添加节点。由 ViewPort3D 适本地引发 INotifyPropertyChanged 并由 TrackballDecorator 和 Transforms 对这些变化使用react。

使用 TaskCompletionSource 只是第二个问题的解决方法。

关于c# - 可以等待 XamlReader.LoadAsync() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18089183/

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