从C+消费C#组件+/CX和C#

从C+消费C#组件+/CX和C#,c#,interop,c++-cx,C#,Interop,C++ Cx,我在C++/CX中创建了一个简单的控件SimpleControl.xaml,定义如下: <UserControl .. > // Attributes omitted for reading simplicity <Grid> <Grid.RowDefinitions> <RowDefinition Height="40"/> <RowDefinition Height="30"/> <RowDefinit

我在C++/CX中创建了一个简单的控件SimpleControl.xaml,定义如下:

<UserControl ..  > // Attributes omitted for reading simplicity
<Grid>

 <Grid.RowDefinitions>
    <RowDefinition Height="40"/>
    <RowDefinition Height="30"/>
 <RowDefinition Height="30"/>
 </Grid.RowDefinitions>

 <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100"/>
    <ColumnDefinition Width="*"/>
 </Grid.ColumnDefinitions>

    <Image x:Name="PersonaPicture" ... />
    <Border x:Name="PhotoTextBackdrop" ... />
    <TextBlock x:Name="PersonaName" .../>

</Grid>
</UserControl>
//为了便于阅读,省略了属性
然后,在使用C++/CX作为代码隐藏的文件“foo.xaml”中以以下方式使用此控件。SuperPanel继承自Windows.UI.Xaml.Controls.Panel,并在TastyLib组件中定义(由该C++/CX组件使用)。“furty”名称空间指向TastyLib。TastyLib组件用C#编码:


设置断点并查看手表,我观察到以下内容是面板的子项:

子[0]是Windows.UI.Xaml.UIElement,子[1]是 Windows.UI.Xaml.Shapes.Rectangle和子项[2]为 Windows.UI.Xaml.Controls.UserControl

现在,在手表中,我期望第一个孩子是一个SimpleControl,但是它是一个UIElement,这让我感到惊讶。那是从哪里来的?为什么它将SimpleControl的祖先显示为子[0],而它仍然可以将UserControl识别为子[2]

我在一个使用TastyLib的C#组件中重新创建了另一个SimpleControl(因此这个SimpleControl也是用C#编写的,没有使用C++/CX),并将该控件放在另一个超级面板中,与第一种情况完全相同(但这次都是用C#编写的)。在设置相同的断点并在“监视”窗口中查看时,我看到子[0]是我所期望的—一个SimpleControl。在这种情况下:

子[0]是FooProject.SimpleControl,子[1]是Windows.UI.Xaml.Shapes.Rectangle,子[2]是Windows.UI.Xaml.Controls.UserControl

这种二分法的根本原因是什么?用C++/CX编写的控件的行为不应该与用C#编写的控件的行为完全相同吗(当使用用C#编写的相同组件时)?我猜这与组件互操作性有关。有没有人遇到过类似的问题

如有任何建议,将不胜感激


非常感谢。

根据我所做的研究,问题是在使用C++/CX编写控件的情况下会跨越winRT边界,因此当CLR请求类型时,对象会从其GetRuntimeClassName实现返回Windows.UI.Xaml.UIElement(为什么?)


在使用C#开发控件的情况下,没有winRT边界被交叉,并且一个.NET对象正在与另一个.NET对象对话,因此类型是已知的。

听起来更像是对逻辑对象树和可视对象树之间的区别感到困惑。。。
</fruity:SuperPanel>
    <local:SimpleControl x:Name="gPerson1" Grid.Row="0" Grid.Column="0" />
    <Rectangle Fill="SaddleBrown" Height="50" Width="50" Grid.Row="1" Grid.Column="0" />
    <UserControl Grid.Row="2" Grid.Column="0" />
</fruity:SuperPanel>