2013-08-08 60 views
7

Vấn đề là cửa sổ WPF chỉ lấy system.form.window vì vậy tôi không thể đặt Excel làm đối tượng chủ sở hữu trong ứng dụng VSTO của tôi, vì addin VSTO chỉ hiển thị Excel của hwnd, hoặc cửa sổ hoạt động của nó như là một cửa sổ bản địa vì nó là COM. Điều đó có nghĩa là khi WindowStartUpLoadation được đặt thành chủ sở hữu trung tâm thì nó không hoạt động. Vì vậy, tôi buộc phải làm việc này.Cách căn giữa cửa sổ WPF trong Excel VSTO addin

Những gì tôi đã đưa ra cho đến nay sau khi đọc this site là để thử và tự căn giữa cửa sổ, nhưng ngay cả với ví dụ đơn giản, cửa sổ của tôi không bao giờ xuất hiện ở giữa.

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

Bất kỳ ý tưởng nào?

+0

* Vui lòng làm rõ vấn đề cụ thể của bạn hoặc thêm các chi tiết bổ sung để làm nổi bật chính xác những gì bạn cần. Như nó hiện đang được viết, thật khó để nói chính xác những gì bạn đang yêu cầu. * –

+0

Tôi đã chỉnh sửa nó một chút để làm rõ ý nghĩa của tôi, bây giờ nó có ý nghĩa hơn không? Tôi rất vui khi xây dựng chi tiết cụ thể hơn. –

Trả lời

6

tôi đã có thể giải quyết điều này bằng cách có được nhận được hình chữ nhật của Excel Window Main sử dụng 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; 
    } 

Dường như Globals.ExcelAddin.Application.ActiveWindow đã không đem lại cho tôi trở lại kích thước tôi mong đợi. Tôi nghĩ rằng nó đã cho tôi kích thước của Ribbon Addin và không phải là Cửa sổ Chính của Excel.