|
|
||||||
|
#1
|
|
|
|
|
Ciao a tutti,
sto cercando di aprire una finestra WPF inserita all'interno di una class library C#. La cosa è semplice in WinForm in quanto è sufficiente inserire un nuovo item di tipo windows forms. In WPF l'unica possibilità data è quella di inserire uno User Control(WPF). Ho provato (seguendo quello che ho trovato su un blog) a modificare lo user control in una window, ed istanziare la window facendo (analogamente a quanto facevo per una winform): public void ShowWindow() { Window1 window = new Window(); window.ShowDialog(); } Il progetto veniva compilato senza errori ma comportava un errore runtime perchè è necessario istanziare la finestra WPF all'interno di un STAThread, ho quindi istanziato un nuovo Thread di tipo STA: public void ShowForm() { Thread thread = new Thread(() => { Window1 window = new Window1(); window.ShowDialog(); System.Windows.Threading.Dispatcher.Run(); }); thread.IsBackground = true; thread.Name = "MyThread"; thread.SetApartmentState(ApartmentState.STA); thread.Start(); } Il codice compila e viene eseguito senza eccezioni... ma la finestra non viene mostrata. Facendo il Debug vedo che su Thread.Start() viene creato il Thread 'MyThread', ma mettendo un breakpoint nel costruttore di Window1, questo non viene mai raggiunto. Non capisco se sto sbagliando qualcosa nella gestione del thread, del dispatcher o della finestra WPF... Grazie anticipatamente, -Da- |
|
|
|
#2
|
|
|
|
|
Secondo me ti stai infilando in una soluzione che ti può dare sicuramente
qualche noia, non fai prima a usare uno UserControl e cambiare il root element di una finestra vuota presente nell'applicazione principale? |
|
#3
|
|
|
|
|
Ciao Corrado,
grazie del consiglio, il problema è che l'applicazione principale è una applicazione MFC sviluppata in VC6!!! Quindi la dll da utilizzare sarà wrappata da uno strato c++/CLI che offre una serie di funzioni all'applicazione principale, tra cui quella di visualizzare certe cose (cosa che vorrebbe essere fatta in WPF). Magari sembra un po' assurdo, ma l'unica strada per iniziare a far migrare un megaprogetto VC6, per noi è far migrare parte delle funzionalità, ma mantenendo la compatibilità col passato... In questa fase sto cercando di verificare la fattibilità di questo 'giro della mela', che dovrebbe essere possibile sulla carta... Pensi che le noie di cui parli siano tali da farci prendere un'altra direzione o che siano comunque gestibili? Grazie, -Da- "Corrado Cavalli [MVP]" wrote: [..] |
|
#4
|
|
|
|
|
ops! Piccolo dettaglio...
Concordo sulla migrazione a steps, però il tuo scenario complica le cose... Ritornando al tuo codice, perchè apri la window in un thread separato? ho il dubbio che serva l'infrastruttura di base e quindi devi necessariamente passare da Application.Run, fai qualche prova. |
|
#5
|
|
|
|
|
"Corrado Cavalli [MVP]" wrote:
> ops! Piccolo dettaglio... > Concordo sulla migrazione a steps, però il tuo scenario complica le cose... > Ritornando al tuo codice, perchè apri la window in un thread separato? Apro la window in un Thread separato perchè il main Thread (che nel mio caso è istanziato da una applicazione MFC) non è STA, e chiamare il costruttore della window genera un'eccezione. Ho trovato un post di un blog che spiegava come aprire più finestre WPF: http://eprystupa.wordpress.com/2008/...le-ui-threads/ Anche se il problema non è lo stesso pensavo di istanziare un thread STA potesse risolvere il mio problema. > ho il > dubbio che serva l'infrastruttura di base e quindi devi necessariamente > passare da Application.Run, fai qualche prova. > Scusami, ma non ho capito... In Wpf Application.Run è gestito mediante il file app.xaml, giusto? Il che equivale a dire di istanziare una nuova applicazione, no? (e non ho il file App.xaml proprio perchè vorrei aprire la finestra da dentro una dll così come è possibile fare per winform, per le quali basta istanziare la form e chiamare form.ShowDialog() ). Oppure fai riferimento all'entry point dell'applicazione MFC (che come detto non è STA e sul quale non ho controllo...) Grazie mille per la solita pazienza e disponibilità... -Da- |
|
#6
|
|
|
|
|
Ho fatto qualche prova ulteriore, ma il problema persiste.
Ho creato un nuovo progetto WPF (quindi un exe, che contiene Window2) che viene chiamato dalla mia dll C#. Il problema è esattamente che avevo riscontrato nel caso che ho esposto nel primo post, ossia: se nella dll C# chiamo direttamente la App.Run: public void ShowForm() { WpfWindow.App app = new App(); app.Run(new Window2()); } ho una eccezione: Il thread chiamante deve essere in modalità STA, perché questa è la modalità obbligatoria per molti componenti dell'interfaccia utente. Se istanzio il thread in modalità STA (qui lo faccio tramite attributo mentre nel primo post setto la proprietà del thread): public void ShowForm() { Thread thread = new Thread(new ThreadStart(this.ShowWindow)); thread.IsBackground = true; thread.Name = "MyThread"; //thread.SetApartmentState(ApartmentState.STA); thread.Start(); } [STAThread] private void ShowWindow() { WpfWindow.App app = new App(); app.Run(new Window2()); System.Windows.Threading.Dispatcher.Run(); } Non succede nulla, ossia, anche se il thread viene creato sul Thread.Start(), mettendo un breakpoint dentro ShowWindow() e nel costruttore di Window 2 non ci passo mai... Mi viene da pensare che il problema sia relativo all'assegnazione del delegato, ma non ne capisco il motivo... -Da- |
|
|
| Discussioni simili | |
| Discussione | Ha iniziato questa discussione |
| Class Library Salve a tutti. Ho in un progetto web una serie di classi. Vorrei poter prendere questi file .vb inserirli in una class library, compilare e referenziare la dll creata nel... |
DD |
| Looking for Ftp client class library for .net 1.1 I'm looking for a free, maybe open source, class library to access a remote ftp service from a C# application. Is there something on the web? Where can I find it? I've found... |
Giorgio |
| Impostazioni di security in class library Ciao ho realizzato una class library da usare in una pagina web come activex <OBJECT id="myControl1" name="myControl1" classid="activex/class1.dll#class1.UserControl1"... |
boz |
| Base class library del .NET CF Ciao! Perdonate la richiesta forse banale... Mi servirebbe sapere quante classi compongono il .NET Compact Framework e quante, invece, sono comprese in Java 2 Micro... |
Marco Minerva |
| Class Library per Windows Form e Pocket PC Ciao a tutti! Vorrei realizzare una class library che potesse essere utilizzata, senza necessità di ricompilazione, sia in applicazioni Smart Device sia in Smart Client. In... |
Marco Minerva |
|
Privacy Policy | Tutti gli orari sono GMT. Attualmente sono le 07:30.
|
|
|