2009-08-21 2 views
5

Come soluzione a breve termine, sto provando a bloccare un modulo di Windows 'usercontrol' in un'applicazione WPF. Vedo nella vista dell'applicazione WPF che posso aggiungere un 'controllo personalizzato di Windows Form' al progetto e rende un controllo personalizzato vuoto, ma non riesco a capire come aggiungerlo. Idealmente mi piacerebbe sapere come prendere il file .dll dalla mia finestra compilata come controllo utente e incollarlo nell'app WPF, o importare il controllo utente nell'applicazione WPF.Come inserire un controllo personalizzato dei moduli di Windows in un'applicazione WPF?

Grazie, Sam

risposta

7

non si può davvero aggiungerlo come un controllo alla casella degli strumenti come si potrebbe per un'applicazione Windows Form. Quello che dovresti fare invece è "ospitare" il controllo utente all'interno dell'applicazione WPF.

See how to do it on MSDN.

Ecco un esempio di come utilizzare una casella di testo mascherata (che è possibile modificare facilmente di utilizzare il controllo personalizzato):

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
Title="HostingWfInWpf"> 
<Grid> 
    <WindowsFormsHost> 
     <wf:MaskedTextBox x:Name="mtbDate" Mask="00/00/0000"/> 
    </WindowsFormsHost> 
</Grid> 
</Window> 
+0

Ho provato questo codice esattamente come è e ho ottenuto lo stesso errore che ho menzionato sopra. – Shizam

+0

Hai aggiunto un riferimento all'assembly 'System.Windows.Forms' nella tua cartella References? – Kredns

+0

Sì, li ha aggiunti alla cartella dei riferimenti. Ho guardato in giro e sono tornato alla pagina che hai linkato, poi ho trovato la pagina sopra che ti mostra come aggiungere un controllo WF usando C# invece di XAML. L'ho provato e ha funzionato, quindi per qualsiasi ragione quando si esegue un'applicazione Web WPF non riesco a farlo funzionare tramite XAML, ma posso farlo tramite C#. http://msdn.microsoft.com/en-us/library/ms751761.aspx – Shizam

3

Aggiungere un riferimento alla System.Windows.Forms e WindowsFormsIntegration al progetto

xmlns:WinForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
xmlns:WindowsFormsIntegration="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 

E posizionare i moduli di Windows nella finestra.

<WindowsFormsHost Name="wfhDate" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Stretch"> 
       <WinForms:FlowLayoutPanel/> 
    </WindowsFormsHost> 

Ora in codice C#

using Forms = System.Windows.Forms; 
......................... 
Forms.FlowLayoutPanel flpPanel = this.wfhDate.Child as Forms.FlowLayoutPanel; 
// Initialize your Forms contol here. 
flpPanel.Controls.Add(yourControl); 
+0

@Lucas: Ho copiato esattamente XAML dall'alto e si è compilato senza errori, non ho ancora inserito il codice C# perché volevo assicurarmi che lo XAML funzionasse. Ho eseguito l'app e si è arrestata in modo anomalo con questa eccezione: System.Windows.Markup.XamlParseException non gestito Messaggio: Impossibile creare l'istanza di 'Pagina1' definita nell'assembly 'WpfUploaderTwo, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null '. L'eccezione è stata lanciata dall'obiettivo di un'invocazione. Errore nel file di markup 'Pagina1.xaml' Linea 1 Posizione 7. – Shizam

+0

Se tolgo il bit WindowsFormsHost, funziona perfettamente. Link a codice ed errore: http://bit.ly/aGqfG – Shizam

+0

Ah, quindi sto creando una 'Applicazione Web WPF' non una 'Applicazione WPF', non sono sicuro che abbia qualche rilevanza. – Shizam

0

risposta Lucas' è corretto, ma ho voluto aggiungere qualcosa di necessario. Se si sta creando un'applicazione Web, è necessario modificare l'impostazione Sicurezza in Questa è un'applicazione di attendibilità completa. Non riuscivo a far funzionare il controllo WindowsFormsHost prima di farlo.