我想从主窗口将引用的控件加载到新窗口中。引用的控件已经是主窗口的子控件,在尝试渲染新窗口时导致以下异常:
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
以在新窗口中加载。其中i
是System.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>
我的问题是,有没有办法加载引用的控件而不将它从主窗口断开?
答案 0 :(得分:1)
由于您无法同时在两个位置显示相同的控件,因此您需要断开控件与主窗口的连接(如错误文本中所述),或创建控件的副本以放入儿童之窗。
您可以通过导出其XAML来克隆控件,然后从此XAML创建一个新控件。 有关详细信息,请参阅此答案How can you clone a WPF object?。