将控件设置为多个控件的内容
本文关键字:控件 设置 | 更新日期: 2023-09-27 18:24:33
我有一个控件,我将它作为内容放在对话框中。由于这个对话框的重新启用,我必须在每次需要时都创建它(显示/隐藏不会起作用)。我希望我的控件在调用之前记住字段内容。虽然我可以应用视图模型来实现这一点,但我更喜欢将控制作为一个字段,并在每次需要时将其作为对话框的内容。但我遇到了以下错误:
"指定的元素已经是另一个元素的逻辑子元素。请先断开连接。"
在关闭对话框窗口之前,我尝试将null附加到对话框窗口的内容中,但这并不能解决问题。我能做什么吗?
设置窗口。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;
}
}
}
查看下面的工作示例。这并不完全是你的场景,但非常接近。该键正在将"Child"属性设置为null。它将文本框从顶部边框移动到底部。
<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;
}
}
}