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