2013-07-04 27 views
16

मैं सोच रहा था, अगर मैं टेक्स्टबॉक्स या किसी भी नियंत्रण को बना सकता हूं जिसे आप वर्ड 2013 की तरह होने के लिए कुछ पाठ लिख सकते हैं, तो एनीमेशन अनुभव बहुत अच्छा है।शब्द लेखन एनीमेशन जैसे word2013

अब मैं नियंत्रण पर स्वयं एनीमेशन प्रकार (टेक्स्टबॉक्स, ...) करने में सक्षम हूं, लेकिन इस प्रकार की एनीमेशन कर्सर या टेक्स्ट पर ही करने के लिए यह नया है।

enter image description here
enter image description here

+7

स्पष्टता (और जो लोग नहीं देखे गए हैं) के लिए, Office 2013 में कर्सर में एक स्वीप एनीमेशन है क्योंकि यह वर्णों के बीच चलता है (जब आप टाइप करते हैं, या यदि आप Excel स्प्रेडशीट के आसपास क्लिक करते हैं)। –

+3

यदि मैं गलत नहीं हूं, लेकिन शायद यह निर्णय आसान नहीं होगा। 'टेक्स्टबॉक्स' में 'एनीमेशन' फीचर 'डब्ल्यूपीएफ' प्रतिपादन के कारण सीमित डेवलपर्स है। उदाहरण के लिए, टेक्स्ट प्रॉपर्टी एक निर्भरता संपत्ति नहीं है, इसलिए एनीमेशन जिसमें वह शामिल नहीं हो सकता है। दूसरी तरफ, 'एमएस ऑफिस' में यह काम कर रहा है और आशा सामान्य रूप से लागू की जाती है। तो समाधान के लिए आशा है ... लेकिन क्या? –

+0

व्यक्तिगत रूप से, मैं वास्तव में कार्यालय 2013 में इन सभी एनिमेशन से बहुत नफरत करता हूं। AAAAARGH! –

उत्तर

4

आप एक 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 आलेख देखें।

एनीमेशन की गति को बदलने के लिए बस कर्सर एनीमेशन की अवधि बदलें।

-1

नहीं अशिष्ट होना करने के लिए, लेकिन अपने अंग्रेज़ी पूरी तरह से समझने के लिए थोड़ा मुश्किल है, इसलिए मुझे आशा है कि यह तुम क्या चाहते थे के करीब है?

मेरी सिफारिश टेक्स्टबॉक्स को प्राप्त करने वाले नए नियंत्रण को बनाकर "टेक्स्टबॉक्स" का नया नियंत्रण बनाना होगा। फिर आप ऑन पेंट इवेंट को ओवरराइड करते हैं ताकि आप अब नियंत्रित कर सकें कि टेक्स्टबॉक्स स्वयं कैसे आकर्षित करता है।

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

यह अब आपको नियंत्रित करता है कि आपका नियंत्रण स्वयं कैसे आकर्षित होता है और आप टेक्स्टबॉक्स के बजाय उसी व्यवहार के बजाय इसका उपयोग कर सकते हैं।

मुश्किल बिट जो मैं आपको करने के लिए छोड़ दूंगा, या एक नया सवाल खोलने के लिए, चीजों का ग्राफिक्स पक्ष है, इसलिए जब उपयोगकर्ता कर्सर को ले जाता है, तो यह आसानी से उस रेखा को चलाता है जिसे आप व्यक्तिगत रूप से चित्रित कर रहे हैं, इस प्रकार पूर्ण नियंत्रण है।

यदि आपको यह मुश्किल लगता है, तो पहले ई.ग्राफिक्स ऑब्जेक्ट और उसके कार्यों में देखें।

+3

'" मुश्किल बिट जो मैं आपको करने के लिए छोड़ दूंगा, या एक नया सवाल खोलने के लिए, चीजों का ग्राफिक्स पक्ष है, इसलिए जब उपयोगकर्ता कर्सर को ले जाता है, तो यह आसानी से उस रेखा को चलाता है जिसे आप व्यक्तिगत रूप से चित्रित कर रहे हैं " - मुझे लगता है कि ओपी के बारे में क्या पूछ रहा है। – keyboardP

+0

@keyboardP डब्ल्यूटीएफ, मैंने उन संभावित दिशाओं में से एक दिया जो वह जा सकते थे, और मैंने कहा "कोशिश करें", या एक नया प्रश्न खोलें, क्योंकि यह एक अलग विषय है? मैंने सोचा कि उसकी समस्या इसका चित्र था? अधिक से अधिक सहायता के लिए अनुरोध करने से पहले उपयोगकर्ताओं को एक विकल्प का प्रयास करना चाहिए? – Tom

+1

मैंने आपको कम नहीं किया है लेकिन आपने ओपी के लिए पर्याप्त दिशा नहीं दी है और न ही वे एक नया प्रश्न खोलना चाहिए क्योंकि उनका प्रश्न ठीक है। आपने समझाया नहीं है कि 'ऑनपेंट' विधि कर्सर को फिर से कैसे हटा सकती है जो प्रश्न का मुख्य हिस्सा है। ऑनपेंट विधि को ओवरराइड करना सवाल का उत्तर नहीं है क्योंकि आप ऑनपेंट विधि के भीतर क्या जाना चाहिए इसका मुख्य हिस्सा खो रहे हैं। – keyboardP

संबंधित मुद्दे