Вы можете создать 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.
Чтобы изменить скорость анимации, просто измените продолжительность курсора.
Для ясности (и тех, кто не видел) курсор в Office 2013 имеет анимацию развертки при перемещении между символами (в том числе при вводе или при нажатии на электронную таблицу Excel). –
Если я не ошибаюсь, но, возможно, это решение будет непростым. 'Animation' в' TextBox' является ограниченным разработчиком из-за рендеринга функции WPF. Например, свойство text не является свойством зависимости, поэтому анимацию он не может задействовать. С другой стороны, в «MS Office» работает и надеется, что это нормально. Так что есть надежда на решение ... но на что? –
Лично я действительно ненавижу все эти анимации в Office 2013 очень много. AAAAARGH! –