这是我的ChildWindow xaml代码:
1 <Grid x:Name="LayoutRoot">
2 <Grid x:Name="teste">
3 <Grid.ColumnDefinitions>
4 <ColumnDefinition Width="*"/>
5 <ColumnDefinition Width="*"/>
6 </Grid.ColumnDefinitions>
7 <Grid.RowDefinitions>
8 <RowDefinition />
9 <RowDefinition Height="Auto" />
10 </Grid.RowDefinitions>
11 <local:UserControl1 Grid.Row="0" Grid.ColumnSpan="2"/>
12 </Grid>
13 </Grid>
这是我的UserControl1 xaml代码:
1 <Grid x:Name="LayoutRoot" Background="#FFA34444">
2 <Button Click="Child_Close" Content="Cancel">
3 </Grid>
这是我的UserControl C#:
private void Child_Close(object sender, System.Windows.RoutedEventArgs e)
{
ChildWindow cw = (ChildWindow)this.Parent;
cw.Close();
}
尝试这种方式不起作用。 有什么想法吗?
韩国社交协会 Josi
答案 0 :(得分:4)
UserControl的父级不是ChildWindow
的问题,它是子窗口内的网格。您需要获取UserControl
的父级的父级才能导航到ChildWindow
: -
ChildWindow cw = (ChildWindow)((FrameworkElement)this.Parent).Parent;
然而,如果将此问题嵌入您的UserControl
中会有不良做法,那么您可以向UserControl
的消费者做出规定。在上述用户控件工作的情况下,它需要始终是Layout根目录的直接子代。
更好的方法是搜索ChildWindow
的可视树。我会使用这个帮助器方法(实际上我将它放在一个辅助扩展静态类中,但我会在这里保持简单。)
private IEnumerable<DependencyObject> Ancestors()
{
DependencyObject current = VisualTreeHelper.GetParent(this);
while (current != null)
{
yield return current;
current = VisualTreeHelper.GetParent(current);
}
}
现在您可以使用LINQ方法获取ChildWindow: -
ChildWindow cw = Ancestors().OfType<ChildWindow>().FirstOrDefault();
这将找到恰好是ChildWindow的UserControl的第一个祖先。这允许您将UserControl放置在子窗口XAML的任何深度,它仍然可以找到正确的对象。
答案 1 :(得分:0)
这是我当前的(临时)解决方案 - 一个ChildPopupWindowHelper
静态类,用于打开弹出窗口,而不必为我想要公开的每个用户控件创建一个愚蠢的ChildWindow XAML实例。
照常创建usercontrol,继承自ChildWindowUserControl
然后用
打开一个弹出窗口 ChildPopupWindowHelper.ShowChildWindow("TITLE", new EditFooControl())
我对此并不十分满意,欢迎对此模式进行改进。
public static class ChildPopupWindowHelper
{
public static void ShowChildWindow(string title, ChildWindowUserControl userControl)
{
ChildWindow cw = new ChildWindow()
{
Title = title
};
cw.Content = userControl;
cw.Show();
}
}
public class ChildWindowUserControl : UserControl
{
public void ClosePopup()
{
DependencyObject current = this;
while (current != null)
{
if (current is ChildWindow)
{
(current as ChildWindow).Close();
}
current = VisualTreeHelper.GetParent(current);
}
}
}