2

次のように定義された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コンポーネントによって使用される)で定義されます。'fruity'名前空間はTastyLibを指します。TastyLibコンポーネントは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#で記述された同じコンポーネントを使用する場合)?コンポーネントの相互運用性と関係があると思います。誰かが同様の問題に直面しましたか?

何かアドバイスをいただければ幸いです。

どうもありがとう。

4

1 に答える 1

1

私が行った調査によると、C ++ / CXで記述されたコントロールの場合、winRTの境界を越えるため、CLRが型を要求すると、オブジェクトはその型からWindows.UI.Xaml.UIElementを返します。 GetRuntimeClassNameの実装(なぜ?)。

C#を使用して開発されたコントロールの場合、winRTの境界を越えることはなく、.NETオブジェクトは別の.NETオブジェクトと通信しているため、タイプは既知です。

于 2013-03-07T19:28:39.440 に答える