设置WPF窗口的所有者属性

时间:2014-08-19 06:22:48

标签: wpf wpf-controls autodesk

我正在为Autodesk Inventor创建插件,我有类lib项目,我会在按钮点击时显示一个wpf窗口,效果很好。但是,我无法为我的窗口设置所有者属性。在我的研究中,我发现我们需要获取父窗口对象..

3 个答案:

答案 0 :(得分:1)

如果您无法获得父窗口,可以尝试使用窗口句柄设置父窗口。

我不熟悉Autodesk Inventor以及如何为应用程序创建插件,因此我不知道您是否可以获得窗口处理但我想您可以知道进程ID或窗口标题/标题或某些其他信息可以帮助您获得父窗口句柄(您应该谷歌如何获得窗口句柄)。处理完父窗口后,可以使用WindowInteropHelper将其设置为窗口的所有者。

这里只是一个如何使用WindowInteropHelper的示例:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        IntPtr parentWindowHandler = IntPtr.Zero;
        // I'll just look for notepad window so I can demonstrate (remember to run notepad before running this sample code :))
        foreach (Process pList in Process.GetProcesses())
        {
            if (pList.MainWindowTitle.Contains("Notepad"))
            {
                parentWindowHandler = pList.MainWindowHandle;
                break;
            }
        }

        var interop = new WindowInteropHelper(this);
        interop.EnsureHandle();
        // this is it
        interop.Owner = parentWindowHandler;

        // i'll use this to check if owner is set
        // if it's set MainWindow will be shown at the center of notepad window
        WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
    }
}

答案 1 :(得分:0)

// Create a window and make this window its owner
Window ownedWindow = new Window();
ownedWindow.Owner = this;
ownedWindow.Show();

答案 2 :(得分:0)

我只是重申user1018735给出的例子。我开发了Inventor加载项,因此我修改了上面的代码,以确保我始终使用正确的Inventor会话,因为可以一次打开Inventor的多个实例。我这样做是通过_App参数将我已知的应用程序对象传递给我的表单;那么因为MainWindowTitle的过程总是与我匹配的应用程序标题相同。

我在WPF类库@ VB.Net 4.5.1中运行它。 以下是我在Inventor 2014中运行的代码......

Public Sub New(ByVal _App As Inventor.Application)

    'This call is required by the designer.
    InitializeComponent()

    'Find the Inventor Window Handle.
    Dim InvWndHnd As IntPtr = IntPtr.Zero

    'Search the process list for the matching Inventor application.
    For Each pList As Process In Process.GetProcesses()
        If pList.MainWindowTitle.Contains(_App.Caption) Then
            InvWndHnd = pList.MainWindowHandle
            Exit For
        End If
    Next

    Dim InvWndIrp = New WindowInteropHelper(Me)
    InvWndIrp.EnsureHandle()
    InvWndIrp.Owner = InvWndHnd

...