2011-02-11 18 views
8

लड़कों इनपुट कैसे कर सकता हूं मैं डेटाग्रिडटेक्स्ट कॉलम में बहु-पंक्ति पाठ इनपुट करना चाहता हूं, मैं एक बहु-पंक्ति वर्ण इनपुट करने के लिए "एंटर" का उपयोग कर सकता हूं। लेकिन मैं विजुअल स्टूडियो रिसोर्स मैनेजर की तरह "शिफ़्ट + एंटर" का उपयोग करना चाहता हूं, यहां मेरा कोड "एंटर" कुंजी है।डब्ल्यूपीएफ: डेटाग्रिड मैं मल्टी-लाइन टेक्स्ट

<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*"> 
    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="TextBlock"> 
     <Setter Property="TextWrapping" Value="Wrap" /> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
    <DataGridTextColumn.EditingElementStyle> 
     <Style TargetType="TextBox"> 
     <Setter Property="TextWrapping" Value="Wrap" /> 
     <Setter Property="AcceptsReturn" Value="true" /> 
     </Style> 
    </DataGridTextColumn.EditingElementStyle> 

उत्तर

13

एक तरह से आप यह कर सकते हैं पाठ बॉक्स अपने स्टाइल में एक EventSetter के प्रयोग पर KeyDown घटना से निपटने के द्वारा है। मैंने आपका उदाहरण लिया, शैली में AcceptsReturn Setter को हटा दिया, और एक संपादन डाउनलर को एडिटिंग एलिमेंट स्टाइल में जोड़ा जो कि कैरेट इंडेक्स को दाईं ओर ले जाने के लिए एक नई लाइन जोड़ता है।

यहाँ XAML है:

<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*"> 
    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="TextBlock"> 
      <Setter Property="TextWrapping" Value="Wrap" /> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
    <DataGridTextColumn.EditingElementStyle> 
     <Style TargetType="TextBox"> 
      <Setter Property="TextWrapping" Value="Wrap" /> 
      <EventSetter Event="KeyDown" Handler="OnTextBoxKeyDown"/> 
     </Style> 
    </DataGridTextColumn.EditingElementStyle> 
</DataGridTextColumn> 

मैं एक नया आवेदन परियोजना टेम्पलेट से खिड़की कक्षा में उदाहरण लिखा था, इसलिए यहाँ ईवेंट प्रबंधन कोड के साथ पूरे खिड़की के लिए सी # है। ध्यान दें कि मैंने ईवेंट को कहीं भी बुलबुले से रोकने के लिए सही पर सेट किया है क्योंकि मैं नहीं चाहता कि रिटर्न कुंजी को इस मामले में संपादन पंक्ति में प्रतिबद्धता के रूप में संभाला जा सके। मुझे लगता है कि यह वास्तव में दृष्टिकोण के नीचे की ओर से एक है। किसी घटना की बुलबुले/सुरंग को रोकना कुछ ऐसा है, यदि आपके आवेदन में उपयोगकर्ता इनपुट के साथ जटिल इंटरैक्शन हैं, तो आसानी से तर्क बम में बढ़ सकते हैं। लेकिन अगर आपके पास सिर्फ एक विशेष मामला है तो यह इतना बुरा नहीं है। तो सब कुछ के साथ, इस बढ़ते हुए अपने यूआई के हिस्से के रूप में सावधानी से उपयोग करें। विचार करने के लिए

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new List<Thing> 
     { 
      new Thing { Value = "Some text" }, 
      new Thing { Value = "More text" + Environment.NewLine + " second line" }, 
      new Thing { Value = "Another value" } 
     }; 
    } 

    private void OnTextBoxKeyDown(object sender, KeyEventArgs e) 
    { 
     if (Key.Return == e.Key && 
      0 < (ModifierKeys.Shift & e.KeyboardDevice.Modifiers)) 
     { 
      var tb = (TextBox)sender; 
      var caret = tb.CaretIndex; 
      tb.Text = tb.Text.Insert(caret, Environment.NewLine); 
      tb.CaretIndex = caret + 1; 
      e.Handled = true; 
     } 
    } 
} 

public class Thing 
{ 
    public string Value { get; set; } 
} 

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

+0

हाय, timmyl, धन्यवाद एक आपके उत्तर के लिए बहुत कुछ। और मैंने अपना रास्ता लिया है और टेक्स्टबॉक्स से प्राप्त करने का प्रयास किया है, और मेरी समस्या का समाधान किया है, बहुत बहुत धन्यवाद। – yafeya

+0

विरासत अच्छा है क्योंकि यह आपको टाइप ग्राफ़ में टेक्स्टबॉक्स से ब्रांचिंग की लागत पर इसे साफ़ रूप से समाहित करने देता है। इस पेड़ में एक नया नोड डाले बिना इस घटना को संभालने का एक वैकल्पिक तरीका है जिसे आप जांचना चाहते हैं कि आपको केवल यह जांचना है कि आपको केवल जटिल रूप से जटिल बनाना है, जो व्यवहार को जोड़ने के लिए संलग्न संपत्ति का उपयोग कर रहा है और किसी संपत्ति का उपयोग करने से आपकी संपत्ति के लिए ईवेंट सब्सक्राइब/अन-सबस्क्रिप्ट करने के लिए हैंडलर बदल दिया जाता है। अच्छी बात यह है कि यह तर्क टेक्स्टबॉक्स (अन्य व्युत्पन्न नियंत्रणों की तरह) से अधिक में पुन: प्रयोज्य होगा। शुभकामनाएँ। – timmyl

+0

हां, इस तरह से मुझे टेक्स्टबॉक्स के तर्क को बढ़ाने के लिए कुछ आसान तरीका प्रदान किया जा सकता है, यह बहुत अच्छा है। – yafeya

6

सेट TextWrapping लपेटें और करने के लिए AcceptsReturn = सच ...

<DataGridTextColumn.EditingElementStyle> 
    <Style TargetType="TextBox"> 
    <Setter Property="TextWrapping" Value="Wrap" /> 
    <Setter Property="AcceptsReturn" Value="true" /> 
    </Style> 
</DataGridTextColumn.EditingElementStyle> 
संबंधित मुद्दे