2009-02-23 13 views
19

मेरे पास WPF में एक टेक्स्ट बॉक्स है जो एक सूची बॉक्स के लिए डेटामैप्लेट का हिस्सा है। उस टेक्स्ट बॉक्स में मैं हटा सकता हूं, बैकस्पेस, स्पेसबार, लेकिन मैं नए शब्दों, अक्षरों या संख्याओं में टाइप नहीं कर सकता। हालांकि मैं नोटपैड से पेस्ट कर सकता हूं।मेरा डब्ल्यूपीएफ टेक्स्टबॉक्स "kinda" क्यों पढ़ा गया है?

मुझे यहां क्या याद आ रही है?

<ListBox Grid.Column="1" 
     ItemsSource="{Binding Details}" 
     VirtualizingStackPanel.VirtualizationMode="Recycling" 
     HorizontalContentAlignment="Stretch" > 
      <ListBox.Resources> 
       <DataTemplate DataType="{x:Type Entities:RADetailEntry}"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
         </Grid.ColumnDefinitions> 

         <ComboBox Grid.Column="0" /> 
         <TextBox Grid.Column="1" IsReadOnly="False" IsEnabled="True" 
           Text="{Binding Path=Description, Mode=TwoWay}" TextWrapping="Wrap" 
           HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Left" /> 
        </Grid> 
       </DataTemplate> 
      </ListBox.Resources> 
     </ListBox> 

उत्तर

39

मुझे इस तरह की समस्या का सामना करना पड़ रहा था। एक छोटे से अनुसंधान करने के बाद, मैं MSDN में सूचीबद्ध एक ऐसी ही समस्या दिखाई दी:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c68d5f3c-c8cc-427d-82e3-6135d075a304/

पोस्ट करने के लिए जवाब के अनुसार, समस्या WPF और WinForms पाठ इनपुट से निपटने में दो बहुत अलग तरीके से होने के साथ क्या करना है । सौभाग्य से, ऊपर सूचीबद्ध पोस्ट निम्नलिखित समाधान देता है:

विंडो लॉन्च करते समय, ElementHost.EnableModelessKeyboardInterop (window1) का उपयोग करें। ध्यान दें कि यह एक स्थिर विधि है - आपको ElementHost क्लास को तुरंत चालू करने की आवश्यकता नहीं है।

उदाहरण के लिए,

Window window1 = new Window(); 
ElementHost.EnableModelessKeyboardInterop(window1); 
window1.Show(); 

यह मेरे लिए समस्या हल हो। उम्मीद है की यह मदद करेगा।

+0

ठीक है, मुझे आपके उत्तर से बेहतर जवाब पसंद है। – Russ

+0

उत्कृष्ट जवाब। मुझे एहसास है कि आप सभी सक्रिय नहीं लग रहे हैं, लेकिन मैंने एक बार इनाम शुरू कर दिया है कि मैं सक्षम होने के बाद आपको पुरस्कार दूंगा। –

+7

बस एक और गॉचा का उल्लेख करने के लिए चिंतन करना जो तब हो सकता है जब आपके पास WinForms/MFC कॉलिंग WPF हो और 'ElementHost.EnableModelessKeyboardInterop (wpfwindow) 'का उपयोग कर हो। यदि डब्ल्यूपीएफ विंडो 'विंडो। शो()' का उपयोग करके एक और विंडो खोलती है तो टेक्स्ट बॉक्स समस्या भी वहां होगी - प्रत्येक व्यक्तिगत विंडो को मॉडेलस इंटरऑप सक्षम होना चाहिए। ध्यान दें कि 'Window.ShowDialog() 'समस्या का कारण नहीं है। – Aranda

0

मैं एक साधारण परीक्षण एप्लिकेशन बनाया है, और मैं ListBox में बक्सें में नया टेक्स्ट टाइप कर सकते हैं:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:app="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300"> 
    <ListBox ItemsSource="{Binding Details}" 
     HorizontalAlignment="Stretch" 
     VirtualizingStackPanel.VirtualizationMode="Recycling"> 
     <ListBox.Resources> 
      <DataTemplate DataType="{x:Type app:Data}"> 
       <StackPanel Orientation="Horizontal"> 
        <ComboBox /> 
        <TextBox SpellCheck.IsEnabled="True" TextWrapping="Wrap" 
         HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
         Text="{Binding Path=Text, Mode=TwoWay}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.Resources> 
    </ListBox> 
</Window> 

फर्क सिर्फ इतना है कि मैं दोनों के बीच देख सकते हैं एक ItemTemplate सेट कर दिया जाता है कि है आपके लिस्टबॉक्स पर, और मेरा कोई नहीं है। rADetailEntryLayout के लिए एक्सएएमएल क्या है?

+0

शायद मैं एक WPF noob के बहुत ज्यादा कर रहा हूँ, लेकिन मैं आपके सवाल का पालन नहीं करते। एक्सएएमएल डाटामैप्लेट में सही है, या क्या मुझे सवाल याद आ रहा है? – Russ

+0

मैंने नामकरण के बजाय डेटाटाइप = "{x: टाइप एंटिटीज: RADetailEntry}" का उपयोग करने के लिए बदलने की कोशिश की, और यह अभी भी सही तरीके से काम नहीं करता है। – Russ

+0

आपने अपने डेटा प्रकार के लिए एक आइटम टेम्पलेट और डेटा टेम्पलेट दोनों निर्दिष्ट किए हैं। ItemTemplate स्वचालित रूप से ListBox में सभी आइटमों के लिए उपयोग किया जाएगा। मान लें कि सभी आइटम RADetailEntity प्रकार हैं, आपको दोनों की आवश्यकता नहीं है - एक या दूसरे को करना चाहिए। – Andy

0

जाहिर है एक एक्स के साथ एक ScrollViewer तत्व जोड़ने के लिए की जरूरत है: सीमा तत्व को नाम = "PART_ContentHost", पर टिप्पणी देखें: पहले http://msdn.microsoft.com/en-us/library/ms752068.aspx

0

पहली बात, क्या आपने देखा नहीं ItemTemplate पर सेट है कि वहाँ अपने मद? दूसरा, आपने संसाधन के अंदर डेटा टेम्पलेट क्यों घोषित किया है? क्या आप आइटम टेम्पलेट पर कई प्रकार का उपयोग करने के इच्छुक हैं? यदि ऐसा है तो आपको DataTemplateSelector की आवश्यकता होगी, जो निर्दिष्ट प्रकार के लिए एक विशिष्ट डेटा टेम्पलेट वापस कर देगा, अन्यथा यदि आपको केवल इस विशिष्ट आइटम पर टेम्पलेट जोड़ने की आवश्यकता है, तो ListBox.ItemTemplate के साथ ListBox.Resources को प्रतिस्थापित करें और डेटा से कुंजी हटाएं टेम्पलेट, इसे संकलित करें और वहां जाएं।

यहाँ

यह कैसे ठीक से काम करने होना चाहिए:

<ListBox Grid.Column="1" ItemsSource="{Binding Path=Details}" VirtualizingStackPanel.VirtualizationMode="Recycling" HorizontalContentAlignment="Stretch" > 
     <!-- Remove this <ListBox.Resources> --> 
     <!-- Add this --> 
     <ListBox.ItemTemplate> 
      <!-- Remove this <DataTemplate DataType="{x:Type Entities:RADetailEntry}"> --> 
      <!-- Add this --> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <ComboBox Grid.Column="0" /> 
        <TextBox Grid.Column="1" IsReadOnly="False" IsEnabled="True" 
         Text="{Binding Path=Description, Mode=TwoWay}" TextWrapping="Wrap" 
         HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Left" 
         /> 
       </Grid> 
      </DataTemplate> 
     <!-- Remove this </ListBox.Resources> --> 
     <!-- Add this --> 
     </ListBox.ItemTemplate> 
    </ListBox> 

होप्स यह अभी भी प्रश्न पोस्ट किया गया है से लंबे समय से उपयोगी है ...

0

मैं भी यही व्यवहार का पता चला है, लेकिन जब wpf मिश्रण और फॉर्म जीतते हैं।

मैंने एक कस्टम कॉम्बो बॉक्स बनाया जिसने अपने स्वयं के/छोटे परीक्षण प्रोजेक्ट में ठीक काम किया लेकिन जब एप्लिकेशन में रखा गया तो इसे कीबोर्ड पर ध्यान केंद्रित करने पर ठीक से ध्यान नहीं दिया गया था।

क्लिक को निकाल दिया जा रहा था लेकिन फिर तुरंत टेक्स्टबॉक्स खो गया। फिर आप चीजों को पेस्ट कर सकते हैं लेकिन सामान्य रूप से टाइप नहीं कर सकते।

यह निकला (अच्छा एक स्नूप (http://snoopwpf.codeplex.com/)) कि स्क्रोलव्यूअर जो कॉम्बो बॉक्स का भार था, कीबोर्ड फोकस चुरा रहा था।

घटना की छाप लगाई जा संभाला हो रहा बंद कर दिया और यह काम अपेक्षा के अनुरूप बनाया:

private void ClickOnStack(object sender, MouseButtonEventArgs e) 
    { 
     //do other stuff with click 
     _textBox.Focus(); 

     //note this is key to stop things like scrollviewers nicking focus 
     e.Handled = true; 
    } 
संबंधित मुद्दे