Bạn có thể tạo một UserFrol WPF hoặc điều khiển tùy chỉnh kế thừa từ hộp văn bản WPF mặc định. Tôi đã có thể tạo một hộp văn bản làm động vị trí con trỏ bằng phương pháp sau:
1-Tạo điều khiển người dùng và thêm hộp văn bản vào nó.
2-Thêm canvas bằng hình chữ nhật bên trong nó (hình chữ nhật là con trỏ mới của bạn).
3 Đặt ô chữ Texetes CaretBrush thành trong suốt.
4-Trong mã của UserControl, tạo phương thức để tạo hiệu ứng con trỏ khi vị trí con trỏ thay đổi.
5-Gọi phương thức hoạt ảnh từ bước 4 khi xảy ra các sự kiện nhất định sẽ thay đổi vị trí con trỏ.
Ví dụ:
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();
}
}
Lưu ý: Đây không phải là một giải pháp toàn diện bởi vì nó không xử lý các hình ảnh động làm nổi bật được lựa chọn văn bản và nó không ẩn con trỏ khi văn bản được đánh dấu, nhưng nó là một sự khởi đầu. Tôi khuyên bạn nên tạo điều này dưới dạng điều khiển tùy chỉnh kế thừa từ TextBox và sau đó thực hiện bố cục của điều khiển trong mẫu kiểu mặc định của hộp văn bản thay vì sử dụng UserControl. Bằng cách đó bạn có thể bảo toàn tất cả các chức năng của TextBox nhưng vẫn nhận được các tính năng hoạt hình mới. Để biết thêm thông tin về điều khiển tùy chỉnh trong WPF, hãy xem this bài viết về lập trình.
Để thay đổi tốc độ của hoạt ảnh, chỉ cần thay đổi thời lượng của con trỏĐịnh dạng.
Để rõ ràng (và những người chưa xem), con trỏ trong Office 2013 có hình động quét khi di chuyển giữa các ký tự (kể cả khi bạn nhập hoặc nếu bạn bấm quanh bảng tính Excel). –
Nếu tôi không sai, nhưng có lẽ quyết định này sẽ không dễ dàng. 'Animation' trong' TextBox' là các nhà phát triển hạn chế vì tính năng hiển thị 'WPF'. Ví dụ: thuộc tính văn bản không phải là thuộc tính phụ thuộc, do đó hoạt ảnh mà anh không thể tham gia. Mặt khác, trong 'MS Office' làm việc đó và hy vọng được thực hiện bình thường. Vì vậy, có hy vọng cho một giải pháp ... nhưng về những gì? –
Cá nhân tôi thực sự ghét tất cả các hoạt ảnh này trong Office 2013 rất nhiều. AAAAARGH! –