我有一个控件,我将对话作为内容。由于这个对话框的重新定义,我每次需要它时都必须创建它(显示/隐藏不会这样做)。我希望我的控件能够记住调用之间的字段内容。虽然我可以应用viewmodel来实现这一点,但我更喜欢将控制作为一个字段,并在每次需要时将其作为对话内容。但是我遇到了以下错误:
“指定的元素已经是另一个元素的逻辑子元素。首先断开它。”
我试图在关闭对话框窗口的内容之前将其赋予null,但它并没有解决问题。有什么我可以做的吗?
答案 0 :(得分:1)
设置window.Content = null对我来说很好。以下是我使用的代码:
public partial class MainWindow : Window
{
TextBlock textBlock = new TextBlock();
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
TestWindow testWindow = new TestWindow();
testWindow.Content = textBlock;
testWindow.Closing += HandleTestWindowClosing;
testWindow.Show();
}
void HandleTestWindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
var testWindow = sender as TestWindow;
if(testWindow!=null)
{
testWindow.Content = null;
testWindow.Closing -= HandleTestWindowClosing;
}
}
}
答案 1 :(得分:0)
查看以下工作示例。这不完全是您的情况,但非常接近。关键是将'Child'属性设置为null。它将TextBox从顶部边框移动到底部。
<Window x:Class="SO.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Button Grid.Row="0" Click="Move_Click">Move</Button>
<Border x:Name="topBorder" Grid.Row="1">
<TextBlock x:Name="ctrl">Some Text Block</TextBlock>
</Border>
<Border x:Name="bottomBorder" Grid.Row="2"/>
</Grid>
</Window>
和背后的代码:
using System.Windows;
namespace SO
{
public partial class MainWindow :Window
{
public MainWindow( )
{
InitializeComponent( );
}
private void Move_Click( object sender, RoutedEventArgs e )
{
this.topBorder.Child = null;
this.bottomBorder.Child = this.ctrl;
}
}
}