2011-11-29 16 views
6

Dodałem do mojej aplikacji WindowsForm nowe okno WPF o nazwie novoLogin.Otwórz okno WPF w aplikacji WindowsForm APP

Po dodaniu go dodałem odniesienie do system.xaml .... debug fine.

Teraz próbuję otworzyć to nowe okno z istniejącego WindowsForm.

novoLogin nl = new novoLogin(); 
nl.show(); 

Kompilator daje ten błąd:

Error 1 'WindowsFormsApplication1.novoLogin' does not contain a definition for 'show' and no extension method 'show' accepting a first argument of type 'WindowsFormsApplication1.novoLogin' could be found (are you missing a using directive or an assembly reference?)

+4

Wiesz, że C# jest wielkość liter, prawda? – madd0

Odpowiedz

22

Ten brief article wyjaśnia, w jaki sposób można to osiągnąć.

Jeśli znajdziesz się w potrzebie, aby otworzyć WPF okno z programu WinForms, jest to jeden ze sposobów, aby to zrobić (działa dla mnie):

  1. Utwórz/Dodaj nowy projekt typu WPF Custom Control Library
  2. dodać nowy element typu Window (WPF)
  3. Czy swoje rzeczy z WPF okien
  4. z aplikacji WinForms, tworzyć i otwierać okno WPF

    using System; 
    using System.Windows.Forms; 
    using System.Windows.Forms.Integration; 
    
    var wpfwindow = new WPFWindow.Window1(); 
    ElementHost.EnableModelessKeyboardInterop(wpfwindow); 
    wpfwindow.Show(); 
    
+0

@Purplegoldfish: Widziałem, że dodałeś kod (i dlaczego zrobiłeś to w wersji). Dzięki za to, teraz mogę o tym pamiętać, aby uzyskać przyszłe odpowiedzi! :) – Abbas

3

Wystarczy popatrzeć na to: http://www.mobilemotion.eu/?p=1537&lang=en

Podsumowanie:

Open the project’s manifest file (the one with the .csproj or .vbproj extension) in any text editor. The top node usually contains several tags, one for each build configuration and a global one. In the global node (the one without Condition attribute), search for the sub-node or create one if it does not exist. This node should contain two GUIDs: FAE04EC0-301F-11D3-BF4B-00C04F79EFBC, which stands for a C# project, and 60dc8134-eba5-43b8-bcc9-bb4bc16c2548 which stands for WPF. The full line should look as follows:

<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

(If you’re interested in details, codeproject holds a complete list of potential project GUIDs: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs)

Reload the project in Visual Studio, and open the Add New Item wizard.

Since the project is now officially classified as WPF project, this wizard should now contain the WPF window option. By the way, since there is no WinForms project GUID that could be overwritten, this approach does not harm the existing project components.

Właśnie próbowałem to podejście do projektu VB.NET i to działa!

Korzystanie VB.NET oczywiście musisz zmodyfikować powyżej linii podstawiając GUID z {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} do {F184B08F-C81C-45F6-A57F-5ABD9991F28F}

0

Chciałem pokazać Formularz wpf w windowForm i wystąpił problem z zasobami ...

(ponieważ użyłem zasobów ..). W końcu kiedyś ten kod w moim projekcie windowsForm:

Najpierw utwórz globalną instancję klasy aplikacji tak:

WPFTest.App app; 

dlaczego jest to globalne?

ponieważ ta klasa jest Singleton i nie można utworzyć więcej niż jedno wystąpienie w tym samym AppDomain

Teraz na przykład masz zdarzenie przycisku, aby wyświetlić formularz WPF. W przypadku przycisku mamy:

private void button1_Click(object sender, EventArgs e) 
    { 
     if (System.Windows.Application.Current == null) 
     { 
      app = new WPFTest.App() 
      { 
       ShutdownMode = ShutdownMode.OnExplicitShutdown 
      }; 
      app.InitializeComponent(); 
     } 
     else 
     { 
      app = (WPFTest.App)System.Windows.Application.Current; 
      app.MainWindow = new WPFTest.YourWindow(); 
      System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(app.MainWindow); 
      app.MainWindow.Show(); 
     } 
    } 

uwaga: WPFTest to nazwa projektu i YourWindow() jest okno, które chcesz pokazać