问题是WPF窗口只接受system.form.window,所以我不能将Excel设置为我的VSTO应用程序中的所有者对象,因为VSTO插件只将Excel的hwnd或其活动窗口暴露为本机窗口,因为它是COM.这意味着当WindowStartUpLoadation设置为中心所有者时,它不起作用.所以我被迫解决这个问题.
到目前为止,我在阅读本网站后想出的是尝试手动居中窗口,但即使用他的简单示例,我的窗口也不会出现居中.
private static void CenterWpfWindowInExcel(WpfParameterDialog wpfDialog)
{
WindowInteropHelper helper = new WindowInteropHelper(wpfDialog);
helper.Owner = new IntPtr(Globals.ExcelAddin.Application.Hwnd);
// Manually calculate Top/Left to appear centered
double nonWpfOwnerLeft = Globals.ExcelAddin.Application.ActiveWindow.Left; // Get non-WPF owner’s Left
double nonWpfOwnerWidth = Globals.ExcelAddin.Application.ActiveWindow.Width; // Get non-WPF owner’s Width
double nonWpfOwnerTop = Globals.ExcelAddin.Application.ActiveWindow.Top; // Get non-WPF owner’s Top
double nonWpfOwnerHeight = Globals.ExcelAddin.Application.ActiveWindow.Height; // Get non-WPF owner’s Height
wpfDialog.WindowStartupLocation = WindowStartupLocation.Manual;
wpfDialog.Left = nonWpfOwnerLeft + (nonWpfOwnerWidth - wpfDialog.Width)/2;
wpfDialog.Top = nonWpfOwnerTop + (nonWpfOwnerHeight - wpfDialog.Height)/2;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我能够通过使用user23获取主Excel窗口的Rect来解决这个问题
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
Run Code Online (Sandbox Code Playgroud)
似乎Globals.ExcelAddin.Application.ActiveWindow没有给我回到我期望的维度.我认为它给了我Ribbon Addin的尺寸,而不是Excel的主窗口.
归档时间: |
|
查看次数: |
1327 次 |
最近记录: |