0

編集:問題は、名前スコープを作成して名前を登録することではありませんでした。現在作業中です。以下に回答を示します。

元の質問:

プログラムでコントロールを WPF 画面に追加するときに、何か間違ったことをしていると思います。

WPF DevEx LayoutControl を使用してレイアウトを保存およびロードできる、ドラッグ アンド ドロップで構成可能な UI のこのプロトタイプを試してみました。

動作していましたが、Visual Studio で作成した静的な WPF 画面を使用してから、FrameworkElements をプログラムで追加した画面に変更したときに壊れました。

以下は、LayoutControl に要素を追加する簡単なテストです。

    public static void InstallItemsInLayoutControl(LayoutControl layoutControl)
    {
        // FAKE TEST VERSION
        Button btn = new Button();
        btn.Name = "TESTBUTTON";
        btn.Content = "Test Me";
        btn.Height = 23;
        btn.Width = 100;
        btn.HorizontalAlignment = HorizontalAlignment.Left;
        btn.VerticalAlignment = VerticalAlignment.Top;
        btn.Width = 100;

        layoutControl.Children.Add(btn);
    }

以下の結果では、空の画面に追加された項目はこれだけです。

この画面をロードしてドラッグ アンド ドロップ編集モードを有効にすると、確かにそのボタンが表示されます。表示されませんが、使用可能なアイテムから画面にプルして移動し、見栄えの良い XML にレイアウトを保存できます。たとえば、トップ レベルにあるこのボタン以外は画面上に何もない単純なレイアウトを次に示します。

  <?xml version="1.0" encoding="utf-8" ?> 
- <LayoutControl Orientation="Vertical">
  <Element ID="TESTBUTTON" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="23" /> 
  <AvailableItems /> 
  </LayoutControl

ボタンを画面から削除して保存すると、XML は正しく異なって見えます。

  <?xml version="1.0" encoding="utf-8" ?> 
- <LayoutControl Orientation="Vertical">
- <AvailableItems>
  <Element ID="TESTBUTTON" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="23" /> 
  </AvailableItems>
  </LayoutControl>

(ボタンはレイアウトではなく、使用可能なアイテムにあることに注意してください)

DevEx コードを調べたところ、XML 要素から ID を取得し、それを FrameworkElement.FindName(string) に渡しました。

ランタイム オブジェクトの ID と Name プロパティが一致しているようです。

WPF ツリー ビジュアライザーを見ると、最初にこの画面を表示したとき、階層が次のように見えることがビジュアル ツリーでわかります。

AdornerDecorator->AvalonAdapter->LayoutControl->ItemsContainer->TESTBUTTON

この ItemsContainer の間接化が何であるかはわかりませんが、それは「使用可能なアイテム」コンテナであると思われます。これは、画面上にはないものの、カスタマイズできるものがぶら下がっている場所です。

ビジュアライザーは、実行時の Name プロパティが実際に TESTBUTTON であることを示しています。

この正確なシナリオは、プログラムによって追加されていないアイテムで動作していました。私の次のステップは、デザイン時の要素もそこに配置することだと思います。

しかし、私はWPFに非常に慣れていません。これを説明するボタンを追加する方法に間違いがあることは明らかですか?

ありがとう。

4

1 に答える 1

1

名前のスコープを含めずに名前を登録したため、名前の検索は実際に失敗していました。

正しい実装は次のとおりでした。

  1. インスタンス化時に LayoutControl の名前スコープを作成します。

    NameScope.SetNameScope(layoutControl, new NameScope());
    
  2. ボタンの名前を登録する:

    public static void InstallItemsInLayoutControl(LayoutControl layoutControl)
    {
        // FAKE TEST VERSION
        Button btn = new Button();
        btn.Name = "TESTBUTTON";
        btn.Content = "Test Me";
        btn.Height = 23;
        btn.Width = 100;
        btn.HorizontalAlignment = HorizontalAlignment.Left;
        btn.VerticalAlignment = VerticalAlignment.Top;
        btn.Width = 100;
        layoutControl.RegisterName(btn.Name, btn);  // THIS LINE WAS MISSING
        layoutControl.Children.Add(btn);
    }
    
于 2012-08-02T02:48:44.683 に答える