Mam problem z ustawieniem Silverlight 2.0 w celu ułożenia tekstu dokładnie tak, jak chcę. Chcę tekstu z podziałami linii i osadzonymi linkami, z zawijaniem, jak tekst HTML na stronie internetowej.Silverlight 2.0 - Nie można uzyskać zachowania zawijania tekstu, które chcę.
Oto najbliżej że przyszedłem:
<UserControl x:Class="FlowPanelTest.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
Width="250" Height="300">
<Border BorderBrush="Black" BorderThickness="2" >
<Controls:WrapPanel>
<TextBlock x:Name="tb1" TextWrapping="Wrap">Short text. </TextBlock>
<TextBlock x:Name="tb2" TextWrapping="Wrap">A bit of text. </TextBlock>
<TextBlock x:Name="tb3" TextWrapping="Wrap">About half of a line of text.</TextBlock>
<TextBlock x:Name="tb4" TextWrapping="Wrap">More than half a line of longer text.</TextBlock>
<TextBlock x:Name="tb5" TextWrapping="Wrap">More than one line of text, so it will wrap onto the following line.</TextBlock>
</Controls:WrapPanel>
</Border>
</UserControl>
Ale problemem jest to, że chociaż TB1 bloki tekstowe i TB2 pójdzie na tej samej linii, ponieważ nie ma dość miejsca dla nich całkowicie, TB3 roku nie będzie zacznij od tej samej linii co poprzedni, nawet jeśli zostanie zawinięty do następnych linii.
Chcę, aby każdy blok tekstu zaczął się tam, gdzie kończy się poprzedni, w tym samym wierszu. Chcę dodać obsługę zdarzeń kliknięcia do niektórych tekstów. Też chcę przerwy na akapity. Zasadniczo staram się obejść brak kontroli FlowDocument i Hiperłącze w podzestawie XAML w Silverlight 2.0.
Aby odpowiedzieć na pytania stawiane w odpowiedziach:
Dlaczego nie korzystać z tras dla tekstu nieklikalna? Jeśli po prostu użyję pojedynczych bloków tekstowych tylko w klikalnym tekście, to te bity tekstu będą nadal cierpieć z powodu opisanego powyżej problemu z zawijaniem. I TextBlock tuż przed linkiem, a TextBlock zaraz po. Zasadniczo to wszystko. Nie wygląda na to, że mam wiele okazji do umieszczenia wielu przebiegów w tym samym TextBlock.
Dzielenie linków z innego tekstu za pomocą RegEx i pętli nie jest w ogóle problemem, problemem jest układ ekranu.
Dlaczego nie umieścić każde słowo w indywidualnej TextBlock w WrapPanel Oprócz bycia brzydki hack, to nie grać w ogóle dobrze z wierszami - układ jest nieprawidłowy.
Utworzy również styl podkreślenia połączonego tekstu w przerywaną linię.
Oto przykład każdego słowa w jego własnej blokadzie tekstowej. Spróbuj uruchomić, pamiętaj, że linia podziału nie jest wyświetlana we właściwym miejscu.
<UserControl x:Class="SilverlightApplication2.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
Width="300" Height="300">
<Controls:WrapPanel>
<TextBlock TextWrapping="Wrap">Short1 </TextBlock>
<TextBlock TextWrapping="Wrap">Longer1 </TextBlock>
<TextBlock TextWrapping="Wrap">Longerest1 </TextBlock>
<TextBlock TextWrapping="Wrap">
<Run>Break</Run>
<LineBreak></LineBreak>
</TextBlock>
<TextBlock TextWrapping="Wrap">Short2</TextBlock>
<TextBlock TextWrapping="Wrap">Longer2</TextBlock>
<TextBlock TextWrapping="Wrap">Longerest2</TextBlock>
<TextBlock TextWrapping="Wrap">Short3</TextBlock>
<TextBlock TextWrapping="Wrap">Longer3</TextBlock>
<TextBlock TextWrapping="Wrap">Longerest3</TextBlock>
</Controls:WrapPanel>
</UserControl>
co z LinkLabelControl jako here i here. Ma takie same problemy jak powyższe podejście, ponieważ jest prawie taki sam. Spróbuj uruchomić próbkę i spraw, aby tekst linku był dłuższy i dłuższy, dopóki się nie opakuje. Zwróć uwagę, że link zaczyna się od nowej linii, której nie powinien. Zwiększ tekst linku, aby tekst linku był dłuższy niż linia. Zwróć uwagę, że w ogóle się nie zawija, odcina. Ta kontrolka również nie obsługuje podziałów linii i akapitów.
Dlaczego nie umieścić tekst wszystkim w seriach, wykryć kliknięć na zawierającego TextBlock i wypracować który prowadzony był kliknięciu Działa nie mają zdarzenia myszy, ale zawierający TextBlock robi. Nie mogę znaleźć sposobu sprawdzenia, czy przebieg jest pod myszą (IsMouseOver nie jest obecny w SilverLight) ani w celu znalezienia geometrii granicznej przebiegu (bez właściwości clip).
niejest VisualTreeHelper.FindElementsInHostCoordinates()
poniżej kodu wykorzystuje VisualTreeHelper.FindElementsInHostCoordinates, aby uzyskać kontrolę pod kliknięciem. Dane wyjściowe zawierają TextBlock, ale nie Run, ponieważ Run nie jest UIElement.
private void theText_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// get the elements under the click
UIElement uiElementSender = sender as UIElement;
Point clickPos = e.GetPosition(uiElementSender);
var UiElementsUnderClick = VisualTreeHelper.FindElementsInHostCoordinates(clickPos, uiElementSender);
// show the controls
string outputText = "";
foreach (var uiElement in UiElementsUnderClick)
{
outputText += uiElement.GetType().ToString() + "\n";
}
this.outText.Text = outputText;
}
Użyj pusty blok tekstu z marginesem do przestrzeni następujące treści na o następującej linii
ja wciąż myśli o tym. Jak obliczyć właściwą szerokość bloku łamania linii, aby wymusić następującą zawartość na następujący wiersz? Zbyt krótki, a następująca treść nadal będzie znajdować się w tym samym wierszu po prawej stronie. Zbyt długi i "linebreak" będzie w następującym wierszu, z treścią po nim. Będziesz musiał zmienić rozmiar przerw po zmianie rozmiaru kontrolki.
Niektóre kodzie to:
TextBlock lineBreak = new TextBlock();
lineBreak.TextWrapping = TextWrapping.Wrap;
lineBreak.Text = " ";
// need adaptive width
lineBreak.Margin = new Thickness(0, 0, 200, 0);
Czy możesz opublikować zrzut ekranu przedstawiający efekt, który chcesz uzyskać? Xaml na górze nie ma jeszcze żadnych linków, ale wciąż odnosisz się do linków w twoim pytaniu. – Bryant
Bryant: spójrz na dowolną stronę internetową. – Anthony