如何从UserControl中删除子?

时间:2014-05-19 18:23:33

标签: c# wpf user-controls

这可能是一个愚蠢的问题,但我无法弄清楚如何做到这一点。我有一个名为" 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);
    }
 }

这不是完整的代码,只是很小的一部分来了解我试图管理的内容。 Line&#34; page.Content = reportGrid;&#34;是异常发生的地方。

2 个答案:

答案 0 :(得分:0)

UserControlContent属性(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);       
    }
 }

答案 1 :(得分:0)

@Stojdza,在WPF中,我们通常不会以这种方式操纵UI元素。我们操纵 data 元素并声明DataTemplate来定义数据的外观。因此,在您的情况下,您不应该真正移动Grid ...只需移动数据并让WPF使用相同的Grid在您想要的任何位置重新生成DataTemplate。它看起来会一样,但它会更容易,你可以省去所有这些麻烦。

所以,如果你有兴趣以简单的方式做到这一点,首先要创建一个具有UserControl所需的所有属性的类,让我们称之为Data。现在在DataTemplate中声明Application.Resources,以便您可以在整个应用范围内使用它:

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

现在,只要您想要显示Grid,无论是在集合中还是单独显示,您只需要将Data类型的属性(或它们的集合)绑定到某种形式的{ {1}}:

ContentControl

...

public Data Data { get; set; }

因此,您只需将数据复制到<ContentControl Content="{Binding Data}" /> 类型的另一个属性,然后使用上面的单行重新创建Grid,而不是尝试复制Data。有关Grid s。

的详细信息,请参阅MSDN上的Data Templating Overview页面