none
WPF 継承クラスに対してVisualTreeHelper.GetChildrenCountを実行する方法 RRS feed

  • 質問

  • ComboBoxを継承したユーザーコントロールに対してVisualTreeHelper.GetChildrenCountを実行すると、結果が0になってしまいます。

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="729">

        <Grid Height="342" Name="mygrid1">
            <ComboBox Height="18" HorizontalAlignment="Left" Margin="460,86,0,0" Name="cb2" VerticalAlignment="Top" Width="112" />

        </Grid>
    </Window>


    'ComboBoxを継承するダミーのクラス
    Public Class ComboBox_user0
        Inherits ComboBox

    End Class

    '上記のインスタンス
    Public cb1 As New ComboBox_user0()

    Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Me.mygrid1.Children.Add(cb1)    ’アプリケーションウィンドウに表示

            Dim count1 = VisualTreeHelper.GetChildrenCount(cb1)    ’結果:0
            Dim count2 = VisualTreeHelper.GetChildrenCount(Me.cb2) ’結果:1

    End Sub

    ----------------
    下から3行目のDim count1 = VisualTreeHelper.GetChildrenCount(cb1)という行でブレークし、cb1とcb2に対してWPFビジュアライザーを使ってツリーを表示させると、cb1では子ツリーが無く、cb2ではツリーが接続されているという結果になります。
    継承クラスにおいてもこれをComboBoxスーパークラスとして扱い、VisualTreeHelper.GetChildrenCount(cb1)に数値が入る様にしたいのですが、方法を御教授願います。

    2016年5月12日 5:34

回答

  • こんにちは。

    これは継承したコントロールかどうかは関係なく、VisualTreeが構築されるタイミングの問題だと思います。
    通常のコンボボックスでもこのタイミングではGetChildrenCountの結果は0になるのではないでしょうか。
    最初からXAMLでコントロールを追加しておけば継承したコントロールでもGetChildrenCountは1になると思います。

    例えば、Window.LoadedのタイミングではなくコンストラクタのタイミングでGridへコンボボックスを追加すればGetChildrenCountで取得できます。
    Window.Loadedのタイミングで追加したい場合は、Gridへの追加後にcb1.ApplyTemplate()を呼び出してみてください。
    GetChildrenCountの結果が変わると思います。


    2016年5月12日 5:54
    モデレータ

すべての返信

  • こんにちは。

    これは継承したコントロールかどうかは関係なく、VisualTreeが構築されるタイミングの問題だと思います。
    通常のコンボボックスでもこのタイミングではGetChildrenCountの結果は0になるのではないでしょうか。
    最初からXAMLでコントロールを追加しておけば継承したコントロールでもGetChildrenCountは1になると思います。

    例えば、Window.LoadedのタイミングではなくコンストラクタのタイミングでGridへコンボボックスを追加すればGetChildrenCountで取得できます。
    Window.Loadedのタイミングで追加したい場合は、Gridへの追加後にcb1.ApplyTemplate()を呼び出してみてください。
    GetChildrenCountの結果が変わると思います。


    2016年5月12日 5:54
    モデレータ
  • Tak1waさん、いつもありがとうございます。

    cb1.ApplyTemplate()で正常に処理できました。
    WPFの画面描画は逐次処理されないので難しいです。

    2016年5月12日 7:22