2009-08-09 8 views
15

Próbuję utworzyć hiperłącze zawierające tekst z super- i/lub indeksem dolnym. Znalazłem dwa sposoby, aby to zrobić, i obaj są do bani. Roztwór nr 1: użyj Typography.Variants. Daje to świetny indeks górny ... dla niektórych czcionek.Superscript/subscript w hiperłączu w WPF

<StackPanel> 
    <TextBlock FontFamily="Palatino Linotype" FontSize="30"> 
    <Hyperlink>R<Run Typography.Variants="Superscript">2</Run></Hyperlink> 
    (Palatino Linotype) 
    </TextBlock> 
    <TextBlock FontFamily="Segoe UI" FontSize="30"> 
    <Hyperlink>R<Run Typography.Variants="Superscript">2</Run></Hyperlink> 
    (Segoe UI) 
    </TextBlock> 
</StackPanel> 

http://www.excastle.com/misc/wpf-superscript-fontvariants.png

wygląda pięknie w Palatino Linotype; ale w przypadku czcionek, które nie obsługują wariantów, są po prostu ignorowane, emulacja nie jest wykonywana, a tekst jest pełnowymiarowy, na linii bazowej, w 100% normalny. Wolałbym, aby moi użytkownicy końcowi wybrali czcionkę, której chcą używać, i nadal działają super/indeksy dolne. Roztwór nr 2: użyj BaselineAlignment. Podnosi lub obniża tekst odpowiednio, choć w przeciwieństwie do rozwiązania nr 1 muszę ręcznie zmniejszyć rozmiar czcionki. Mimo to działa dla wszystkich czcionek. Problem polega na podkreśleniu hiperłącza.

<TextBlock FontSize="30" FontFamily="Palatino Linotype"> 
    <Hyperlink> 
    R<Run BaselineAlignment="Superscript" FontSize="12pt">2</Run> 
    </Hyperlink> 
</TextBlock> 

http://www.excastle.com/misc/wpf-superscript-baselinealignment.png

podkreślenia jest podnoszony i opuszczany wraz z tekstem, który wygląda dość nędzny. Wolę ciągłe, nieprzerwane podkreślenie pod całym Hiperłączem. (I zanim ktokolwiek zasugeruje obramowanie, chciałbym również, aby Hiperłącze było w stanie zawijać słowa, z wszystkimi podkreślonymi słowami, w tym pierwszym wierszem.)

Czy istnieje sposób na tworzenie indeksu górnego i dolnego w WPF, w dowolnej czcionce, nie wyglądając śmiesznie źle, gdy podkreślono?

Odpowiedz

12

Jeżeli hiperłącze nie zamierza zawinąć do więcej niż jednej linii, a następnie umieszczanie inny TextBlock może pracować:

<TextBlock FontSize="30" FontFamily="Palatino Linotype"> 
    <Hyperlink> 
    <TextBlock> 
     R<Run BaselineAlignment="Superscript" FontSize="12pt">2</Run> 
    </TextBlock> 
    </Hyperlink> 
</TextBlock> 

To daje solidne hiperłącze pod dziecka hiperłącze, co oznacza nieprzerwaną hiperłącze:

http://www.excastle.com/misc/wpf-superscript-baselinealignment-better.png

Jednakże, jeżeli osadzony TextBlock musi zawijać do wielu linii, będziesz tylko ge t jeden podkreślenie pod całą ust owinięty zamiast podkreślając każdy wiersz tekstu:

http://www.excastle.com/misc/wpf-superscript-baselinealignment-badwrap.png

Jeśli można umieścić TextBlock tylko wokół krótkiego kawałka treści, które potrzebuje indeksu górnego - EG, dookoła tylko R^2 w powyższym przykładzie - i pozostaw resztę tekstu do hiperłącza, a następnie otrzymasz podkreślenie jako normalne. Czasem jednak nie jest to praktyczne, więc warto o tym pamiętać.

1

Można używać znaków indeksu górnego (Unicode) (np.http://www.fileformat.info/info/unicode/char/b2/index.htm)

Jak to:

<TextBlock FontSize="30" FontFamily="Segoe UI"> 
    <Hyperlink> 
     Apply R² Calculation 
    </Hyperlink> 
</TextBlock> 

Wynik:

Result image

Oczywiście to nie będzie działać, chyba że co są super skryptowym rzeczywiście ma unicode indeks górny znak.