2009-10-15 12 views
5

mam ten XAML:Zagnieżdżone blokady tekstowe i hiperłącza, w jaki sposób replikować ten XAML w języku C#?

<TextBlock TextWrapping="Wrap" Foreground="Green" 
      Text="This is some Green text up front. "> 
    <TextBlock Foreground="Blue"> 
     This is some Blue text. 
    </TextBlock> 
    This is some Green text following the Blue text. 
    <Hyperlink> 
     <TextBlock Text="And finally, this is a Hyperlink." TextWrapping="Wrap"/> 
    </Hyperlink> 
</TextBlock> 

I chciałbym wiedzieć jak replikować go proceduralnie w C#.

wiem jak stworzyć TextBlock s w C# z czymś takim:

TextBlock tb = new TextBlock(); 
tb.Text="Some text" 

I mogę postawić wielokrotność TextBlock y razem w panelu w C#. Ale nie widzę sposobu, w jaki podchodzisz do wprowadzania TextBlock s do innych TextBlock s i TextBlock s do s do s.

Czy niektóre obiekty kontenerowe i dodatkowe obiekty TextBlock są tworzone automatycznie, w jakiś sposób? Lub czy TextBlock ma pewne metody/właściwości, które pozwalają mu na inne elementy?

Inne powiązane pytania:
1. Jaki jest najlepszy sposób dodania czegoś podobnego do zdarzenia Click() do Hyperlink?
2. Czy istnieje sposób na uzyskanie bardziej przejrzystego niebieskiego tekstu? W powyższym XAML, gdy tylko słowo po prawej stronie będzie musiało być zawijane, cały blok niebieskiego tekstu jest zawijany.

Dzięki za oświetlenie, które możesz dostarczyć.

Odpowiedz

1

Nie wiem o TextBlocks, ale oto jak można to zrobić w RichTextBox. Możesz użyć RichTextBox zamiast TextBlock.

RichTextBox rtbTest = new RichTextBox(); 
rtbTest.IsDocumentEnabled = true; 

FlowDocument fd = new FlowDocument(); 
Paragraph para = new Paragraph(); 

Run r4 = new Run("Some Text To Show As Hyperlink"); 
Hyperlink h4 = new Hyperlink(r4); 
h4.Foreground = Brushes.Red; //whatever color you want the HyperLink to be 

// If you want the Hyperlink clickable 
h4.NavigateUri = new Uri("Some URL"); 
h4.RequestNavigate += new RequestNavigateEventHandler(h_RequestNavigate); 
// Leaving the two previous lines out will still make the Hyperlink, but it won't be clickable 

// use this if you don't want an underline under the HyperLink 
h4.TextDecorations = null; 

para.Inlines.Add(h4); 

fd.Blocks.Add(para); 

rtbTest.Document = fd; 

Dla zwykłego tekstu po prostu użyłem HyperLink, ale usunąłem dwie linie, które umożliwiły kliknięcie. Daje to tekstowi kolor, ale nie będzie klikalny. Mimo to nadal zmienia kursor. Chociaż jestem pewien, że istnieje również własność, która to zmieni.

7

Możesz modyfikować kolekcję Inline naświetloną poprzez TextBlock's Inlines property. Powyższe próbki XAML będzie wyglądać trochę coś takiego:

TextBlock tb = new TextBlock 
       { 
        Text = "This is some Green text up front.", 
        Foreground = Brushes.Green 
       }; 

InlineCollection tbInlines = tb.Inlines; 

tbInlines.Add(new Run 
       { 
       Text = "This is some Blue text.", 
       TextWrapping = TextWrapping.Wrap, 
       Foreground = Brushes.Blue 
       }); 

tbInlines.Add(new Run 
       { 
       Text = "This is some Green text following the Blue text." 
       }); 

Run hyperlinkRun = new Run("And finally, this is a Hyperlink."); 

tbInlines.Add(new Hyperlink(hyperlinkRun)); 

Jak dla swoich powiązanych pytań:

1a) O ile to możliwe, aby podłączyć moduł obsługi zdarzeń do każdego hiperłącza przykład za pomocą zdarzenia RequestNavigate na klasy, które mogą być kosztowne w konfiguracji i zużywają więcej pamięci niż jest to konieczne. Zamiast tego zalecam stosowanie zdarzeń routowanych i po prostu podpinanie zdarzenia RequestNavigate w kontenerze, w którym będą znajdować się wszystkie hiperłącza. Można to zrobić tak:

myContainer.AddHandler(
        Hyperlink.RequestNavigateEvent, 
        new RequestNavigateEventHandler(
                 (sender, args) => 
                 { 
                 /* sender is the instance of the Hyperlink that was clicked here */ 
                 })); 

2a) W przykładzie XAML to traktując wewnętrzną TextBlock jako element, który musi być zawinięte razem. Jeśli używasz mojego podejścia opartego na Run, owijanie powinno być dziedziczone z bloku zawierającego tekst.

+0

Wielkie dzięki. Używałem Dockpanel plus wiele TextBlocks, które miały wszelkiego rodzaju problemy z zawijaniem. Przełączyłem się na Single TextBlock z wieloma Runami i kilkoma dodanymi Hyperlinkami i pięknie je zawijam. Nie mogłem wyzwolić zdarzenia HyperLink.RequestNavigateEvent. Próbowałem dodać go w wielu lokalizacjach od samego Hiperłącza, aż do okna bez powodzenia. Na razie Hyperlink.Click wydaje się robić lewy. Jakieś pomysły? –

+0

Hej Drew, czy wiesz jak to zrobić poprzez xaml z wiązaniem danych? Dzięki temu n elementów jest wyświetlanych tak, jakby zagnieżdżono kilka hiperłączy w jednym bloku tekstowym. –

Powiązane problemy