2010-05-22 20 views
54

मैं अपने WPF टेक्स्टबॉक्स में स्ट्रिंग मान के अंत पर कैरेट/कर्सर स्थिति सेट करने का प्रयास करता हूं, जब मैं पहली बार अपनी विंडो खोलता हूं । जब मेरी खिड़की खुलती है तो मैं अपने टेक्स्टबॉक्स पर फोकस सेट करने के लिए फोकसमेनगर का उपयोग करता हूं।स्ट्रिंग मान के अंत में कैरेट/कर्सर स्थिति सेट करें WPF टेक्स्टबॉक्स

कुछ भी काम नहीं करता है। कोई विचार?

नोट, मैं एमवीवीएम पैटर्न का उपयोग कर रहा हूं, और मैंने अपने कोड से एक्सएएमएल का केवल एक हिस्सा शामिल किया है।

<Window 
    FocusManager.FocusedElement="{Binding ElementName=NumberOfDigits}" 
    Height="400" Width="800"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <TextBox Grid.Column="0" Grid.Row="0" 
       x:Name="NumberOfDigits" 
       IsReadOnly="{Binding Path=IsRunning, Mode=TwoWay}" 
       VerticalContentAlignment="Center" 
       Text="{Binding Path=Digits, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
     <Button Grid.Column="0" Grid.Row="1" 
       Margin="10,0,10,0" 
       IsDefault="True" 
       Content="Start" 
       Command="{Binding StartCommand}"/> 
    </Grid> 
</Window> 

उत्तर

76

आप एक TextBox की CaretIndex संपत्ति का उपयोग कर कैरट स्थिति सेट कर सकते। कृपया ध्यान रखें कि यह DependencyProperty नहीं है। फिर भी, आप अभी भी यह XAML में इस तरह सेट कर सकते हैं:

<TextBox Text="123" CaretIndex="{x:Static System:Int32.MaxValue}" /> 

Text संपत्ति के बाद CaretIndexस्थापित करने के लिए कृपया याद रखें वरना यह काम नहीं करेगा। इस प्रकार यदि आप अपने उदाहरण में Text से जुड़ते हैं तो यह शायद काम नहीं करेगा। उस स्थिति में, बस इस तरह कोड-पीछे का उपयोग करें।

NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length; 
+2

हां, मैंने कैरेट इंडेक्स से जुड़ने की कोशिश की और यह असफल रहा। विंडो लोडेड इवेंट में कोड-बैक में अपना कोड जोड़ना बहुत अच्छा काम करता है। धन्यवाद। – Zamboni

16

आप एक व्यवहार भी बना सकते हैं, जो अभी भी कोड-बैक होने पर, पुन: प्रयोज्य होने का लाभ है। एक सरल व्यवहार वर्ग के

उदाहरण के लिए, पाठ बॉक्स का ध्यान केंद्रित घटना का उपयोग कर:

class PutCursorAtEndTextBoxBehavior: Behavior<UIElement> 
{ 
    private TextBox _textBox; 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     _textBox = AssociatedObject as TextBox; 

     if (_textBox == null) 
     { 
      return; 
     } 
     _textBox.GotFocus += TextBoxGotFocus; 
    } 

    protected override void OnDetaching() 
    { 
     if (_textBox == null) 
     { 
      return; 
     } 
     _textBox.GotFocus -= TextBoxGotFocus; 

     base.OnDetaching(); 
    } 

    private void TextBoxGotFocus(object sender, RoutedEventArgs routedEventArgs) 
    { 
     _textBox.CaretIndex = _textBox.Text.Length; 
    } 
}  

फिर, अपने XAML में, तुम इतनी तरह व्यवहार देते हैं:

<TextBox x:Name="MyTextBox" Text="{Binding Value}"> 
     <i:Interaction.Behaviors> 
      <behaviors:PutCursorAtEndTextBoxBehavior/> 
     </i:Interaction.Behaviors> 
    </TextBox> 
+1

यह सबसे अच्छा समाधान है। कर्सर को मैन्युअल रूप से सेट करना गधे में दर्द है। – Darkhydro

2

यदि आपके पाठ बॉक्स (

textbox1.Select(textbox1.Text.Length-1, 1); 
textbox1.ScrollToCaret(); 

नोट:: WPF .ScrollToC में WinForms) एक ऊर्ध्वाधर स्क्रॉलबार साथ बहु आप इस कोशिश कर सकते हैं है aret() टेक्स्टबॉक्स का सदस्य नहीं है।

1

मल्टीलाइन TextBox सेटिंग कर्सर के मामले में पर्याप्त नहीं है। इसे आज़माएं:

NumberOfDigits.ScrollToEnd(); 
+0

कोड केवल उत्तर अच्छे जवाब नहीं हैं, यह समझाने के लिए कुछ पंक्तियां जोड़ें कि समस्या क्या थी और आपके कोड ने इसे क्यों ठीक किया – MikeT

2

यह मेरे लिए काम करता है। मैं एमवीवीएम पैटर्न का भी उपयोग कर रहा हूं। हालांकि, एमएमवीएम का उपयोग करने का मेरा उद्देश्य इकाई परीक्षण को संभव बनाना और अपने यूआई को अपडेट करना आसान बनाना है (ढीला युग्मित)। मैं खुद को कर्सर की स्थिति का परीक्षण करने वाला यूनिट नहीं देखता, इसलिए मुझे इस सरल कार्य के लिए कोड का सहारा लेने पर कोई फर्क नहीं पड़ता।

public ExpeditingLogView() 
    { 
     InitializeComponent(); 

     this.Loaded += (sender, args) => 
     {         
      Description.CaretIndex = Description.Text.Length; 
      Description.ScrollToEnd(); 
      Description.Focus(); 
     }; 
    }