1

次のように、プロジェクトにユーザーコントロールを追加しました。

    Public Sub clickAutoDrillLeft(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)

    Dim LSliderItem as New TriplexAmpsControl   
    me.LeftSlider.Items.Add(LSliderItem)

End sub

「LSliderIn」オブジェクトはアイテムコントロールであり、「TriplexAmpsControl」は、「AmpsPhaseA」、「AmpsPhaseB」、および「AmpsPhaseC」という名前の整数として宣言された3つの書き込み専用プロパティを持つユーザーコントロールです。

上記のように実行時にコントロールをインスタンス化すると、次のようなプロパティの1つに値をすぐに割り当てることができます。

    Public Sub clickAutoDrillLeft(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)

    Dim LSliderItem as New TriplexAmpsControl   
    me.LeftSlider.Items.Add(LSliderItem)
    LSliderItem.AmpsPhaseA = 50

End sub

ただし、サブルーチン内でのみ。フォームの他の場所でコントロール値を参照する方法がわかりません。他のサブからその名前でコントロールを呼び出そうとすると、当然、コンパイラーは、コントロールがプロジェクトの一部ではないことを通知します。まだ作成されていません。

このテーマで私が見つけたのは、コードビハインドでのコントロールの作成に関するものだけですが、ユーザーコントロールに接続する方法に注目すると、私が行った方法でインスタンス化されました。

4

1 に答える 1

0

(先制メモ:私のVBを失礼します-私はC#コーダーです:)

モジュールレベルの変数を作成する必要があります。

Dim _lSliderItem as TriplexAmpsControl

次に、コードのどこかに:

Public Sub clickAutoDrillLeft(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)
    _lSliderItem = New TriplexAmpsControl   
    me.LeftSlider.Items.Add(_lSliderItem)
End sub

または、そのアプローチが何らかの理由で問題外の場合は、動的に作成されたコントロールに名前を付け、後でコードでFrameworkElement.FindName()メソッドを使用できます(ほとんどのUIコントロールはFrameworkElementから派生します)。または、次のような独自の小さな検索関数をコーディングすることもできます(C#構文を使用してください。これを、VBに変換しても問題はありません)。

    public static DependencyObject FindChild(this DependencyObject o, Type childType, string childName, bool checkObjectItself)
    {
        if (checkObjectItself && (((string)o.GetValue(FrameworkElement.NameProperty)) == childName))
            return o;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
        {
            DependencyObject obj2 = VisualTreeHelper.GetChild(o, i).FindChild(childType, childName, true);
            if (obj2 != null)
                return obj2;
        }

        return null;
    }
于 2010-10-05T01:08:16.093 に答える