如何从UserControl中移除子控件

本文关键字:控件 UserControl | 更新日期: 2023-09-27 18:04:18

这可能是愚蠢的问题,但我只是不知道如何做到这一点。我有一个名为"ReportUserControl"的UserControl,在它里面我有一个名为"ReportGrid"的网格。我想从ReportUserControl子节点中删除ReportGrid。我试过了:

ReportUserControl control = new ReportUserControl();
control.Children.Remove(...);

问题是UserControl没有。children . remove()选项。我该怎么做呢?

我想"发送"这个网格到另一个类,并在那里使用它。问题是,当我发送网格并尝试在另一个类中使用它时,我得到这样的结果:"指定的元素已经是另一个元素的逻辑子元素。所以我不得不把它从我的UserControl中删除,但不知道怎么做。

ReportUserControl XAML:

<UserControl x:Class="WPFReportTest.ReportUserControl "
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         Height="29.7cm" Width="21cm">
     <Grid Name="ReportGrid">
          ****GridContent***
     </Grid>
</UserControl>

ReportClass:

public class ReportingClass
{
   Grid reportGrid;
   public ReportingClass(Grid tempGrid)
   {
       reportGrid = tempGrid;
   }
   public Page SetPageContent()
   {
       Page page = new Page();
       page.Content = reportGrid;
   }      
}

InstanceWindow

 public partial class MainWindow : Window
 {
    public MainWindow()
    {
        InitializeComponent();
        ReportUserControl userControl = new ReportUserControl();
        ReportingClass report = new ReportingClass(userControl.ReportGrid);
    }
 }

这不是完整的代码,只是一小部分来了解我想要管理的内容。线"页面。

如何从UserControl中移除子控件

UserControl具有Content属性(msdn)。

如果要删除内容集null:

ReportUserControl control = new ReportUserControl();
control.Content = null;

例子:

public class ReportingClass
{
    ReportUserControl _reportUserControl;
    Grid reportGrid;
    public ReportingClass(ReportUserControl reportUserControl, Grid tempGrid)
    {
        _reportUserControl = reportUserControl;
        reportGrid = tempGrid;
    }
    public Page SetPageContent()
    {
        Page page = new Page();
        // _reportUserControl is the instance of object ReportUserControl where content is reportGrid
        _reportUserControl.Content = null;
        page.Content = reportGrid;
        return page;
    }
}
编辑:

 public partial class MainWindow : Window
 {
    public MainWindow()
    {
        InitializeComponent();
        ReportUserControl userControl = new ReportUserControl();
        ReportingClass report = new ReportingClass(userControl, userControl.Content as Grid);       
    }
 }

@Stojdza,在WPF中,我们通常不会这样操作UI元素。我们操作data元素,并声明DataTemplate s来定义数据的样子。所以在你的情况下,你不应该真的移动Grid…只需移动数据,让WPF使用相同的DataTemplate在任何您想要的地方重新生成Grid。它看起来是一样的,但它更容易,你会省去所有的麻烦。

所以,如果你对简单的方法感兴趣,首先创建一个类,它具有UserControl所需的所有属性,我们称它为Data。现在在Application.Resources中声明一个DataTemplate,这样你就可以在整个应用程序范围内使用它:

<DataTemplate DataType="{x:Type YourNamespacePrefix:Data}">
    <!-- Define your Grid here -->
<DataTemplate>

现在无论何时你想显示你的Grid,无论是在一个集合中,还是单独显示,你只需要绑定一个类型为Data(或它们的集合)的属性到某种形式的ContentControl:

public Data Data { get; set; }

<ContentControl Content="{Binding Data}" />

因此,与其尝试复制Grid,不如将数据复制到类型为Data的另一个属性中,并使用上面的单行重新创建Grid。有关DataTemplate s的更多信息,请参阅MSDN上的数据模板概述页面。