从C+消费C#组件+/CX和C#
我在C++/CX中创建了一个简单的控件SimpleControl.xaml,定义如下:从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
<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>