繁体   English   中英

使用C ++ / CX和C#中的C#组件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM