2013-06-20 3 views
0

Мне нужно реализовать на C# .NET с WPF анимацию ScrollBar для управления RichTextBox.C# WPF Scroll Animation на RichTextBox

Когда я нажимаю на кнопку, анимация должна привести меня в конец текста. Для этого я использую метод ScrollToEnd(), но я не знаю, как выполнить анимацию. Я пробовал вещи с помощью метода BeginAnimation(), но ничего не работало.

Если бы кто-нибудь из вас имел какие-либо идеи, это было бы здорово. Благодаря!

Мой XAML:

<Window x:Class="TestWpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="177.811" Width="338.88"> 
<Grid Margin="0,0,2,-1"> 
    <RichTextBox x:Name="rtb" HorizontalAlignment="Left" Height="100" Margin="10,10,0,0" VerticalAlignment="Top" Width="319" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
     <FlowDocument> 
      <Paragraph> 
       <Run Text="RichTextBoxR 
        ichTextBoxRichTextBoxRichTextBoxRic 
        hTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTe 
        xtBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRic 
        hTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextB 
        oxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRi 
        extBoxRichTextBoxRichTextBoxRichTextBoxRichTe 
        xtBoxRichTextBoxRichTextBoxRichTextBoxRichTextBoxRichTe 
        xtBoxRichTextBoxRich 
        TextBoxRichT 
        extBox"/> 
      </Paragraph> 
     </FlowDocument> 
    </RichTextBox> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="122,121,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> 
</Grid> 

Моя кнопка метод нажмите на XAML.cs:

private void Button_Click_1(object sender, RoutedEventArgs e) { rtb.ScrollToEnd(); } 

Спасибо большое! С наилучшими пожеланиями.

+0

Что вы пытаетесь сжигать? – Paparazzi

+0

Как я уже сказал, я пытаюсь оживить полосу прокрутки для прокрутки в конце текста – ValarMorghulis

ответ

1

Хорошо, я нашел решение. Я создал новый класс от свойств RichTextBox и добавил DependencyProperty сделать это работает:

class ExtRichTextBox : RichTextBox 
{ 
    public static DependencyProperty CurrentVerticalOffsetProperty = 
     DependencyProperty.Register("CurrentVerticalOffset", typeof(double), typeof(ExtRichTextBox), new PropertyMetadata(new PropertyChangedCallback(OnVerticalChanged))); 

    private static void OnVerticalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ExtRichTextBox extRtb = d as ExtRichTextBox; 
     extRtb.ScrollToVerticalOffset((double)e.NewValue); 
    } 

    public double CurrentVerticalOffset 
    { 
     get { return (double)this.GetValue(CurrentVerticalOffsetProperty); } 
     set { this.SetValue(CurrentVerticalOffsetProperty, value); } 
    } 
} 

Конечно, вы должны заменить старый контроль со стороны новой затем использовать раскадровку для анимации скроллбара:

 private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     DoubleAnimation vertAnim = new DoubleAnimation(); 
     vertAnim.From = rtb.VerticalOffset; 
     vertAnim.To = 100; 
     vertAnim.DecelerationRatio = .2; 
     vertAnim.Duration = new Duration(TimeSpan.FromMilliseconds(1000)); 
     Storyboard sb = new Storyboard(); 
     sb.Children.Add(vertAnim); 
     Storyboard.SetTarget(vertAnim, rtb); 
     Storyboard.SetTargetProperty(vertAnim, new PropertyPath(ExtRichTextBox.CurrentVerticalOffsetProperty)); 
     sb.Begin(); 
    } 

Просто замените координаты, присвоенные vertAnim.To для прокрутки в нужном месте.