2012-03-26 7 views
2

Ich möchte eine feste Breite TextBlock haben, die langen, ungebrochenen, horizontalen Text hat, und bin auf der Suche nach einem guten Ansatz, um den gesamten Text vom Benutzer gelesen werden zu können. Ich möchte etwas anspruchsvolleres als nur die Steuerung in eine ScrollViewer setzen.Horizontales automatisches Scrollen von Text in einem TextBlock

First (ideal) Option ist in der Lage sein, mit der Maus über die TextBlock zu schweben, und wenn die Maus zum Beispiel rechts der Mitte ist, wäre es nach rechts scrollen (mit zunehmender Geschwindigkeit, je weiter man vom Zentrum bewegen). Ich denke, dies ist machbar, indem Sie MouseEnter/MouseOver-Ereignisse im TextBlock behandeln, herausfinden, wo sich der Cursor innerhalb des TextBlocks befindet, und einige Auswahlrechtecke/Animationen entsprechend aktivieren. Ich suche nach Ansätzen, wie ich das machen kann, zumal ich wenig Erfahrung mit Animationen in WPF habe. Ich würde gerne das Detail selbst herausfinden, aber kämpfen um anzufangen.

Die zweite Option wäre eine RepeatButton auf beiden Seiten des Textes, und wenn Sie den Mauszeiger darüber halten, scrollt es den Text.

Ein erster Versuch:

<RepeatButton ClickMode="Hover" 
       Command="{x:Static ComponentCommands.MoveLeft}" 
       CommandTarget="{Binding ElementName=TextAutoScroller}" 
       Content="Go left" /> 

<ScrollViewer x:Name="TextAutoScroller" Grid.Column="1" 
       VerticalScrollBarVisibility="Disabled" 
       HorizontalScrollBarVisibility="Hidden"> 
    <TextBlock VerticalAlignment="Center" 
       Text="The quick brown fox jumps over the lazy dog.&#x0d;&#x0a;The quick brown fox jumps over the lazy dog.&#x0d;&#x0a;The quick brown fox jumps over the lazy dog." /> 
</ScrollViewer> 

<RepeatButton Grid.Column="2" 
       ClickMode="Hover" 
       Command="{x:Static ComponentCommands.ScrollPageRight}" 
       CommandTarget="{Binding ElementName=TextAutoScroller}" 
       Content="Go right" /> 

Das Problem dabei ist, dass beide RepeatButton Steuerelemente deaktiviert ist - scheint, dass weder MoveLeft oder ScrollPageRight werden unterstützt, aber ScollPageDown (nicht gut für mein horizontales Szenario) funktioniert ok?

Alle Tipps oder Vorschläge zu beiden Optionen würden sehr geschätzt werden!

+0

Tooltip mit Volltext? – GazTheDestroyer

+0

Tooltip ist, was ich gerade habe, aber möchte mit diesem Auto-Scrolling-Konzept experimentieren. – Lyall

+1

Nur meine Meinung, aber Auto Scroll klingt nicht gut für mich. Ich würde nicht wollen, dass mein Display einfach nur mit der Maus bewegt wird. – GazTheDestroyer

Antwort

1

Eine gute Lösung für die wiederholbare Tastenversion wäre, den Scrollviewer nur schrittweise zu scrollen.

private void scrollLeft_Click(object sender, RoutedEventArgs e) 
{ 
    sv.ScrollToHorizontalOffset(sv.HorizontalOffset - 10); 
} 

private void scrollRight_Click(object sender, RoutedEventArgs e) 
{ 
    sv.ScrollToHorizontalOffset(sv.HorizontalOffset + 10); 
} 

Die oben geht davon aus Ihrem Text in einem Scroll namens sv gewickelt ist, mit zwei repeatbuttons.

Wenn Sie die mehr beschleunigen möchten haben Sie es in gehalten:

private int offset = 1; 
    private int maxOffset = 50; 

    private void scrollLeft_Click(object sender, RoutedEventArgs e) 
    { 
     sv.ScrollToHorizontalOffset(sv.HorizontalOffset - offset); 
     offset += offset < maxOffset ? 1 : 0; 
    } 

    private void scrollRight_Click(object sender, RoutedEventArgs e) 
    { 
     sv.ScrollToHorizontalOffset(sv.HorizontalOffset + offset); 
     offset += offset < maxOffset ? 1 : 0; 
    } 

    private void scrollRight_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     offset = 1; 
    } 

ich auch in wiegen würde und empfehlen die Verwendung nicht die Clickmode = „Hover“ ... User sind mehr daran gewöhnt, klicken Tasten. Nur meine zwei Cent.