问题描述
我通过在 CreateTargetForCurrentView UIElement's 对象上调用 Compositor API 来使用它
auto visual = ElementCompositionPreview::GetElementVisual(elem);
auto compositor = visual->Compositor;
在此之后,由于我想创建一棵 Visual 树,它们之间具有排序感,以便我可以根据我的用例将视觉放在另一个之上,因此我创建了一个 {{3 }} 来托管这个视觉树。
auto containerVisual = compositor->CreateContainerVisual();
现在,由于此 ContainerVisual
需要附加到 CompositionTarget 的 root
,因此我这样做了(从 ContainerVisual 获取参考):
auto compositionTarget = compositor->CreateTargetForCurrentView();
但这会导致 DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED
,根据 here 暗示:
IDCompositionDevice::CreateTargetForHwnd 方法被调用 已存在可视化树的 hwnd 和最顶层参数。
如果我理解正确,这意味着 docs 在我的 UWP 应用的生命周期中以某种方式被调用。此 API 是未直接在应用中使用的 Win32
API。现在我的问题是,在 UWP 应用程序中,Windows.UI.Composition
命名空间或任何其他命名空间下的什么 API,在 C++/Cx
投影下,我应该寻找可能在内部调用 IDCompositionDevice::CreateTargetForHwnd
导致这个例外?或者更好的是,是否有任何 API 可用于从 CompositionTarget
或 View
中提取 Window
?我看到 CompositionRootVisual
类中有一个属性 CoreApplicationView
可用于直接附加 ContainerVisual
,但根据 IDCompositionDevice::CreateTargetForHwnd 在其中一个 API 更新中将其删除.
| public class Windows.ApplicationModel.Core.CoreApplicationView {
- public Visual CompositionRootVisual { get; set; }
| }
奇怪的是,即使 this 指的是这种将 ContainerVisual
附加到 View
的方法,但文档显然已经过时了。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)