WPFのウィンドウからコントロールを削除するにはどうすればよいですか? RemoveLogicalChild
は、論理的な子として削除するだけですが、表示されたままにします。
ビジュアルツリーのすべての要素は、Window
のようなツリーのルート、または別の要素の子のいずれかです。理想的には、削除しようとしている要素の親である要素と、それがどのタイプのFrameworkElement
であるかを知っているはずです。
たとえば、Canvas
と多くの子があり、以前にRectangle
に追加されたCanvas
がある場合、それを削除することでビジュアルツリーから削除できます。このようにCanvas
から:
canvas.Children.Remove(control);
ただし、コントロールの親が誰であるかknowでない場合は、 VisualTreeHelper.GetParentメソッド を使用して次のことを確認できます。
DependencyObject parent = VisualTreeHelper.GetParent(control);
現在直面している問題はparent
がDependencyObject
であり、おそらくFrameworkElement
でもありますが、which /がわかりません。ある種の要素。子を削除する方法はタイプによって異なるため、これは重要です。親がButton
の場合は、Content
プロパティをクリアするだけです。親がCanvas
の場合は、Children.Remove
を使用する必要があります。
一般に、アイテムがPanel
であるかどうかを確認してから子から削除することで、最も一般的なケースを処理できます。そうでない場合は、ContentControl
(Window
など)の場合です。 )次に、そのContent
プロパティをnull
に設定します。しかし、これは絶対確実ではありません。他の場合もあります。
また、テンプレートから展開されたものは、自由に変更できる静的コンテンツではないため、削除しないように注意する必要があります。コントロールを追加した場合、または静的XAMLに存在した場合は、安全に削除できます。
親タイプを確認するには、GetTypeメソッドを使用してtoStringメソッドを追加して比較することもできます。たとえば、親オブジェクトがキャンバスの場合、文字列「System.Windows.Controls.Canvas」が返されます。
これを使用して、この場合はキャンバスから子を削除できます。
private void RemoveControl()
{
name = myUserControl.GetValue(NameProperty).ToString();
myCanvas.Children.Remove(myUserControl);
NameScope.GetNameScope(this).UnregisterName(name);
}