2009-06-14 8 views
6

sto utilizzando un MarkupExtension per caricare stringhe internazionalizzate in un'applicazione WPF come questo:WPF: Dinamico MarkupExtension- ReRendering/Aggiornamento di valore

<Button Content="{Translate MyText}"/> 

mio MarkupExtension si chiama "TranslateExtension" e si cerca un valore per la chiave "MyText" da un database. Lo fa nello

ProvideValue(IServiceProvider serviceProvider) 

metodo che restituisce la stringa corretta. Tutto funziona bene.

Il mio problema è che il metodo ProvideValue non viene mai richiamato e non c'è modo di estrarre una nuova stringa dal database quando la lingua viene cambiata. Ora ho bisogno di un modo per rendere il valore restituito "dinamico", per fare in modo che il pulsante ricarichi il suo xaml e riutilizzare la markupextension, sia che passi attraverso un evento lanciato quando si cambia lingua o altro. Come faccio a chiamare di nuovo il metodo ProvideValue? Ho provato il Mi piace di InvalidateVisual() InvalidateArrange() InvalidateMeasure() UpdateLayout() ...

Spero di essere stato chiaro. Non esitate a chiedere maggiori informazioni su di voi pensate di essere in grado di fornire idee o soluzioni. Grazie

+0

stesso prob qui ... – santa

risposta

-1

non ho una risposta per voi, ma piuttosto un suggerimento ...

forse si potrebbe considerare l'utilizzo di un attacco combinato con un IValueConverter per fare la traduzione. Quindi, se la lingua dell'interfaccia utente cambia, puoi semplicemente ricorrere a tutti i binding e aggiornarli.

Come ho detto, solo un'idea.

+0

Ciao Marco, grazie per il suggerimento. Darò un'occhiata all'uso dei binding, ma potrebbero non funzionare nel mio caso. il tutto è un po 'più difficile e ho semplificato ciò di cui avevo bisogno. è, sto rendendo le lingue chosable per ogni modulo separatamente e se la forma non ha una lingua scelta si affiderà alla lingua standard (che può anche essere cambiata). Ho scoperto che le estensioni di markup sono esposte dopo il rendering di xaml (eccetto quando c'è ancora un riferimento da qualche parte). Sto attualmente cercando eventi di bolle e tunnel e registrando un gestore sul modulo. –

+0

ma dovrò valutare i problemi di prestazioni e memoria. in ogni caso, sembra che non ci sia un "davvero ricaricare la forma" -modo da nessuna parte vicino. –

4

Bene, la soluzione è un'idea abbastanza semplice.

ProvideValue viene chiamato una sola volta, ma il parametro serviceProvider fornisce anche l'istanza dell'oggetto e la proprietà (PropertyInfo). Questo è tutto ciò che serve per aggiornare la propensione in seguito.

Farei un evento statico in App.cs, diciamo CultureChanged; Nel metodo ProvideValue ottenere l'istanza dell'oggetto e la proprietà e memorizzarli. allegare all'evento CultureChanged e nel suo EventHandler impostare il valore della proprietà utilizzando la reflection. questo è tutto, basta fare attenzione a memoryleaks.

C'è MarkupExtension che utilizza questo approccio e permette alla cultura della cache al volo: http://www.codeproject.com/KB/WPF/WpfMultiLanguage.aspx