如何从其中加载的UserControl按钮关闭ChildWindow?

时间:2009-11-26 12:39:59

标签: c# silverlight childwindow

这是我的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

2 个答案:

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