hilpers


  hilpers > microsoft.* > microsoft.dotnet.csharp

 #1  
04.12.2008, 10:31
Davide
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  
04.12.2008, 11:25
Corrado Cavalli [MVP]
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  
04.12.2008, 12:50
Davide
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  
04.12.2008, 13:01
Corrado Cavalli [MVP]
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  
04.12.2008, 14:09
Davide
"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  
04.12.2008, 15:36
Davide
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.

Merging Information Logo
[Deutschland] [España] [France] [Nederland] [Polska] [Tech] [United Kingdom]