2011-12-25 10 views
6

Pracuję nad dodatkiem Excel, który otwiera winform po kliknięciu przycisku na pasku wstążki. Ten przycisk musi być niemodalny, aby użytkownik mógł nadal wchodzić w interakcję z oknem nadrzędnym, ale musi także pozostać na szczycie okna nadrzędnego przez cały czas. Aby to osiągnąć, próbuję przekazać okno nadrzędne jako parametr do metody Show(). Oto mój kod:Jak przekazać okno właściciela do przeciążenia metody Show()?

Ribbon1.cs

private void button2_Click(object sender, RibbonControlEventArgs e) 
    { 
     RangeSelectForm newForm = new RangeSelectForm(); 

     newForm.Show(this); 
    } 

problem z tym kodem jest, że słowo „to” referencje klasa wstążka, nie okno nadrzędne. Próbowałem również przekazać w Globals.ThisAddIn.Application.Windows.Parent. W wyniku tego powstaje błąd środowiska wykonawczego "Najlepsza metoda przeładowania dla" System.Windows.Forms.Form.Show (System.Windows.Forms.IWin32Window) "ma pewne nieprawidłowe argumenty". Jaki jest prawidłowy sposób przekazania okna nadrzędnego do programu Show()?

Jeśli jest to istotne, jest to aplikacja Office 2010 napisana w .NET 4.0 przy użyciu C#.

EDIT --- podstawie Slaks Odpowiedź

using Excel = Microsoft.Office.Interop.Excel; 

... 

     class ArbitraryWindow : IWin32Window 
     { 
      public ArbitraryWindow(IntPtr handle) { Handle = handle; } 
      public IntPtr Handle { get; private set; } 
     } 

     private void button2_Click(object sender, RibbonControlEventArgs e) 
     { 
      RangeSelectForm newForm = new RangeSelectForm(); 
      Excel.Application instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 
      newForm.Show(new ArbitraryWindow(instance.Hwnd)); 
     } 
+0

Właściwie dokładniej, okno próbuję odpalić z poziomu wstążki to Telerik RADFORM. – hughesdan

+0

To jest błąd _kompaktowego-czasu_. – SLaks

+0

Powinieneś być w stanie uzyskać aplikację łatwiej niż z właściwości addin. – SLaks

Odpowiedz

14

Musisz utworzyć klasę, która implementuje IWin32Window i zwraca Application.Hwnd właściwość programu Excel.

Na przykład:

class ArbitraryWindow : IWin32Window { 
    public ArbitraryWindow(IntPtr handle) { Handle = handle; } 
    public IntPtr Handle { get; private set; } 
} 

newForm.Show(new ArbitraryWindow(new IntPtr(Something.Application.Hwnd))); 
+0

Otrzymuję komunikat "Nieznany element członkowski aplikacji ExcelAddIn2.Globals" – hughesdan

+0

Nie wiem od ręki, gdzie znaleźć wystąpienie "aplikacji" programu Excel, ale powinieneś mieć jeden z Addin. – SLaks

+0

Znalazłem go w Microsoft.Office.Interop.Excel. Ale po ustaleniu, że otrzymuję teraz "Unknown konstruktora Ribbon1.ArbitraryWindow (int) ExcelAddIn2.Ribbon1.ArbitraryWindow.Aby zobaczyć szczegóły na moje pytanie – hughesdan

Powiązane problemy