2008-09-29 15 views
18

मेरे पास कुछ बटन हैं जिनमें से मैंने संशोधित किया कि वे कैसे दिखते हैं। मैंने उन्हें पृष्ठभूमि और कस्टम सीमा के साथ फ्लैट बटन के रूप में सेट किया है, इसलिए वे सभी सुंदर दिखते हैं और सामान्य बटन की तरह कुछ भी नहीं (वास्तव में, वे अब Office 2003 बटन की तरह दिखते हैं ;-)। बटनों में एक पिक्सेल की सीमा है।सी # में बटन पर फोकस शैली को कैसे सेट/बदलें/हटाएं?

हालांकि जब बटन चुना जाता है (टैब क्लिक को दबाकर एक क्लिक या कीबोर्ड एक्शन के माध्यम से फोकस हो जाता है) बटन अचानक उसी रंग के चारों ओर अतिरिक्त सीमा और अतिरिक्त सीमा प्राप्त करता है, जिससे इसे दो पिक्सेल सीमा बना दिया जाता है। इसके अलावा जब मैं एक पिक्सेल सीमा को अक्षम करता हूं, तो बटन को फोकस पर एक पिक्सेल सीमा नहीं मिलती है।

शुद्ध पर इस सवाल की तरह 'मैं कैसे एक बटन पर ध्यान केंद्रित निष्क्रिय कर सकते हैं' एक बहुत पूछा जाता है, लेकिन वह नहीं है जो मैं चाहता: ध्यान अभी भी तरह से यह करता है में मौजूद होना चाहिए, बस नहीं प्रदर्शन अभी व।

कोई सुझाव? :-)

उत्तर

0

निश्चित रूप से आप स्वयं बटन को खींच सकते हैं। राज्य झंडे में से एक केंद्रित है।

तो ड्रॉ ईवेंट पर यदि ध्वज केंद्रित है तो आगे बढ़ें और बटन को कैसे आकर्षित करें, अन्यथा इसे मूल विधि पर पास करें।

+0

क्या आप थोड़ा और विस्तार कर सकते हैं, क्योंकि कोई ड्रा * ईवेंट * नहीं है? हालांकि एक पेंट घटना है, लेकिन कोई राज्य झंडे नहीं है। =) मैं समझता हूं और विचार की तरह, वास्तविक कार्यान्वयन पर थोड़ा सा खो गया। –

0

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

30

क्या यह प्रभाव आप ढूंढ रहे हैं?

public class NoFocusCueButton : Button 
{ 
    protected override bool ShowFocusCues 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

तुम सिर्फ एक नियमित रूप से बटन की तरह इस कस्टम बटन वर्ग का उपयोग कर सकते हैं, लेकिन यह आप ध्यान केंद्रित पर एक अतिरिक्त आयत नहीं देंगे।

+2

महान सुझाव के लिए धन्यवाद! यह एक आंतरिक भूरे रंग के फोकस आयत से छुटकारा पाता है, लेकिन अतिरिक्त एक पिक्सेल सीमा नहीं है (जो इसे कुल दो पिक्सेल सीमा बनाता है)। –

+2

@ क्रिस जेस्टर-यंग: अतिरिक्त एक पिक्सेल सीमा को छिपाने के लिए जोश स्ट्रिबलिंग से जवाब देखें। – Marc

1

दूसरी सीमा जो जोड़ा जाता है वह विंडोज मानक "डिफ़ॉल्ट बटन" सीमा है। आपने देखा होगा कि यदि आप एकाधिक बटन (जैसे किसी भी नियंत्रण कक्ष गुण विंडो) के साथ अधिकांश संवाद बॉक्स के माध्यम से टैब करते हैं, तो मूल "डबल-बोर्डर्ड" बटन "सामान्य" हो जाता है और इन-फोकस बटन "डबल-बोर्डर्ड" बन जाता है। "

यह आवश्यक रूप से काम पर केंद्रित नहीं है, बल्कि एंटर कुंजी को मारकर किए गए क्रिया का एक दृश्य संकेत है।

यह मेरे लिए लगता है, जैसे कि आप वास्तव में उस आंतरिक कामकाज की परवाह नहीं करते हैं। आप चाहते हैं कि डिस्प्ले में दो सीमाएं न हों - पूरी तरह से समझने योग्य। आंतरिक कार्य यह बताने के लिए है कि आप यह व्यवहार क्यों देख रहे हैं। अब ... कोशिश करने और इसे ठीक करने के लिए।

पहली चीज़ जो मैं कोशिश करूंगा - और ध्यान में रखो, मैंने इसे मान्य नहीं किया है - एक हैक है। जब एक बटन फोकस प्राप्त करता है (जिससे डबल-सीमा प्राप्त हो), तो अपनी एकल सीमा बंद कर दें। आपको वह प्रभाव मिल सकता है जो आप चाहते हैं, और यह बहुत आसान है। (फोकस इवेंट में हुक। यहां तक ​​कि बेहतर, सबक्लास बटन और ऑनफोकस ओवरराइड करें, फिर अपने भविष्य के बटन के लिए उस सबक्लास का उपयोग करें।)

हालांकि, यह नए, अजीब दृश्य दुष्प्रभावों को पेश कर सकता है। उस नस में - और क्योंकि हैक्स शायद ही कभी सबसे अच्छा जवाब हैं - मुझे "आधिकारिक तौर पर" दूसरों की क्या सलाह है, इसकी सिफारिश करें: बटन को कस्टम पेंट करें। यद्यपि यहां कोड अधिक हो सकता है, यह link at CodeProject चर्चा करता है कि यह कैसे करें (वीबी लिंक; आपको अनुवाद की आवश्यकता होगी)। आपको एक पूर्ण-कस्टम मोड में, उस दूसरी सीमा से पूरी तरह से छुटकारा पाने में सक्षम होना चाहिए।

2

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

यह मेरे लिए काम करता है, हालांकि महान अभ्यास नहीं है यह एक अच्छा हैक है और जब तक आप बटन को स्पष्ट रूप से नाम दें (और स्रोत पर टिप्पणी करें) अन्य कोडर विचार उठाएंगे।

रयान

0

अपनी शैली में अशक्त करने के लिए FocusVisualStyle निर्भरता संपत्ति सेट करें, और बिंदीदार सीमा चला जाएगा।

MSDN से

: Styling for Focus in Controls, and FocusVisualStyle

विंडोज प्रस्तुति फाउंडेशन (WPF) एक नियंत्रण जब यह प्राप्त करता है कुंजीपटल फोकस का दृश्य स्वरूप बदल रहा है के लिए दो समानांतर तंत्र प्रदान करता है। पहली तंत्र गुणों के लिए संपत्ति सेटर्स का उपयोग के रूप में है IsKeyboard शैली या नियंत्रण पर लागू टेम्पलेट के भीतर फ़ोकस किया गया है। टी वह दूसरी तंत्र फोकसविज़ुअल स्टाइल संपत्ति के मूल्य के रूप में एक अलग शैली प्रदान करता है; "फोकस दृश्यात्मक शैली" एक adorner कि द्वारा नियंत्रण के शीर्ष पर, बजाय नियंत्रण या अन्य यूआई तत्व के दृश्य पेड़ बदलने पर ड्रॉ जगह के लिए एक अलग दृश्य पेड़ पैदा करता है। यह विषय परिदृश्यों पर चर्चा करता है जहां इनमें से प्रत्येक तंत्र उपयुक्त है।

अतिरिक्त सीमा आप देख सकते हैं और नियंत्रण टेम्पलेट में नहीं FocusVisualStyle द्वारा परिभाषित किया गया है, तो आप हटाने या सीमा को हटाने के लिए शैली ओवरराइड करने के लिए की जरूरत है।

+0

यह डब्ल्यूपीएफ के लिए है, Winforms नहीं। – DMan

6

एक और विकल्प (हालांकि थोड़ा हैकटास्टिक) बटन के गॉटफोकस ईवेंट में ईवेंट-हैंडलर संलग्न करना है। उस घटना-हैंडलर में, बटन के NotifyDefault() विधि पर गलत का मान पास करें। तो, उदाहरण के लिए:

void myButton_GotFocus(object sender, EventArgs e) 
{ 
    myButton.NotifyDefault(false); 
} 

मुझे लगता है कि यह हर बार काम करेगा, लेकिन मैंने इसे व्यापक रूप से परीक्षण नहीं किया है। यह अब मेरे लिए काम कर रहा है, इसलिए मैं उससे संतुष्ट हूं।

0

आप एक पाठ बॉक्स और पाठ बॉक्स की textchange घटना पर एक बटन तो लिखने button1.focus();

यह काम हो जाएगा।

14

एक कस्टम बटन बनाओ:

public partial class CustomButton: Button 
{ 
    public ButtonPageButton() 
    { 
     InitializeComponent(); 

     this.SetStyle(ControlStyles.Selectable, false); 
    } 
} 

है कि कष्टप्रद सीमा से छुटकारा मिल जाएगा!;-)

+0

यह मेरे लिए काम करता था और सरल था। – theJerm

+0

दुर्भाग्यवश यह बटन पर ध्यान केंद्रित करने की क्षमता को अक्षम करता है। 'शोफोकसक्यू' ओवरराइटिंग बेहतर लगता है। –

-3

मैं अच्छी किस्मत केवल बटन के फ़ोकस करने योग्य संपत्ति की स्थापना गलत किया है:

<Button HorizontalAlignment="Left" Margin="0,2" 
     Command="{Binding OpenSuspendedJobCommand, Mode=OneWay}" 
     Focusable="False" 
     Style="{StaticResource ActionButton}" Content="Open Job..." /> 
+1

डब्ल्यूपीएफ WinForms के समान नहीं है। – Neolisk

19

मैं कष्टप्रद डबल सीमा के साथ एक ही मुद्दा था, और इस सूत्र की तलाश भर में ठोकर खाई एक जवाब ...

तरह से मैं इस हल को 0 पर BorderSize स्थापित करने के लिए तो में अपने ही सीमा आकर्षित था OnPaint

* नोट: नहीं पूरे बटन, सीमा

एक साधारण उदाहरण होगा:

public class CustomButton : Button 
{ 
    public CustomButton() 
     : base() 
    { 
     // Prevent the button from drawing its own border 
     FlatAppearance.BorderSize = 0; 
     FlatStyle = System.Windows.Forms.FlatStyle.Flat; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     // Draw Border using color specified in Flat Appearance 
     Pen pen = new Pen(FlatAppearance.BorderColor, 1); 
     Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1); 
     e.Graphics.DrawRectangle(pen, rectangle); 
    } 
} 

मेरे मामले में, यह मैं कैसे एक बटन है कि एक ToolStripButton, जहां सीमा की नकल करता बनाई गई है

public class ToolButton : Button 
{ 
    private bool ShowBorder { get; set; } 

    public ToolButton() 
     : base() 
    { 
     // Prevent the button from drawing its own border 
     FlatAppearance.BorderSize = 0; 

     // Set up a blue border and back colors for the button 
     FlatAppearance.BorderColor = Color.FromArgb(51, 153, 255); 
     FlatAppearance.CheckedBackColor = Color.FromArgb(153, 204, 255); 
     FlatAppearance.MouseDownBackColor = Color.FromArgb(153, 204, 255); 
     FlatAppearance.MouseOverBackColor = Color.FromArgb(194, 224, 255); 
     FlatStyle = System.Windows.Forms.FlatStyle.Flat; 

     // Set the size for the button to be the same as a ToolStripButton 
     Size = new System.Drawing.Size(23, 22); 
    } 

    protected override void OnMouseEnter(EventArgs e) 
    { 
     base.OnMouseEnter(e); 

     // Show the border when you hover over the button 
     ShowBorder = true; 
    } 

    protected override void OnMouseLeave(EventArgs e) 
    { 
     base.OnMouseLeave(e); 

     // Hide the border when you leave the button 
     ShowBorder = false; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     // The DesignMode check here causes the border to always draw in the Designer 
     // This makes it easier to place your button 
     if (DesignMode || ShowBorder) 
     { 
      Pen pen = new Pen(FlatAppearance.BorderColor, 1); 
      Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1); 
      e.Graphics.DrawRectangle(pen, rectangle); 
     } 
    } 



    // Prevent Text from being set on the button (since it will be an icon) 
    [Browsable(false)] 
    public override string Text { get { return ""; } set { base.Text = ""; } } 

    [Browsable(false)] 
    public override ContentAlignment TextAlign { get { return base.TextAlign; } set { base.TextAlign = value; } } 
} 
0

तुम भी एक अदृश्य बटन बनाने और इसे सक्रिय बनाने के जब भी आप एक और बटन दबा सकते हैं: जब आप बटन पर होवर केवल दिख रहा है।