将控件设置为多个控件的内容

本文关键字:控件 设置 | 更新日期: 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;
        }
    }
}