如何从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
具有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上的数据模板概述页面。