[英]Consuming C# component from C++/CX and C#
我在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>
然后,在文件“ foo.xaml”中以以下方式使用此控件,该文件使用C ++ / CX作为后面的代码。 SuperPanel继承自Windows.UI.Xaml.Controls.Panel,并且在DeliciousLib组件(此C ++ / CX组件使用)中定义。 “果味”命名空间指向TastyLib。 DeliciousLib组件使用C#编码:
</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>
设置一个断点并看着手表,我观察到以下是面板的孩子:
child [0]是Windows.UI.Xaml.UIElement,child [1]是Windows.UI.Xaml.Shapes.Rectangle,child [2]是Windows.UI.Xaml.Controls.UserControl
现在,在手表中,我期望第一个孩子是一个SimpleControl,但是它是一个UIElement,这令我感到惊讶。 那个是从哪里来的? 为什么它在仍可以将UserControl识别为child [2]的同时将SimpleControl的祖先显示为child [0]?
我在使用TastyLib的C#组件中重新创建了另一个SimpleControl(因此,此SimpleControl也用C#编写,并且未使用C ++ / CX),并将该控件放入另一个SuperPanel中,就像第一种情况一样(但这次全部在C#中) 。 在设置相同的断点并在监视窗口中查看时,我看到child [0]是我所期望的-SimpleControl。 在这种情况下:
child [0]是FooProject.SimpleControl,child [1]是Windows.UI.Xaml.Shapes.Rectangle,child [2]是Windows.UI.Xaml.Controls.UserControl
这种二分法的根本原因是什么? 用C ++ / CX编写的控件不应该像使用C#编写的控件那样行为完全相同(当使用用C#编写的相同组件时)? 我猜想这与组件的互操作性有关。 有没有人遇到过类似的问题?
任何意见,将不胜感激。
非常感谢。
根据我所做的研究,问题在于使用C ++ / CX编写的控件的情况下会跨越winRT边界,因此当CLR要求输入类型时,对象从其返回的Windows.UI.Xaml.UIElement返回GetRuntimeClassName实现(为什么?)。
如果使用C#开发控件,则不会跨越winRT边界,并且.NET对象正在与另一个.NET对象讲话,因此类型是已知的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.