如何将 ItemsPanelRoot 转换为 SwapChainPanel

How to cast ItemsPanelRoot to SwapChainPanel

我在 UWP 平台上使用 HelixToolkit。最近我试图改变它的一些功能,所以我写了一个新的视口,模仿 HelixToolkit 中的一个。这是我遇到的一个问题,但在 HelixToolkit 中没有发生。

要在视口中创建一个 SwapChainPanel(从 ItemsControl class 派生的 class),HelixToolkit 直接将 ItemsPanelRoot 转换为 SwapChainPanel。

this.d3dTarget = new SwapChainTarget((SwapChainPanel)this.ItemsPanelRoot, this);

但是,当我的代码走到这一行时,运行时弹出异常:

System.InvalidCastException: Unable to cast object of type 'Windows.UI.Xaml.Controls.StackPanel' to type 'Windows.UI.Xaml.Controls.SwapChainPanel'.

在选角之前暂停一下,我明白了 为什么显示 StackPanel?

如果我在 HelixToolkit 之前暂停,它会显示一堆内部异常。

造成这两种差异的原因可能是什么?是否有替代方法以包含其他项目的包装方式创建交换链?

您引用的行不会创建 SwapChainPanel,它只是检索 ItemsPanelTemplate 中的 SwapChainPanel

这发生在这里:https://github.com/helix-toolkit/helix-toolkit/blob/d386c9e1313ae1bbb1c179a17007e9b59ae221a6/Source/HelixToolkit.UWP/Themes/Generic.xaml

<Style TargetType="controls:Viewport3DX">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <SwapChainPanel/>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

如果您想重现相同的行为,请确保 ItemsPanelItemsPanelTemplate 已相应设置。