2013-08-08 37 views
7

問題は、VSTOアドインのみが公開されるため、WPFウィンドウではsystem.form.windowのみが使用され、VSTOアプリケーションで所有者オブジェクトになるようにExcelを設定できないということです。 Excelのhwnd、またはアクティブウィンドウはCOMであるため、ネイティブウィンドウとして表示されます。これは、WindowStartUpLoadationがセンターオーナーに設定されている場合、動作しないことを意味します。だから、私はこれを回避しなければならない。Excel VSTOアドインでWPFウィンドウを中央に揃える方法

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

私はGlobals.ExcelAddin.Application.ActiveWindowは私が期待される次元をバック与えていなかったことが表示されます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; 
    } 

を使用して、メインのExcelウィンドウののRectを取得しますことにより、この問題を解決することができました。 Excelのメインウィンドウではなくリボンアドインのディメンションを与えていたと思います。

関連する問題