क्या कोई वैकल्पिक नियंत्रण है जो WinForms SplitContainer को प्रतिस्थापित करने का सुझाव दे सकता है? मुझे यह पसंद नहीं है कि स्प्लिटकॉन्टेनर कैसे दिखाता है कि अजीब, बिंदीदार पट्टी जब यह चयनित होती है और जब इसे खींचा जा रहा है। मैं पैनलों को दोबारा आकार देना चाहता हूं क्योंकि उपयोगकर्ता माउस के बजाए ड्रैग करता है और स्प्लिटर ड्रैग होने पर किसी भी बिंदीदार स्ट्रिप्स को नहीं दिखाता है। मूल रूप से विस्टा पर विंडोज एक्सप्लोरर में पैनलों का पुन: आकार कैसे किया जाता है।WinForms: SplitContainer के लिए वैकल्पिक?
उत्तर
अपने स्वयं के विभाजन कंटेनर UserControl लिखें:
इस बिंदीदार बात मैं के बारे में बात कर रहा हूँ है। आप मूल रूप से केवल दो पैनलों को नियंत्रण (बाएं और दाएं पैनलों के लिए) पर छोड़ दें और फिर उनके बीच की जगह को स्प्लिटर दें। UserControl पर एक छोटा माउसडाउन, माउसमोव और माउसअप लॉजिक आपको आसानी से "स्प्लिटर" को बाएं और दाएं स्थानांतरित करने देगा, और दो पैनल इसे हर जगह ठीक से ब्लॉक करेंगे लेकिन स्प्लिटर पर, इसलिए यह जांचने के लिए कि आपका माउस अगर माउस पर है splitter के रूप में सरल हो सकता है।
यह डिज़ाइन मोड में कार्य करने के तरीके को नियंत्रित करने के लिए नियंत्रण प्राप्त करने के लिए थोड़ा अतिरिक्त काम हो सकता है।
आप स्प्लिटकॉन्टेनर के साथ बिल्कुल टिंकर नहीं कर सकते हैं। एक संभावना पूरी तरह खत्म करने के लिए है अगर आप इसे केवल नियंत्रण का आकार बदलने के लिए उपयोग कर रहे हैं। आप इसके बजाय नियंत्रण पर माउस घटनाओं का उपयोग कर सकते हैं। एक फार्म पर एक TreeView ड्रॉप और बाईं ओर इसे डॉक। MouseDown की सदस्यता लें/ले जाएँ/ऊपर घटनाओं और कुछ इस तरह लिखना:
bool mDragging;
private bool onTreeEdge(Point pos) {
return pos.X >= treeView1.DisplayRectangle.Right - 3;
}
private void treeView1_MouseMove(object sender, MouseEventArgs e) {
treeView1.Cursor = mDragging || onTreeEdge(e.Location) ? Cursors.VSplit : Cursors.Default;
if (mDragging) treeView1.Width = e.X;
}
private void treeView1_MouseDown(object sender, MouseEventArgs e) {
mDragging = onTreeEdge(e.Location);
if (mDragging) treeView1.Capture = true;
}
private void treeView1_MouseUp(object sender, MouseEventArgs e) {
mDragging = false;
}
के बाद मैं अपने प्रश्न देखा मैं इस पाया, इसलिए सोचा कि मैं हिस्सा होगा: SplitContainer FAQ
वहाँ पर दूसरी कड़ी वास्तव में बताता है आपको क्या करने की आवश्यकता है।
लिंक से मरने के मामले में यह टेक्स्ट यहां दिया गया है।
//1. Use the custom control defined in the SplitContainerNoFocus sample
//2. Insert the following code in your project, and attach these events to all of the SplitContainers that you don't want stealing focus.
// Temp variable to store a previously focused control
private Control focused = null;
private void splitContainer_MouseDown(object sender, MouseEventArgs e)
{
// Get the focused control before the splitter is focused
focused = getFocused(this.Controls);
}
private Control getFocused(Control.ControlCollection controls)
{
foreach (Control c in controls)
{
if (c.Focused)
{
// Return the focused control
return c;
}
else if (c.ContainsFocus)
{
// If the focus is contained inside a control's children
// return the child
return getFocused(c.Controls);
}
}
// No control on the form has focus
return null;
}
private void splitContainer_MouseUp(object sender, MouseEventArgs e)
{
// If a previous control had focus
if (focused != null)
{
// Return focus and clear the temp variable for
// garbage collection
focused.Focus();
focused = null;
}
}
लिंक का मृत, [यहां ज़ोंबी संस्करण है] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx)। –
मैं एक ही जरूरत है और निम्नलिखित गुण सेट:
splitContainer1.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
splitContainer1.Dock = DockStyle.Fill;
splitContainer1.IsSplitterFixed = true;
आशा इस मदद करता है।
इसके अलावा, नियंत्रण पर MouseMove घटना के साथ, विभाजन कंटेनर घटक है कि मुक्त Krypton toolkit
लिंक मर चुका है। – Krythic
खैर मैं इस एक कोशिश दे रहा हूँ हालांकि, के साथ आता है पर एक नज़र डालें, घटना माउस अगर फायरिंग बंद हो जाएगा बहुत तेजी से स्थानांतरित हो गया है और यह पैनलों में से एक पर चला जाता है। क्या माउस को घटनाओं को नियंत्रण में बुलबुला करने का कोई तरीका है या नियंत्रण में सभी माउस चाल घटनाओं को पकड़ने का कोई तरीका है? – Telanor
कभी नहीं, मैंने बस उसी नियंत्रण में सभी नियंत्रणों की MouseMove घटनाओं को झुकाया। यह अच्छी तरह से काम किया – Telanor
मुझे विस्तार से बताया जाना चाहिए कि माउस घटनाओं को संभालने के अलावा, आप एक बूल या कुछ भी स्टोर करना चाहते हैं कि माउस बटन वर्तमान में नीचे है या नहीं (जैसा कि हंस के उत्तर में है)। यदि आप नियंत्रण पर माउस बटन पर क्लिक करके रखें, तो वह उस नियंत्रण पर एक माउसडाउन ईवेंट उत्पन्न करेगा। यदि आप माउस बटन को नीचे रखते हैं और बाएं या दाएं (या उस मामले के लिए ऊपर या नीचे) खींचते हैं, तो माउसमोव घटनाएं आपके द्वारा क्लिक किए गए नियंत्रण से उत्पन्न की जाएंगी, भले ही माउस कर्सर मूल नियंत्रण से बाहर हो और किसी अन्य पर हो या मूल रूप – MusiGenesis