在新窗口中打开引用的控件

时间:2014-10-15 12:18:40

标签: c# wpf xaml

问题

我想从主窗口将引用的控件加载到新窗口中。引用的控件已经是主窗口的子控件,在尝试渲染新窗口时导致以下异常:

  

System.ArgumentException未处理:

     

在附加到新的父Visual。

之前,必须断开指定的子视图与当前父Visual

我不想将它与主窗口断开连接,我也无法创建控件的新实例,因为我不知道它是如何实例化的,或者是应用了哪些成员。

背景

我正在开发一个应用程序,允许开发人员使用配置选项的其他视图扩展应用程序。这些视图的容器可能对于大视图扩展来说太小(例如,想象一个日程安排控件作为示例),所以我希望为用户提供在新窗口中打开扩展视图的能力。

代码

到目前为止,我已经创建了一个附加到超链接的行为,该行为会在Click事件上打开一个带有引用控件的新窗口。以下代码是证明我的意图的最基本的实现:

public class ExpandViewBehavior : Behavior<Hyperlink>
{
    public static DependencyProperty ViewProperty = DependencyProperty.Register("View", typeof(object), typeof(ExpandViewBehavior));

    public object View
    {
        get { return GetValue(ViewProperty); }
        set { SetValue(ViewProperty, value); }
    }

    protected override void OnAttached()
    {
        this.AssociatedObject.Click += AssociatedObject_Click;
    }

    void AssociatedObject_Click(object sender, RoutedEventArgs e)
    {
        if (View != null)
        {
            var window = new Window()
            {
                Content = View
            };
            window.Show();
        }
    }
}

附加到主窗口中的Hyperlink,引用一个简单的TextBox以在新窗口中加载。其中iSystem.Windows.Interactivity命名空间,local是我的项目命名空间。

xmlns:local="clr-namespace:WpfApplication"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

...

<StackPanel>
    <TextBlock>
        <Hyperlink>
            <i:Interaction.Behaviors>
                <local:ExpandViewBehavior
                    View="{Binding Source={x:Reference SomeControl}}" />
            </i:Interaction.Behaviors>
            <TextBlock
                Text="(Open in new window)" />
        </Hyperlink>
    </TextBlock>
    <TextBox
        x:Name="SomeControl" />
</StackPanel>

我的问题是,有没有办法加载引用的控件而不将它从主窗口断开?

1 个答案:

答案 0 :(得分:1)

由于您无法同时在两个位置显示相同的控件,因此您需要断开控件与主窗口的连接(如错误文本中所述),或创建控件的副本以放入儿童之窗。

您可以通过导出其XAML来克隆控件,然后从此XAML创建一个新控件。 有关详细信息,请参阅此答案How can you clone a WPF object?