2010-02-24 2 views
11

जब उपयोगकर्ता इस टेक्स्टबॉक्स में टैब दबाता है, तो कर्सर 8 रिक्त स्थान के बराबर कूदता है।मैं कैसे परिभाषित कर सकता हूं कि एक एक्सएएमएल टेक्स्टबॉक्स में टैब कितनी रिक्त स्थान कूदता है?

मैं इसे कैसे बदल सकता हूं ताकि यह केवल 4 या 2 कूद सके?

<TextBox 
    Width="200" 
    Height="200" 
    Margin="0 0 10 0" 
    AcceptsReturn="True" 
    AcceptsTab="True" 
    Text="{Binding OutlineText}"/> 
+0

एडवर्ड, यदि मैं रिक्त स्थान वाले टैब को बदलने के साथ समाधान का सुझाव देता हूं, तो यह आपके लिए काम करेगा? – Anvaka

+0

मैंने इसे XAML में कभी नहीं देखा है। केवल वास्तविक संपादकों में। –

उत्तर

0

मैं तुम्हें Typography property of the TextBox पर एक नज़र डालें सुझाव देते हैं। भले ही मैं वहां टैब आकार के बारे में कुछ भी नहीं ढूंढ पा रहा था, यह वह संपत्ति है जो टेक्स्टबॉक्स द्वारा टेक्स्ट को प्रदान करने के तरीके को प्रभावित करती है, इसलिए यह वही चीज हो सकती है जिसे आप ढूंढ रहे हैं।

0

नियंत्रण का प्रयास करें जो आपको टैब आकार सेट करने की अनुमति देता है। शायद http://wpfsyntax.codeplex.com/ क्या करेंगे?

+4

यह नियंत्रण बस रिक्त स्थान से टैब को प्रतिस्थापित करता है। –

2

आप इच्छित देने के लिए अपने स्वयं के पाठ बॉक्स नियंत्रण बना सकते हैं प्रभावित करते हैं: http://social.msdn.microsoft.com/Forums/en/wpf/thread/0d267009-5480-4314-8929-d4f8d8687cfd

: निम्नलिखित मूल जवाब देखें

<cc:MyTextBox AcceptsReturn="True" TabSize="10" x:Name="textBox"/> 

:

public class MyTextBox : TextBox 
{ 
    public MyTextBox() 
    { 
     //Defaults to 4 
     TabSize = 4; 
    } 

    public int TabSize 
    { 
     get; 
     set; 
    } 

    protected override void OnPreviewKeyDown(KeyEventArgs e) 
    { 
     if (e.Key == Key.Tab) 
     { 
      String tab = new String(' ', TabSize); 
      int caretPosition = base.CaretIndex; 
      base.Text = base.Text.Insert(caretPosition, tab); 
      base.CaretIndex = caretPosition + TabSize + 1; 
      e.Handled = true; 
     } 
    } 
} 

तो फिर तुम सिर्फ अपने XAML में निम्न का उपयोग

+0

त्वरित टिप्पणियां: मुझे लगता है कि आप 'base.CaretIndex =' पर '+ 1' को हटाना चाहते हैं, मैं शायद' स्ट्रिंग टैब ... 'लाइन खींचूंगा और इसे' टैबसाइज 'सेटर में डाल दूंगा ताकि आप' निष्पादन में DRY-er फिर से करें, और ** सबसे महत्वपूर्ण बात यह है कि यदि आप ** 'base.SelectedText = string.Empty;" को अपने 'if' खंड के बाद पहली पंक्ति के लिए नहीं जोड़ते हैं, ** अजीब चीजें तब होती हैं जब कोई कहें, शब्द को हाइलाइट करता है और हिट टैब **, शब्द गायब होने की उम्मीद करता है और टैब "चरित्र" द्वारा प्रतिस्थापित किया जाता है। अन्यथा बहुत अच्छा! – ruffin

0

जेसन द्वारा प्रदान किए गए समाधान के साथ एक समस्या यह है कि टेक्स्ट को संशोधित करने से पूर्ववत स्टैक मिटा दिया जाएगा। पेस्ट विधि का उपयोग करने का एक वैकल्पिक समाधान है। ऐसा करने के लिए आपको पहले अपनी टैब स्ट्रिंग को क्लिपबोर्ड पर कॉपी करने की आवश्यकता है।

public class MyTextBox : TextBox 
{ 
    public MyTextBox() 
    { 
     //Defaults to 4 
     TabSize = 4; 
    } 

    public int TabSize { get; set; } 

    protected override void OnPreviewKeyDown(KeyEventArgs e) 
    { 
     if (e.Key == Key.Tab) 
     { 
      var data = Clipboard.GetDataObject(); 
      var tab = new String(' ', TabSize); 
      Clipboard.SetData(DataFormats.Text, tab); 
      Paste(); 
      //put the original clipboard data back 
      if (data != null) 
      { 
       Clipboard.SetDataObject(data); 
      } 
      e.Handled = true; 
     } 
    } 
} 
+0

मुझे पूर्ववत के साथ कोई परेशानी नहीं दिखाई दे रही है - क्या आप समझ सकते हैं कि आपका क्या मतलब है? जेसन के विचार का उपयोग करके, मैं "टैब" सम्मिलन से परे ctrl-z करने में सक्षम हूं। – ruffin

0

हाँ, यह संभव है ....

TextBlock.Text = "एबीसी" + String.Format ("{0}", "\ t") + "XYZ";

यह वही करेगा जो हमें चाहिए !!

+0

संपादन की आवश्यकता है – GAMITG

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