首页 文章

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

提问于
浏览
0

问题

我想从主窗口加载一个引用的控件到一个新窗口 . 引用的控件已经是主窗口的子控件,在尝试呈现新窗口时导致以下异常:

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 回答

  • 1

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

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

相关问题