6

コントロールをある親から別の親に移動しようとしています (これが機能するかどうかはよくわかりません)。動かしたいコントロールを掴むことができます。これが私のコードです:

public void MoveElement(UIElement uiElement)
{
    var element = ((FrameworkElement)uiElement).Parent;
    //TODO:Remove from parent
    myControl.Children.Add(uiElement);
}

最後のステートメントにヒットすると、「指定されたビジュアルは既に別のビジュアルの子であるか、CompositionTarget のルートです」という ArgumentException がスローされます。奇妙なことに、Parent は null を返します。親を見つける方法は?これでも機能しますか?

編集:実際に要素を移動することが私の問題に対する答えだとは思いません。私は Visual Studio SDK をUIElement使用しており、エディター ペインを構成する を手に入れることができました (extends DockPanel)。コントロールを標準エディターから開発中のカスタム ツール ウィンドウに移動しようとしていました。

これはハックであることが証明されており、同じコントロールの複数のインスタンスが必要であることに気付いたので、より複雑なソリューション (およびハックの少ない) が用意されていると思います。

4

1 に答える 1

7

プロパティはParent論理ツリーを参照しており、ドキュメントでは、「要素がインスタンス化された場合、Parent は null になる可能性がありますが、最終的にページ レベルのルート要素またはアプリケーション オブジェクトに接続する論理ツリーには関連付けられていません」と記載されています。たとえば、 でDataTemplateインスタンス化されたのルート要素にListBoxは null の親があります。

VisualTreeHelper.GetParent代わりに使用してみてください。ビジュアル ツリーは、WPF 要素がどのように構成されているかを示す下位レベルの表現であり、テンプレートなどによってそこにスローされる余分な「ビット」すべてにアクセスできます。たとえば、 a でインスタンス化されたVisualTreeHelper.GetParentのルート要素を呼び出すと、 aが返されます。DataTemplateListBoxContentPresenter

親ビジュアルを取得できるからといって、必ずしもそれを削除できるとは限らないことに注意してください。Panels などの一部の要素は、このためのメソッドを提供します。しかし、見つけた要素がたとえば a の一部である場合、CheckBoxそれを削除することはできないと思います。

ビジュアル ツリー内でコントロールを移動することによって、達成しようとしていることにもう少しコンテキストを提供できれば、人々はより具体的なアドバイスや別のアプローチを提供できるかもしれません。

于 2010-04-06T04:41:06.313 に答える