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

时间:2012-02-15 09:07:22

标签: c# .net wpf

我有一个控件,我将对话作为内容。由于这个对话框的重新定义,我每次需要它时都必须创建它(显示/隐藏不会这样做)。我希望我的控件能够记住调用之间的字段内容。虽然我可以应用viewmodel来实现这一点,但我更喜欢将控制作为一个字段,并在每次需要时将其作为对话内容。但是我遇到了以下错误:

“指定的元素已经是另一个元素的逻辑子元素。首先断开它。”

我试图在关闭对话框窗口的内容之前将其赋予null,但它并没有解决问题。有什么我可以做的吗?

2 个答案:

答案 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;
        }
    }
}