当前位置:  开发笔记 > 编程语言 > 正文

WPF:如何设置UserControl显示的对话框的所有者窗口?

如何解决《WPF:如何设置UserControl显示的对话框的所有者窗口?》经验,为你挑选了4个好方法。

我有一个WPF应用程序有这三种类型的东西......

WindowMain

UserControlZack

WindowModal

UserControlZack1位于我的WindowMain上......


    
        ...
        
        ...
    

UserControlZack1显示一个WindowModal dailog框...

Partial Public Class UserControlZack

   ...

    Private Sub SomeButton_Click(...)
        'instantiate the dialog box and open modally...
        Dim box As WindowModal = New WindowModal()
        box.Owner = ?????
        box.ShowDialog()
        'process data entered by user if dialog box is accepted...
        If (box.DialogResult.GetValueOrDefault = True) Then
            _SomeVar = box.SomeVar
            ...
        End If
    End Sub

End Class

如何将box.Owner设置为正确的Window,我正在运行的WindowMain实例?

我无法使用box.Owner = Me.Owner,因为"'所有者'不是'ProjectName.UserControlZack'的成员."

我不能使用box.Owner = Me.Parent,因为它返回一个Grid,而不是Window.

我无法使用box.Owner = WindowMain,因为"'WindowMain'是一种类型,不能用作表达式."



1> Martin Moser..:

尝试使用

.Owner = Window.GetWindow(this)


工作得很好,谢谢.而且也正是这个问题的答案:-).

2> Nir..:

要获得顶级窗口,您的控件就在,假设有一个:

(Window)PresentationSource.FromVisual(this).RootVisual

要获得主窗口:

Application.Current.MainWindow


Application.Current.MainWindow正好给了我所需要的东西.我需要从使用ShowDialog()打开的子窗口访问父窗口中的控件.

3> 小智..:
MyWpfDialog dialog = new MyWpfDialog();

//remember, this is WinForms UserControl and its Handle property is
//actually IntPtr containing Win32 HWND.

new System.Windows.Interop.WindowInteropHelper(dialog).Owner = this.Handle;

dialog.ShowDialog();



4> Andrew Barre..:

更新以尝试和帮助Greg的评论.该命令适用于主窗口菜单,用户控件中的按钮和用户控件中的上下文菜单.

我会用命令来做.所以有一个类Commands.cs类似于:

public static class Commands
{
    public static RoutedUICommand TestShowDialogCommand = new RoutedUICommand("Test command", "TestShowDialog", typeof(Commands));
}

在主窗口中注册这些:(你不需要canshow它默认为true)

    public Window1()
    {
        InitializeComponent();

        CommandManager.RegisterClassCommandBinding(typeof(System.Windows.Controls.Control),
            new CommandBinding(Commands.TestShowDialogCommand, ShowDialogCommand, CanShowDialogCommand));
    }

    private void ShowDialogCommand(object sender, ExecutedRoutedEventArgs e)
    {
        var box = new Window();
        box.Owner = this;
        box.ShowDialog();

    }

    private void CanShowDialogCommand(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

这是我的主窗口的xaml:



    
        
            
                
            
        
        
    


这是我的用户控件的xaml(仅限默认代码)



    
        
        
            
                
                    
                
            
        
    


您可以更进一步,并在控制器类中处理该命令,并使其更多一点MVC.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有