web-dev-qa-db-ja.com

WPFのウィンドウからコントロールを削除する

WPFのウィンドウからコントロールを削除するにはどうすればよいですか? RemoveLogicalChildは、論理的な子として削除するだけですが、表示されたままにします。

19
Casebash

ビジュアルツリーのすべての要素は、Windowのようなツリーのルート、または別の要素の子のいずれかです。理想的には、削除しようとしている要素の親である要素と、それがどのタイプのFrameworkElementであるかを知っているはずです。

たとえば、Canvasと多くの子があり、以前にRectangleに追加されたCanvasがある場合、それを削除することでビジュアルツリーから削除できます。このようにCanvasから:

canvas.Children.Remove(control);

ただし、コントロールの親が誰であるかknowでない場合は、 VisualTreeHelper.GetParentメソッド を使用して次のことを確認できます。

DependencyObject parent = VisualTreeHelper.GetParent(control);

現在直面している問題はparentDependencyObjectであり、おそらくFrameworkElementでもありますが、which /がわかりません。ある種の要素。子を削除する方法はタイプによって異なるため、これは重要です。親がButtonの場合は、Contentプロパティをクリアするだけです。親がCanvasの場合は、Children.Removeを使用する必要があります。

一般に、アイテムがPanelであるかどうかを確認してから子から削除することで、最も一般的なケースを処理できます。そうでない場合は、ContentControlWindowなど)の場合です。 )次に、そのContentプロパティをnullに設定します。しかし、これは絶対確実ではありません。他の場合もあります。

また、テンプレートから展開されたものは、自由に変更できる静的コンテンツではないため、削除しないように注意する必要があります。コントロールを追加した場合、または静的XAMLに存在した場合は、安全に削除できます。

24
Rick Sladkey

親タイプを確認するには、GetTypeメソッドを使用してtoStringメソッドを追加して比較することもできます。たとえば、親オブジェクトがキャンバスの場合、文字列「System.Windows.Controls.Canvas」が返されます。

0
Emile Nouatin

これを使用して、この場合はキャンバスから子を削除できます。

private void RemoveControl()
{
   name = myUserControl.GetValue(NameProperty).ToString();               
   myCanvas.Children.Remove(myUserControl);
   NameScope.GetNameScope(this).UnregisterName(name);
}
0
luka