2013-07-04 4 views
16

Мне было интересно, могу ли я сделать TextBox или любой элемент управления, на котором вы можете написать текст на нем, чтобы быть похожим на Word 2013, опыт анимации очень хорош.Написание текста Анимация как word2013

Теперь я могу сделать тип анимации самого элемента управления (TextBox, ...), но для этого типа анимации курсор или сам текст это новый.

enter image description here
enter image description here

+7

Для ясности (и тех, кто не видел) курсор в Office 2013 имеет анимацию развертки при перемещении между символами (в том числе при вводе или при нажатии на электронную таблицу Excel). –

+3

Если я не ошибаюсь, но, возможно, это решение будет непростым. 'Animation' в' TextBox' является ограниченным разработчиком из-за рендеринга функции WPF. Например, свойство text не является свойством зависимости, поэтому анимацию он не может задействовать. С другой стороны, в «MS Office» работает и надеется, что это нормально. Так что есть надежда на решение ... но на что? –

+0

Лично я действительно ненавижу все эти анимации в Office 2013 очень много. AAAAARGH! –

ответ

4

Вы можете создать WPF UserControl или настраиваемый элемент управления, который наследуется от текстового поля WPF по умолчанию. Мне удалось создать текстовое поле, которое анимирует позицию курсора следующим образом:

1-Создайте пользовательский элемент управления и добавьте в него текстовое поле.

2-Добавить холст с прямоугольником внутри него (прямоугольник - ваш новый курсор).

3-Установите Texboxes CaretBrush на прозрачный.

4-В коде кода UserControl создайте метод для анимации курсора при изменении положения курсора.

5 -Выберите метод анимации с шага 4, когда произойдут определенные события, которые изменили бы положение курсора.

Пример:

UserControl XAML

<UserControl 
     x:Class="YourNamespace.AnimatedCursorTextBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="23" 
     d:DesignWidth="300" 
     xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework" 
     Name="Control"> 
     <UserControl.Resources> 
      <c:BooleanToVisibilityConverter 
       x:Key="BoolToVisibility" /> 
     </UserControl.Resources> 
     <Grid> 
      <TextBox 
       Name="MainTextBox" 
       CaretBrush="Transparent" 
       SelectionChanged="MainTextBox_SelectionChanged" 
       TextChanged="MainTextBox_TextChanged" 
       GotKeyboardFocus="MainTextBox_GotKeyboardFocus" /> 
      <Canvas 
       Visibility="{Binding IsKeyboardFocusWithin, 
        ElementName=Control, 
        Converter={StaticResource BoolToVisibility}}" 
       Height="{Binding ActualHeight, ElementName=MainTextBox}" 
       Width="{Binding ActualWidth, ElementName=MainTextBox}"> 
       <Rectangle 
        HorizontalAlignment="Left" 
        Name="Caret" 
        Width="1" 
        Fill="Black" /> 
      </Canvas> 
     </Grid> 
    </UserControl> 

Code-Behind:

public partial class AnimatedCursorTextBox : UserControl 
     { 
      private DoubleAnimation cursorAnimation = new DoubleAnimation(); 

      public AnimatedCursorTextBox() 
      { 
       InitializeComponent(); 
      } 

      private void UpdateCaretPosition() 
      { 
       var rectangle = MainTextBox.GetRectFromCharacterIndex(MainTextBox.CaretIndex); 
       Caret.Height = rectangle.Bottom - rectangle.Top; 
       Canvas.SetTop(Caret, rectangle.Top); 
       Canvas.SetBottom(Caret, rectangle.Bottom); 

       var left = Canvas.GetLeft(Caret); 
       if (!double.IsNaN(left)) 
       { 
        cursorAnimation.From = left; 
        cursorAnimation.To = rectangle.Right; 
        cursorAnimation.Duration = new Duration(TimeSpan.FromSeconds(.05)); 

        Caret.BeginAnimation(Canvas.LeftProperty, cursorAnimation); 
       } 
       else 
       { 
        Canvas.SetLeft(Caret, rectangle.Right); 
       } 
      } 

      private void MainTextBox_SelectionChanged(object sender, RoutedEventArgs e) 
      { 
       UpdateCaretPosition(); 
      } 

      private void MainTextBox_TextChanged(object sender, TextChangedEventArgs e) 
      { 
       UpdateCaretPosition(); 
      } 

      private void MainTextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
      { 
       UpdateCaretPosition(); 
      } 
     } 

Примечание: Это не является исчерпывающим решением, поскольку он не обрабатывает анимацию подсветки выбранного текст, и он не скрывает курсор, когда текст выделен, но он запускается. Я рекомендую создать это как настраиваемый элемент управления, наследующий от TextBox, а затем сделать макет элемента управления в шаблоне стиля по умолчанию в текстовом поле, вместо использования UserControl. Таким образом, вы можете сохранить все функциональные возможности TextBox, но при этом получить новые возможности анимации. Дополнительные сведения о пользовательских элементах управления в WPF см. В статье this, посвященной codeproject.

Чтобы изменить скорость анимации, просто измените продолжительность курсора.

-1

Не быть грубым, но ваш английский немного хитрым, чтобы полностью понять, так что я надеюсь, что это близко к тому, что вы хотели?

Моей рекомендацией было бы создать новый элемент управления «Текстовое поле», создав новый элемент управления, который наследует текстовое поле. Затем вы переопределяете событие onPaint, чтобы теперь вы контролировали, как текстовое поле рисует сам.

public class newTextBox : System.Windows.Forms.TextBox 
{ 
    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     base.OnPaint(e); 
    } 
} 

Это теперь дает вам контроль над тем, как ваш элемент управления рисует себя, и вы можете использовать его вместо текстовых полей с таким же поведением.

Сложный бит, который я оставлю вам, чтобы попытаться сделать или открыть новый вопрос, является графической стороной вещей, поэтому, когда пользователь перемещает курсор, он плавно перемещает линию, которую вы лично рисуете, таким образом, имеют полный контроль.

Если вы считаете это сложным, сначала загляните в объект e.Graphics и функции, которые он содержит.

+3

'' Сложный бит, который я оставлю вам попробовать, или открыть новый вопрос, является графической стороной вещей, поэтому, когда пользователь перемещает курсор, он плавно перемещает строку, которую вы лично рисуете " - Я думаю, это то, о чем спрашивают ОП. – keyboardP

+0

@keyboardP WTF, я дал одно из возможных направлений, по которым он мог войти, и я сказал «попробуй» или открой новый вопрос, так как это другая тема? Я думал, что его проблема заключалась в его рисовании? Пользователи должны ПОПРОБУЙТЕ вариант, прежде чем просить больше и больше помочь? – Tom

+1

Я не спустил вас вниз, но вы не дали достаточного указания для OP, чтобы войти, и не должны открывать новый вопрос, поскольку их вопрос в порядке. Вы не объяснили, как метод OnPaint может перерисовать курсор, который является основной частью вопроса. Переопределение метода OnPaint не является ответом на вопрос, потому что вы пропускаете ключевую часть того, что должно идти в методе OnPaint. – keyboardP

Смежные вопросы