आप एक WPF UserControl या कस्टम नियंत्रण बना सकते हैं जो डिफ़ॉल्ट WPF टेक्स्टबॉक्स से प्राप्त होता है। मैं एक टेक्स्टबॉक्स बनाने में सक्षम था जो कर्सर स्थिति को निम्न विधि से एनिमेट करता है:
1- उपयोगकर्ता नियंत्रण बनाएं और इसमें एक टेक्स्टबॉक्स जोड़ें।
2- इसके अंदर एक आयत के साथ एक कैनवास जोड़ें (आयताकार आपका नया कर्सर है)।
3-टेक्सबॉक्स को कैरबब्रश को पारदर्शी पर सेट करें।
4- उपयोगकर्ता नियंत्रण में कोड-पीछे कर्सर स्थिति बदलते समय कर्सर को एनिमेट करने के लिए एक विधि बनाएं।
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>
कोड-पीछे:
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();
}
}
नोट: यह एक व्यापक समाधान है क्योंकि यह प्रकाश डाला चयनित एनीमेशन संभाल नहीं है नहीं है टेक्स्ट और जब टेक्स्ट हाइलाइट किया जाता है तो कर्सर को छुपा नहीं जाता है, लेकिन यह एक शुरुआत है। मैं इसे टेक्स्टबॉक्स से विरासत में प्राप्त कस्टम नियंत्रण के रूप में बनाने की सलाह देता हूं और फिर UserControl का उपयोग करने के बजाय टेक्स्टबॉक्स की डिफ़ॉल्ट शैली के टेम्पलेट में नियंत्रण का लेआउट करता हूं। इस तरह आप टेक्स्टबॉक्स की सभी कार्यक्षमताओं को संरक्षित कर सकते हैं लेकिन फिर भी नई एनीमेशन सुविधाएं प्राप्त कर सकते हैं। WPF में कस्टम कंट्रोल के बारे में अधिक जानकारी के लिए कोडप्रोजेक्ट पर this आलेख देखें।
एनीमेशन की गति को बदलने के लिए बस कर्सर एनीमेशन की अवधि बदलें।
स्रोत
2013-07-10 01:05:26
स्पष्टता (और जो लोग नहीं देखे गए हैं) के लिए, Office 2013 में कर्सर में एक स्वीप एनीमेशन है क्योंकि यह वर्णों के बीच चलता है (जब आप टाइप करते हैं, या यदि आप Excel स्प्रेडशीट के आसपास क्लिक करते हैं)। –
यदि मैं गलत नहीं हूं, लेकिन शायद यह निर्णय आसान नहीं होगा। 'टेक्स्टबॉक्स' में 'एनीमेशन' फीचर 'डब्ल्यूपीएफ' प्रतिपादन के कारण सीमित डेवलपर्स है। उदाहरण के लिए, टेक्स्ट प्रॉपर्टी एक निर्भरता संपत्ति नहीं है, इसलिए एनीमेशन जिसमें वह शामिल नहीं हो सकता है। दूसरी तरफ, 'एमएस ऑफिस' में यह काम कर रहा है और आशा सामान्य रूप से लागू की जाती है। तो समाधान के लिए आशा है ... लेकिन क्या? –
व्यक्तिगत रूप से, मैं वास्तव में कार्यालय 2013 में इन सभी एनिमेशन से बहुत नफरत करता हूं। AAAAARGH! –