2010-12-01 12 views
9

Ich habe ein Problem mit einem WPF-Steuerelement, das ich in einem ElementHost in einer WinForms App hosten möchte. Das Steuerelement ist ein benutzerdefiniertes Steuerelement, das ich ursprünglich in einem separaten Testprojekt entwickelt hatte, bei dem es sich um eine WPF-App handelte. Dort funktioniert es offensichtlich gut, aber in meiner WinForms App bekomme ich nur eine leere graue Box, in der der ElementHost angezeigt wird.WPF-Steuerelement nicht in ElementHost in WinForms App angezeigt

Hier ist meine C# -Code für die Erstellung, bevölkert, und das Hinzufügen des Elements zur übergeordneten Steuerung:

// This is my WPF control 
m_TabHostPanel = new TabHostPanel(); 
m_ElementHost = new ElementHost 
       { 
        Child = m_TabHostPanel, 
        Dock = DockStyle.Top, 
        Height = 34 
       }; 
this.Controls.Add(m_ElementHost); 

Die übergeordnete Steuerung enthält anderen WinForms-Steuerelemente, die hinzugefügt werden und zur Laufzeit entfernt, je nach Bedarf. Diese werden alle einzeln mit ihrem Dock auf DockStyle.Fill gehostet. Somit ist sicher, es macht richtig zu machen jedes Mal, wenn ich ein füge ich das Element auf die Rückseite der Z-Bestellung senden:

m_ElementHost.SendToBack(); 

So weiß ich, ich bin nicht in ein Luftraum Problem ausgeführt wird, oder etwas ähnliches Das.

Das einzige, was ich tat Wunder über, ist dies: in dem ursprünglichen Projekt die Stile für alle meine lookless Kontrollen wurden in die Ressourcenverzeichnis in App.xaml für die Anwendung zusammengefasst, wie folgt aus:

<Application x:Class="WpfTestApp.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Application/UserInterface/DataTemplates/TabModelDataTemplate.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/HoverablePressableButtonStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/MiniControlButtonStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/TabCloseButtonStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/TabScrollLeftButtonStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/TabScrollRightButtonStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/TabListDropDownButtonStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/TabHostComboBoxStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/TabButtonStyle.xaml"/> 
       <ResourceDictionary Source="Application/UserInterface/Styles/TabHostPanelStyle.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

I habe App.xaml in mein WinForms-Projekt migriert, aber die Build-Aktion ist auf Seite eingestellt. Wenn ich es auf ApplicationDefinition setze, erhalte ich einen Fehler, der besagt, dass die Anwendung mehrere Einstiegspunkte hat, was sinnvoll ist, aber ich frage mich dann, ob die Stile usw. abgeholt werden. Wenn nicht, könnte das erklären, warum ich ein leeres graues Rechteck bekomme, wo meine Kontrolle sein sollte, denn ohne diese gibt es nichts, was ihr Aussehen bestimmen könnte. Vielleicht ist die Frage, wie bekomme ich diese Stile in meine WinForms-Anwendung, so dass meine WPF-Steuerelemente sie sehen können?

Ich sollte wahrscheinlich auch erwähnen, dass dies auf .NET Fx 3.5 läuft.

Wie auch immer, für jetzt bin ich perplex, so würde jede Hilfe dankbar erhalten werden.

Vielen Dank!

Bart

Antwort

10

Dank für die Beantwortung, aber ich denke, Sie mich falsch verstehen kann: Ich versuche, ein eigenes Element zu verwenden, deren Ressourcen sind in der Regel in der Application-Objekt, nicht die Anwendung einfügen sich in die Element.

Zum Glück habe ich eine Antwort gefunden:

http://drwpf.com/blog/2007/10/05/managing-application-resources-when-wpf-is-hosted/

Kurzversion:

  • Set Build Aktion für App.xaml auf Seite
  • In der Code-behind für App. xaml erstellt einen Standardkonstruktor, der nur InitializeComponent() aufruft
  • Wenn die WinForms-App gestartet wird, erstellen Sie einfach eine Instanz des A pp Klasse.

Und dann ist alles gut: meine WPF-Kontrolle erscheint, wie es sollte.

Nun, warum finde ich nur die Antwort nach Ich habe auf StackOverflow gepostet?

Thanks again,

Bart

+0

wie schaffen Sie eine neue Instanz der Klasse App? – Prof

+0

Sie können es einfach neu machen. –