Można utworzyć kontrolkę użytkownika WPF lub kontrolkę niestandardową, która dziedziczy po domyślnym polu tekstowym WPF. Udało mi się utworzyć pole tekstowe, które animuje pozycję kursora za pomocą następującej metody:
1-Utwórz kontrolkę użytkownika i dodaj do niej pole tekstowe.
2-Dodaj płótno z prostokątem w środku (prostokąt to twój nowy kursor).
3-Ustaw Texboxes CaretBrush na przezroczysty.
4-W kodzie użytkownika UserControl utwórz metodę animacji kursora po zmianie położenia kursora.
5 - Wywołaj metodę animacji od kroku 4, gdy wystąpią określone zdarzenia, które zmieniły pozycję kursora.
przykład:
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>
opóźnieniem kodu:
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();
}
}
Uwaga: Nie jest kompleksowe rozwiązanie, ponieważ nie obsługuje animacji podkreślenia wybrane tekst i nie ukrywa kursora, gdy tekst jest podświetlony, ale jest to początek. Polecam tworzenie tego jako kontrolki niestandardowej dziedziczącej z TextBox, a następnie układ układu kontrolki w szablonie domyślnego stylu pola tekstowego zamiast używania kontrolki UserControl. W ten sposób możesz zachować wszystkie funkcje TextBox, ale wciąż masz nowe funkcje animacji. Aby uzyskać więcej informacji o sterowaniach niestandardowych w WPF, zobacz artykuł o kodzie codeproject: this.
Aby zmienić szybkość animacji, po prostu zmień czas trwania animacji kursora.
Dla przejrzystości (i tych, którzy nie widzieli), kursor w pakiecie Office 2013 ma animację przeciągnięcia, gdy porusza się pomiędzy znakami (w tym podczas wpisywania lub po kliknięciu arkusza kalkulacyjnego programu Excel). –
Jeśli się nie mylę, może ta decyzja nie będzie łatwa. 'Animacja' w' TextBox' jest ograniczonym programistom z powodu funkcji renderowania 'WPF'. Na przykład właściwość text nie jest właściwością zależności, więc animacja, której on nie może dotyczyć. Z drugiej strony, w "MS Office" działa to i nadzieja jest realizowana normalnie. Jest więc nadzieja na rozwiązanie ... ale na czym? –
Osobiście naprawdę nienawidzę tych animacji w Office 2013 bardzo bardzo. AAAAARGH! –