2013-08-08 2 views
7

Проблема заключается в том, что окно WPF принимает только файл system.form.window, поэтому я не могу установить Excel в качестве объекта-владельца в приложении VSTO, потому что добавление VSTO предоставляет только Excel hwnd или его активное окно как собственное окно, так как это COM. Это означает, что если WindowStartUpLoadation установлен как владелец центра, он не работает. Поэтому я вынужден обойти это.Как центрировать окно WPF в Excel VSTO addin

То, что я до сих пор читал после чтения this site, состоит в том, чтобы попытаться вручную центрировать окно, но даже с его простым примером мое окно никогда не кажется центрированным.

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; 
    } 

Любые идеи?

+0

* Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. * –

+0

Я отредактировал это немного, чтобы уточнить мой смысл, теперь это имеет больше смысла? Я с удовольствием расскажу о более конкретных деталях. –

ответ

6

я был в состоянии решить эту проблему, получите получение Rect из главного окна Excel с помощью user23

[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; 
    } 

Оказывается, что Globals.ExcelAddin.Application.ActiveWindow не дает меня размер я ожидал. Я думаю, что это давало мне размеры ленты, а не главное окно Excel.

Смежные вопросы