2011-01-13 12 views
11

Uso l'interoperabilità WPF per ospitare il controllo utente WPF all'interno del modulo WinForms. Tutto funziona bene, tranne brutto rendering del testo:Il testo viene visualizzato in modo diverso nella finestra WPF e all'interno di ElementHost

<Label Content="Normal text" Name="labelNormal"/> 
    <Label Content="Bold text" Name="labelBold" FontWeight="Bold" /> 

- qui è semplice Etichette in WPF finestra:
WPF Window http://img525.imageshack.us/img525/7049/wpfwindow.png

- e le stesse etichette mostrate quando il controllo utente WPF è ospitato in WinForms:
WPF Interop http://i51.tinypic.com/14j4xnc.jpg

Interop variante è molto diversa: intercaratteri intervallo è zero e il testo appare più audace che pura variante WPF. Quando il testo normale è accettabile, il testo in grassetto è brutto.

Ci sono idee su come risolverlo?

Grazie in anticipo!

risposta

17

(a cura 18 gennaio per aggiungere che non è solo la modalità di rendering dei font, ma anche il tipo di carattere in sé.)

Ci sono due fattori rilevanti qui: il tipo di carattere, e la modalità di formattazione dei caratteri.

L'applicazione host Windows Form impone una famiglia di font predefinita di "Microsoft Sans Serif" con una dimensione di 8,25pt, che nelle unità di misura di WPF è un FontSize di 11. Ma WPF utilizzerà un font diverso - I eseguo Windows 7 con il tema Aero predefinito e WPF imposta l'interfaccia utente di Segoe con un FontSize di 12.

Quindi il motivo principale per cui si ottengono risultati diversi qui è che si tratta di due tipi di carattere diversi. L'aggiunta di FontFamily="Segoe UI" FontSize="12" all'elemento radice UserControl rende i due esempi WPF più coerenti per me. (Ma questo, naturalmente, rendere il vostro testo WPF aspetto meno coerente con il testo nella contenente Windows Form app. Questo è il vero motivo per il ElementHost propaga Windows Form scelta di carattere nel contenuto WPF.)

Prima Ho modificato questo, avevamo pensato che potesse essere la differenza tra le modalità Ideal e Display per il rendering del testo WPF. Avendo capito che si tratta principalmente del carattere, non penso più che sia così, ma lascerò qui la discussione di questo altro problema perché è ancora utile per chiunque cerchi di ottenere il testo WPF in modo coerente con Windows Forma il testo L'impostazione predefinita per WPF è Ideal, ma se utilizzi un'applicazione Windows Form, probabilmente Display è meglio perché ciò renderebbe l'aspetto coerente con il modo in cui Windows Form esegue il rendering delle cose.

È possibile controllare questo in WPF su una base per-elemento aggiungendo questo:

TextOptions.TextFormattingMode="Display" 

(o "Display" a seconda della modalità che si desidera). Questa proprietà collegabile è stata aggiunta in WPF v4, per consentire all'utente di scegliere tra il rendering di testo scalabile ma leggermente sfocato di WPF dalla sua prima versione e il rendering della griglia distorta ma nitida che restituisce Win32 e GDI + (e quindi Windows Forme) utilizzare. Ciò influenzerà l'elemento a cui lo si applica e anche eventuali discendenti. (Ad esempio, se si imposta questo valore su StackPanel, questo dovrebbe applicarsi a tutti gli elementi in quel pannello, a meno che non lo si imposti anche su un valore diverso localmente sui bambini.)

Per impostazione predefinita, WPF tenta di mantenere una migliore fedeltà al design del carattere di carattere originale rispetto a Win32 o GDI +. Inoltre, rende il testo in un modo che lo riduca in modo coerente, aumentando la dimensione del carattere, diciamo che il 12% ingrandirà la larghezza del testo del 12% sullo schermo. Questo non è il caso in Win32 o GDI + dove si ottengono cambiamenti non lineari piuttosto complessi.

Ma molte persone si sono lamentate dell'aumento di sfocatura che si ottiene in cambio della migliore fedeltà. Ecco perché WPF 4 ha introdotto questa nuova proprietà. Impostalo su Display per ottenere un rendering vecchio stile meno preciso ma più nitido.

Dal momento che è possibile sceglierlo in base all'elemento, è possibile scegliere quale ti piace l'aspetto di indipendentemente per te in grassetto e il testo normale.

+0

Spiacente, non l'ho scritto, ho provato TextFormattingMode e SnapsToDevicePixels - nessun risultato per l'UserControl ospitato. –

+0

SnapsToDevicePixels non sarà di aiuto. Dove stai impostando il TextFormattingMode? Su UserControl o sulle etichette? (E che bit non hai scritto?) –

+0

Ho provato entrambi i modi, su UserControl e sulle etichette, il risultato era lo stesso. Niente è cambiato. –

Problemi correlati