2009-07-27 5 views
13

मेरे पास यह टेक्स्टबॉक्स है। इस टेक्स्ट बॉक्स DataTemplate में स्थित है:wpf: IsReadOnly = true के साथ टेक्स्टबॉक्स में टेक्स्ट का चयन करना?

<DataTemplate x:Key="myTemplate"> 
    <TextBox Text="{Binding Path=FullValue, Mode=TwoWay}" IsEnabled="False" /> 
     ... 

और मैं (वैकल्पिक पाठ बॉक्स पर क्लिक करके) उपयोगकर्ता इसके अंदर पूरे पाठ का चयन करने के लिए अनुमति देना चाहते हैं। और मैं पीछे कोड का उपयोग नहीं करना चाहता हूं।

यह कैसे करें? अग्रिम में धन्यवाद।

+0

मैंने 'selectAll()' का उपयोग किया और फिर यह आपको सामग्री को दायाँ क्लिक करने और कॉपी करने में सक्षम बनाता है। – EricG

उत्तर

18

IsEnabled के बजाय IsReadOnly प्रॉपर्टी का उपयोग करने से उपयोगकर्ता को टेक्स्ट चुनने की अनुमति मिलती है। इसके अलावा, अगर इसे संपादित नहीं किया जाना चाहिए, तो वनवे बाध्यकारी पर्याप्त होना चाहिए।

एक्सएएमएल का विचार कोड-पीछे पूरी तरह से प्रतिस्थापित नहीं करना है। सबसे महत्वपूर्ण यह है कि आप कोड-बैक में केवल यूआई-विशिष्ट कोड रखने का प्रयास करते हैं, न कि व्यावसायिक तर्क। ऐसा कहा जा रहा है कि, सभी पाठ का चयन यूआई-विशिष्ट है और कोड-पीछे में चोट नहीं पहुंचाता है। इसके लिए myTextBox.SelectAll() का उपयोग करें।

+0

वैसे समस्या यह है कि यह डेटा टेम्पलेट में स्थित है। और मुझे पता है कि घटनाओं का उपयोग डेटा टेम्पलेट्स में नहीं किया जा सकता है। –

+0

और भी, मैं एमवीवीएम का उपयोग करने की कोशिश कर रहा हूं। क्या कोड के पीछे यूआई विशिष्ट कोड होना ठीक है? उदाहरण के लिए, मेरे बटन पर ऑनक्लिक इवेंट हैंडलर नहीं हैं, लेकिन वे सीधे एमवीवीएम में आईसीओएमएंड से बंधे हैं। –

+0

यदि यह केवल यूआई-विशिष्ट है, तो इसे कोड के पीछे रखना ठीक है। एमवीवीएम के साथ, यह शायद ही कभी जरूरी है, लेकिन इसका मतलब यह नहीं है कि आपको इसकी आवश्यकता नहीं होगी। इसके अलावा, डेटामैप्लेट से उत्पन्न नियंत्रण प्राप्त करने के साधन हैं। उदाहरण के लिए, यदि आपके पास कोई आइटम कंट्रोल (लिस्टबॉक्स इत्यादि) है, तो आप listBox.ItemContainerGenerator.ContainerFromItem (listBox.SelectedItem) का उपयोग कर सकते हैं; – Botz3000

6

IsEnabled को हटाने और टेक्स्टबॉक्स को केवल पढ़ने के रूप में सेट करने से आप पाठ का चयन करने की अनुमति देंगे लेकिन उपयोगकर्ता इनपुट को रोक देंगे।

IsReadOnly="True" 

इस दृष्टिकोण के साथ ही मुद्दा यह है कि हालांकि तो टेक्स्ट बॉक्स यह अभी भी दिखेगा 'सक्षम' में टाइप करने में सक्षम नहीं होगा है।

उस दौर को पाने के लिए (यदि आप चाहते हैं?) आप टेक्स्ट को हल्का करने और पृष्ठभूमि को अंधेरा करने के लिए एक शैली जोड़ सकते हैं (इसे अक्षम दिखने के लिए)।

मैंने एक उदाहरण के साथ निम्नलिखित उदाहरण जोड़ा है जो अक्षम और सक्षम दिखने के बीच टेक्स्टबॉक्स को फ्लिक कर देगा।

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
    <Style TargetType="{x:Type TextBox}"> 

     <Style.Triggers> 
      <Trigger Property="IsReadOnly" Value="True"> 
       <Setter Property="Background" Value="LightGray" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="True"> 
       <Setter Property="Foreground" Value="DarkGray" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="False"> 
       <Setter Property="Background" Value="White" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="False"> 
       <Setter Property="Foreground" Value="Black" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <TextBox Height="23" Margin="25,22,133,0" IsReadOnly="True" Text="monkey" Name="textBox1" VerticalAlignment="Top" /> 
    <Button Height="23" Margin="25,51,133,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">Button</Button> 
</Grid> 

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     textBox1.IsReadOnly = !textBox1.IsReadOnly; 
    } 
4

एक टिप्पणी मैं बस की खोज की (जाहिर है यह एक पुराने सवाल है, लेकिन यह कोई मदद कर सकता है):

IsHitTestVisible=False तो का चयन (और इसलिए कॉपी) भी अक्षम है।

0

थोड़ा उदाहरण संशोधित - WinForms की शैली से मेल खाने के लिए (अपनी खुद की नई शैली का आविष्कार नहीं)

By adding <Window.Resources> after <Window> and before <Grid> will make your text box behave like normal winforms textbox. 


<Window x:Class="..." Height="330" Width="600" Loaded="Window_Loaded" WindowStartupLocation="CenterOwner"> 

<Window.Resources> 
    <Style TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
      <Trigger Property="IsReadOnly" Value="True"> 
       <Setter Property="Background" Value="LightGray" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="False"> 
       <Setter Property="Background" Value="White" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

<Grid> 

और निश्चित रूप से अपने पाठ बॉक्स IsReadOnly = "यह सच है" विशेषता निर्धारित होनी चाहिए।

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