2010-06-09 14 views
6

मुश्किल हिस्सा यह है कि प्रत्येक आइटम में ContextMenu है कि मैं अभी भी खोलना चाहता हूं जब यह दायाँ क्लिक किया जाता है (मैं बस इसे चुनना नहीं चाहता)।जब मैं इसे राइट-क्लिक करता हूं तो मैं सूची बॉक्स को किसी आइटम को चुनने से कैसे रोक सकता हूं?

वास्तव में, अगर यह चीजों को आसान बनाता है, तो मैं स्वचालित चयन बिल्कुल नहीं चाहता, इसलिए यदि कोई तरीका है तो मैं इसे पूरी तरह अक्षम कर सकता हूं जो ठीक होगा।

मैं वास्तव में ItemsControl पर स्विच करने की सोच रहा हूं, जब तक मैं वर्चुअलाइजेशन प्राप्त कर सकता हूं और इसके साथ काम करने के लिए स्क्रॉल कर सकता हूं।

उत्तर

16

यदि आप चयन नहीं करना चाहते हैं तो मैं निश्चित रूप से आइटमकंट्रोल के साथ सूची बॉक्स नहीं जाऊंगा। जब तक वे टेम्पलेट में हों, वर्चुअलाइज़ेशन और स्क्रॉलिंग दोनों को सादा आइटम्स कंट्रोल के साथ उपयोग किया जा सकता है।

दूसरी ओर, यदि आप चयन की जरूरत है लेकिन सिर्फ चयन करने के लिए राइट क्लिक नहीं करना चाहते, सबसे आसान तरीका शायद PreviewRightMouseButtonDown घटना को संभालने के लिए है:

void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

कारण यह काम करता है वह यह है कि ListBoxItem चयन पर होता है लेकिन संदर्भ मेनू खोलने पर माउस पर होता है। इसलिए पूर्वावलोकन चरण के दौरान माउस डाउन इवेंट को खत्म करना आपकी समस्या हल करता है।

हालांकि यदि आप अपने सूची बॉक्स (जैसे किसी आइटम के भीतर नियंत्रण में) के अंदर कहीं और माउस को संभालना चाहते हैं तो यह काम नहीं करता है।

public class ListBoxItemNoRightClickSelect : ListBoxItem 
{ 
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) 
    { 
    } 
} 

आप या तो स्पष्ट रूप से अपने ItemsSource में इन ListBoxItems निर्माण कर सकते हैं या आप भी उपवर्ग ListBox अपने आप आपकी कस्टम आइटम का उपयोग करने के कर सकते हैं::

public class ListBoxNoRightClickSelect : ListBox 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
    return new ListBoxItemNoRightClickSelect(); 
    } 
} 
इस मामले में सबसे आसान तरीका है ListBoxItem उपवर्ग के लिए इसे अनदेखा करने के लिए शायद है

FYI करें, यहाँ कुछ समाधान है कि वर्णन के साथ काम नहीं करेगा कर रहे हैं कारण है कि वे काम नहीं करेगा:

  • तुम बस प्रत्येक ListB पर एक MouseRightButtonDown हैंडलर नहीं जोड़ सकते हैं मैं ItemsControl मार्ग जा रहा समाप्त हो गया, (कार्यान्वित - क्योंकि oxItem पंजीकृत वर्ग हैंडलर से पहले तुम्हारा
  • आप MouseRightButtonDown ListBox पर नहीं संभाल सकता है क्योंकि घटना सीधे व्यक्तिगत रूप से
+0

धन्यवाद प्रत्येक नियंत्रण करने के लिए रूट किया जाता है कहा जाता हो जाएगा यहां http://stackoverflow.com/questions/2783845/wpf-virtualizing-an-itemscontrol) और न केवल यह काम करता है जैसा कि मैं चाहूंगा, प्रदर्शन भी उल्लेखनीय रूप से बढ़ गया है! – devios1

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

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