次のように定義された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#で記述された同じコンポーネントを使用する場合)?コンポーネントの相互運用性と関係があると思います。誰かが同様の問題に直面しましたか?
何かアドバイスをいただければ幸いです。
どうもありがとう。