2011-12-31 4 views
5

VS2010 और साथ सी # और WinForms .NET 4.0 का उपयोग करना:।लंबवत स्क्रॉलबार को कैसे बलपूर्वक WinForms में ऑटोस्क्रॉल से दिखाई दे सकता है?

मैं हमेशा एक कार्यक्षेत्र स्क्रॉलबार एक विकलांग स्क्रॉलबार (जब यह आवश्यक नहीं है के रूप में अपने पैनल के लिए दिखाना चाहते हैं, और एक एक सक्षम जब यह प्रयोग किया जा सकता

तो यह एक संकर AutoScroll की तरह है। मैं VScrollBars का उपयोग कर की कोशिश की है, लेकिन मैं समझ नहीं सकते हैं, जहां उन्हें जगह को यह काम करने के लिए।

अनिवार्य रूप से मैं एक उपयोगकर्ता नियंत्रण है कि एक "दस्तावेज़" के रूप में कार्य मिल गया है नियंत्रणों का, ऑटो-स्क्रॉल का उपयोग करते समय इसका आकार बदलता है, यह पूरी तरह से काम करता है। स्क्रॉलबार तब दिखाई देता है जब उपयोगकर्ता नियंत्रण फिट नहीं होता है और उपयोगकर्ता इसे अद्यतन स्थानांतरित कर सकता है।

यह अनिवार्य रूप से एक वेब ब्राउज़र की तरह है। हालांकि, नियंत्रण को लंबे समय तक ले जाता है (यह पैनल के भीतर ग्रिड में समूहों के भीतर कई फ़ील्ड और बटन इत्यादि के रूप में होता है: पी

तो किसी भी तरह, जब ऑटोस्कोल लंबवत स्क्रॉलबार को सक्षम करता है, तो विंडो को फिर से निकालने में कुछ समय लगता है। मैं हमेशा ऊपर बताए गए लंबवत स्क्रॉलबार को दिखाना चाहता हूं (सक्षम/अक्षम कार्यक्षमता के साथ)

अगर किसी के पास कुछ मदद है, तो मैंने ऑटोस्कोल के विषय पर कई पोस्ट पढ़ी हैं, लेकिन किसी ने मुझसे पूछा नहीं है कि मैं क्या मैं पूछ रहा हूं और मैं समाधान के साथ नहीं आ सकता।

+3

यह हास्यास्पद रूप से करना मुश्किल है। स्क्रॉलबार नियंत्रित करने वाला कोड स्क्रॉल करने योग्य नियंत्रण में निजी विधियां हैं, उन्हें ओवरराइड नहीं कर सकता है। स्क्रॉलिंग की आवश्यकता होने पर छिपे हुए पैनल में एक वीएसक्रॉलबार को डॉक करके इसे नकली करने की कोशिश कर रहे ग्लिच के कारण मैं छुटकारा नहीं पा रहा था। मैंने हार मान लिया। –

उत्तर

3

आप पैनल की ऑटो-स्क्रॉल कार्यक्षमता का उपयोग कर सकते हैं, आपको लंबवत स्क्रॉलबार दिखाने के लिए इसे केवल एक विंडोज संदेश भेजने की आवश्यकता है:

<DllImport("user32.dll")> _ 
Public Shared Function ShowScrollBar(ByVal hWnd As System.IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean 
End Function 

Private Const SB_VERT As Integer = 1 


Public Sub New() 

    ' This call is required by the designer. 
    InitializeComponent() 

    ShowScrollBar(Panel1.Handle, SB_VERT, True) 
End Sub 

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

इसके अलावा, आकार बदलने के दौरान प्रदर्शन में सुधार करने के लिए, आप अपडेट होने से पहले पर पैनल पर SuspendLayout पर कॉल कर सकते हैं।

+0

मैंने ऐसा करने की कोशिश की, लेकिन यह कोई फर्क नहीं पड़ता। निलंबन/फिर से शुरू लेआउट। क्या यह विधि बस जाने से अलग है। दृश्यमान = वर्टिकलस्क्रॉल ऑब्जेक्ट पर सत्य? क्योंकि यह सही ढंग से काम नहीं करता है। स्क्रॉलबार संशोधित नहीं है। – user1104203

+0

हां, यह विधि 'दृश्यमान = सत्य' सेट करने से अलग है (यही वह है जिसे मैंने पहले कोशिश की थी, लेकिन नेट पूरी तरह से अनदेखा करता है)। –

4

सी # competent_Tech के जवाब

using System.Runtime.InteropServices; 

public class MyUserControl : UserControl 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow); 

    private enum ScrollBarDirection 
    { 
     SB_HORZ = 0, 
     SB_VERT = 1, 
     SB_CTL = 2, 
     SB_BOTH = 3 
    } 

    public MyUserControl() 
    { 
     InitializeComponent(); 
     ShowScrollBar(this.Handle, (int) ScrollBarDirection.SB_VERT, true); 
    } 
} 
+0

इसकी आवश्यकता है: System.Runtime.InteropServices का उपयोग करना; – Bill

+0

@ बिल धन्यवाद - जोड़ा – fiat

+0

यह केवल मेरे लिए काम करता है जब मैं इसे VisibleChanged() में डालता हूं। ऐसा प्रतीत होता है कि यह केवल तभी प्रभावी होता है जब नियंत्रण दृश्यमान हो (?!) –

0

यहाँ के संस्करण क्या मेरे लिए यह हल है। मेरा मामला यह है कि मेरे पास एक पैनल में सैंडविच किया गया है जिसमें किसी भी दिशा में स्वतंत्रता की कोई डिग्री नहीं है। मुझे इस पैनल की इतनी बड़ी आवश्यकता थी कि पूरी संरचना मेरी 1920x1080 स्क्रीन से बाहर हो जाएगी। समाधान वास्तव में बहुत ही सरल है। स्क्रॉल बार की आवश्यकता वाले पैनल के लिए ऑटोस्क्रॉल प्रॉपर्टी को सत्य पर सेट करें। फिर, इसे दूर दाएं स्थिति (दाएं-नीचे की स्थिति) में एक और नियंत्रण जोड़ें। मैं जो नियंत्रण चुनता हूं वह एक लेबल है जिसे मैंने अदृश्य बना दिया .... और वह सब कुछ है। अब मेरा पैनल इसके प्रतिबंधित क्षेत्र पर है, लेकिन मैं जिस आकार की आवश्यकता है उस पर स्क्रॉल कर सकता हूं और मुझे जिस आकार की आवश्यकता है उसका उपयोग कर सकते हैं। यदि आपको केवल क्षैतिज स्क्रॉल बार की आवश्यकता है, तो बाईं ओर अदृश्य नियंत्रण जोड़ें, लंबवत केवल बहुत नीचे के लिए।

पैनल का वास्तविक आकार वह है जिसे आप इसे प्रदर्शित करते समय प्रतिबंधित करते हैं, लेकिन आभासी आकार अदृश्य नियंत्रण द्वारा निर्धारित होता है।

0

मेरे लिए क्या काम किया गया CreateParams कॉल को ओवरराइड कर रहा था और WS_VSCROLL शैली को सक्षम कर रहा था।

public class VerticalFlowPanel : FlowLayoutPanel 
{ 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      var cp = base.CreateParams; 
      cp.Style |= 0x00200000; // WS_VSCROLL 
      return cp; 
     } 
    } 
} 

AutoScroll तर्क अब पहले स्क्रॉलबार छिपा बिना स्क्रॉल सीमा को समायोजित करेगा।

+0

अच्छा और सरल कामकाज, लेकिन दुर्भाग्य से 'ऑटोस्क्रॉल' तर्क केवल स्क्रॉलिंग सीमाओं को अपडेट करता है और जब सभी सामग्री अंदर फिट होती है तो स्क्रॉलबार को अक्षम नहीं करता है। क्या इसके ऊपर सक्षम/अक्षम व्यवहार को लागू करने का कोई तरीका है? – glopes

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

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