60

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

  • 主窗口
  • 用户控制扎克
  • 窗口模式

UserControlZack1 位于我的 WindowMain ...

<Window x:Class="WindowMain"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ProjectName"
        ...
        Name="WindowMain">
    <Grid>
        ...
        <local:UserControlZack x:Name="UserControlZack1" ... />
        ...
    </Grid>
</Window>

UserControlZack1 显示一个 WindowModal 对话框...

部分公共类 UserControlZack

   ...

    私有子 SomeButton_Click(...)
        '实例化对话框并以模态方式打开...
        暗箱 As WindowModal = New WindowModal()
        框。所有者 = ?????
        box.ShowDialog()
        '如果对话框被接受,则处理用户输入的数据...
        如果 (box.DialogResult.GetValueOrDefault = True) 那么
            _SomeVar = box.SomeVar
            ...
        万一
    结束子

结束类

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

我不能使用box.Owner = Me.Owner,因为“'Owner' 不是 'ProjectName.UserControlZack' 的成员。”

我不能使用box.Owner = Me.Parent,因为它返回一个网格,而不是窗口。

我不能使用box.Owner = WindowMain,因为“'WindowMain' 是一种类型,不能用作表达式。”

4

6 回答 6

135

尝试使用

.Owner = Window.GetWindow(this)
于 2009-03-04T08:11:14.940 回答
47

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

(Window)PresentationSource.FromVisual(this).RootVisual

获取主窗口:

Application.Current.MainWindow
于 2009-03-04T08:08:09.113 回答
10
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();
于 2011-10-03T14:28:44.183 回答
5

更新以尝试从评论中帮助 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:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="322">
<Grid>
    <StackPanel>
        <Menu>
            <MenuItem Header="Test">
                <MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}"/>
            </MenuItem>
        </Menu>
        <WpfApplication1:BazUserControl />
    </StackPanel>
</Grid>
</Window>

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

<UserControl x:Class="WpfApplication1.BazUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Height="300" Width="300">
<Grid>
    <StackPanel>
        <Button Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" Content="ClickMe" ></Button>
        <TextBox>
            <TextBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" />
                </ContextMenu>
            </TextBox.ContextMenu>
        </TextBox>
    </StackPanel>
</Grid>
</UserControl>

你可以更进一步,在控制器类中处理命令,让它更像 MVC。

于 2009-03-03T17:51:58.640 回答
0

我通过我的 XAML 一直爬回它来让它工作......

box.Owner = DirectCast(DirectCast(DirectCast(Me.Parent, Grid).Parent, Grid).Parent, Window)

但这似乎很不雅。有没有更好的办法?

于 2009-03-03T17:44:04.510 回答
0

将窗口的名称更改为 WindowMain1 或其他内容,并将所有者设置为该名称怎么样?

于 2009-03-03T17:47:34.063 回答