2010-07-22 13 views
6

मेरे पास WPF चेकबॉक्स का एक समूह है जिसमें एक चेक किए गए ईवेंट हैंडलर हैं जो उपयोगकर्ता को उनमें से किसी एक पर क्लिक करते समय कुछ तर्कों को संभालता है। हालांकि, मेरे पास "सभी साफ़ करें" बटन भी है, जब क्लिक किया गया, तो सभी चेकबॉक्स साफ़ हो जाएंगे। यदि उपयोगकर्ता "सभी साफ़ करें" बटन पर क्लिक करता है, तो मैं नहीं चाहता कि चेकबॉक्स उनके चेक किए गए ईवेंट को आग लगाना चाहें। क्या इसे करने का कोई तरीका है?क्या डब्ल्यूपीएफ चेकबॉक्स को अपने चेक किए गए ईवेंट को फायर करने से रोकने का कोई तरीका है?

+0

मेरा मानना ​​है कि आपका मतलब अनचेक घटना सही है? –

+0

सही खेद है, अनचेक घटना। –

उत्तर

4

सभी बटन के ईवेंट हैंडलर साफ़ में की शुरुआत में ईवेंट हैंडलर निकालें और फिर सभी को साफ़ करें बटन के ईवेंट हैंडलर के अंत में ईवेंट हैंडलर पुन: जोड़ें।

XAML

<Window x:Class="UncheckedTest.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"> 
    <Grid> 
     <CheckBox Height="16" Margin="22,30,136,0" Name="checkBox1" VerticalAlignment="Top" 
        Unchecked="checkBox1_Unchecked">CheckBox 1</CheckBox> 
     <CheckBox Height="16" Margin="22,76,136,0" Name="checkBox2" VerticalAlignment="Top" 
        Unchecked="checkBox2_Unchecked">CheckBox 2</CheckBox> 
     <CheckBox Margin="22,0,136,121" Name="checkBox3" Height="16" VerticalAlignment="Bottom" 
        Unchecked="checkBox3_Unchecked">CheckBox 3</CheckBox> 
     <Button HorizontalAlignment="Right" Margin="0,118,37,121" Name="button1" Width="87" 
       Click="button1_Click">Uncheck All</Button> 
     <TextBox Height="74" Margin="22,0,20,13" Name="textBox1" VerticalAlignment="Bottom" 
       TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" /> 
    </Grid> 
</Window> 

कोड के पीछे

using System; 
using System.Windows; 

namespace UncheckedTest 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     private int i = 1; 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     void checkBox3_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 3 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     void checkBox2_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 2 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     void checkBox1_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 1 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      checkBox1.Unchecked -= checkBox1_Unchecked; 
      checkBox2.Unchecked -= checkBox2_Unchecked; 
      checkBox3.Unchecked -= checkBox3_Unchecked; 

      checkBox1.IsChecked = false; 
      checkBox2.IsChecked = false; 
      checkBox3.IsChecked = false; 

      checkBox1.Unchecked += checkBox1_Unchecked; 
      checkBox2.Unchecked += checkBox2_Unchecked; 
      checkBox3.Unchecked += checkBox3_Unchecked; 
     } 
    } 
} 
+2

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

1

घटना को अक्षम करना आदर्श होगा लेकिन मुझे नहीं पता कि यह कैसे किया जाएगा।

हालांकि "सभी साफ़ करें" बटन दबाया गया था या नहीं, तो ट्रैक रखने के लिए बूलियन जोड़ने के लिए उतना ही आसान होगा। फिर केवल अनचेक कोड करें यदि यह बटन के माध्यम से अनचेक नहीं किया गया था।

private bool clearAllClicked = false; 

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    clearAllClicked = true; 
    checkbox.IsChecked = false; 
    clearAllClicked = false; 
} 

private void checkbox_Unchecked(object sender, RoutedEventArgs e) 
{ 
    if (!clearAllClicked) 
    { 
     //do stuff 
    } 
} 
+0

यह एक व्यवहार्य समाधान है, लेकिन यदि संभव हो तो मैं एक और चर बनाने के खिलाफ रोकना चाहता हूं। –

18

आप के बजाय 'की जांच की गई' का 'पर क्लिक करें' घटना का उपयोग कर सकते या 'अचिह्नित:

यहाँ एक गंदा नमूना है ' आयोजन।

'क्लिक' यह सुनिश्चित करेगा कि राज्य परिवर्तन उपयोगकर्ता इनपुट से आएगा (उदाहरण के लिए माउस बटन या स्पेस बार के माध्यम से)।

और cb.IsChecked = value जैसे ऑपरेशन 'क्लिक' ईवेंट को आग नहीं लगाएंगे।

+0

लगभग इसके बारे में भूल गए! यह वास्तव में मेरी समस्या हल हो सकता है, धन्यवाद! – Enrico

+0

बस एक चेतावनी, यदि स्पेस-बार का उपयोग किया जाता है तो यह ट्रिगर नहीं होता है जो चेकबॉक्स इनपुट को टॉगल भी कर सकता है। –

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

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