Ich habe Probleme, Silverlight 2.0 zu bekommen, um Text genau so auszulegen, wie ich es möchte. Ich möchte Text mit Zeilenumbrüchen und eingebetteten Links, mit Umbruch, wie HTML-Text in einer Webseite.Silverlight 2.0 - Kann das gewünschte Textumbruchverhalten nicht erhalten
Hier ist der nächste, dass ich gekommen bin:
<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>
Aber das Problem ist, dass, obwohl die Textblöcke TB1 und TB2 auf der gleichen Linie gehen, denn es gibt genug Platz für sie vollständig ist, tb3 wird weiter nicht Beginnen Sie auf der gleichen Linie wie der vorherige Block, obwohl es in den folgenden Zeilen eingewickelt wird.
Ich möchte, dass jeder Textblock beginnt, wo der vorherige endet, in der gleichen Zeile. Ich möchte Click-Event-Handler auf einen Teil des Textes setzen. Ich möchte auch Absatzpausen. Im Wesentlichen versuche ich, das Fehlen von FlowDocument- und Hyperlink-Steuerelementen in Silverlight 2.0-Teilmenge von XAML zu umgehen.
Warum nicht läuft für den Nicht-klickbaren Text:
Um die Fragen in den Antworten gestellt beantworten? Wenn ich einzelne TextBlocks nur für den anklickbaren Text verwende, leiden diese Textabschnitte immer noch unter dem oben dargestellten Wrapping-Problem. Und der TextBlock kurz vor dem Link und der TextBlock kurz danach. Im Wesentlichen alles. Es sieht nicht so aus, als hätte ich viele Möglichkeiten, mehrere Runs im selben TextBlock zu platzieren.
Teilen der Links aus dem anderen Text mit RegExs und Schleifen ist nicht das Problem überhaupt, das Problem ist Display-Layout.
Warum nicht jedes Wort in einen einzelnen TextBlock in einem WrapPanel einfügen Abgesehen davon, dass es sich um einen hässlichen Hack handelt, funktioniert das bei Zeilenumbrüchen nicht gut - das Layout ist falsch.
Es würde auch die Unterstreichung von verknüpften Text in eine gestrichelte Linie machen.
Hier ist ein Beispiel mit jedem Wort in einem eigenen TextBlock. Versuchen Sie es auszuführen, beachten Sie, dass der Zeilenumbruch überhaupt nicht an der richtigen Stelle angezeigt wird.
<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>
Was ist mit den LinkLabelControl als here und here. Es hat die gleichen Probleme wie der obige Ansatz, da es in etwa gleich ist. Versuchen Sie, das Beispiel auszuführen und den Linktext länger und länger zu machen, bis es umgebrochen wird. Beachten Sie, dass die Verknüpfung in einer neuen Zeile beginnt, was nicht der Fall sein sollte. Machen Sie den Linktext noch länger, so dass der Linktext länger als eine Zeile ist. Beachten Sie, dass es nicht umwickelt, es schneidet ab. Dieses Steuerelement verarbeitet keine Zeilenumbrüche und Absatzunterbrechungen.
Warum in läuft, legen Sie den Text nicht alle Klicks auf die enthaltenden TextBlock- erkennen und herauszufinden, welche Lauf Runs Mausereignisse nicht, wurde angeklickt haben, aber das enthält TextBlock- tut. Ich kann keinen Weg finden zu überprüfen, ob der Lauf unter der Maus ist (IsMouseOver ist in SilverLight nicht vorhanden) oder um die Begrenzungsgeometrie des Laufs zu finden (keine Clip-Eigenschaft).
Es gibt VisualTreeHelper.FindElementsInHostCoordinates()
Der folgende Code verwendet VisualTreeHelper.FindElementsInHostCoordinates, um die Steuerelemente unter dem Klick zu erhalten. Die Ausgabe listet den TextBlock, aber nicht den Run auf, da ein Run kein UIElement ist.
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;
}
einen leeren Textblock mit einer Marge auf Platz folgenden Inhalts auf eine folgende Zeile verwenden
ich diese eine noch denken bin. Wie berechnen Sie die richtige Breite für einen Zeilenumbruchblock, um folgenden Inhalt auf die folgende Zeile zu erzwingen? Zu kurz und der folgende Inhalt befindet sich immer noch in derselben Zeile auf der rechten Seite. Zu lang und der "Zeilenumbruch" wird in der folgenden Zeile sein, mit Inhalt danach. Sie müssten die Pausen ändern, wenn die Größe des Steuerelements geändert wird.
Einige der Code hierfür lautet:
TextBlock lineBreak = new TextBlock();
lineBreak.TextWrapping = TextWrapping.Wrap;
lineBreak.Text = " ";
// need adaptive width
lineBreak.Margin = new Thickness(0, 0, 200, 0);
Können Sie einen Screenshot des Effekts posten, den Sie erhalten möchten? Das Xaml oben hat keine Links, aber Sie verweisen auf Links in Ihrer Frage. – Bryant
Bryant: schau dir irgendeine Webseite an. – Anthony