عندما أقوم بتغيير ون_الخلفية زر. NET مرة أخرى إلى قيمته الأصلية، فإنه لا ينظر الى نفسه أي أكثر

StackOverflow https://stackoverflow.com/questions/506641

  •  21-08-2019
  •  | 
  •  

سؤال

ولدي الزر الذي كنت أريد أن "فلاش" لفترة وجيزة للحصول على انتباه المستخدم. وأنا أحسب أن أسهل طريقة ليكون تغيير الخاصية BackColor زر إلى لون آخر، ومن ثم تشغيله مرة أخرى. ذلك أن أفعل شيئا من هذا القبيل:

this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;

وثم بعد حوالي 1/2 الثانية:

myButton.BackColor = this.oldColor;

ولكن لون خلفية الزر في نهاية الأمر <م> واضح أغمق من بقية الأزرار الموجودة على نموذج!

في البداية، اعتقدت انه كان لأنه لا يوجد شيء خاص عن اللون الأصلي للزر كونه لون اسمه (في هذه الحالة، "السيطرة")، ولكن الأمر ليس كذلك.

ما هو أسوأ من ذلك، عندما ننظر إلى myButton.BackColor في المصحح، وأحصل

{Name=Control, ARGB=(255, 236, 233, 216)}

ما هو الصحيح تماما! ولكن عندما تأخذ لقطة، والتحقق من لون، فإنه ليست هي نفسها كما بقية الأزرار!

هل هناك نوع من اخفاء يحدث؟ أو ربما نوعا من التردد؟

هل كانت مفيدة؟

المحلول

وأنا أحسب سبب لهذه المشكلة. تبين هناك عقار آخر (للأزرار وTabPages فقط، على ما يبدو) اسمه UseVisualStyleBackColor. التي تسيطر عليها أم لا لاستخدام "الأنماط المرئية" عند حساب BackColor. ومما زاد الطين بلة، بمجرد تعيين BackColor، تم ضبطه على false. لذلك أنا فقط انتهى ذلك:

this.oldUseVisualStyleBackColor = myButton.UseVisualStyleBackColor;
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;

وعندما أكون على استعداد لإعادة تعيينها:

myButton.BackColor = this.oldColor;
myButton.UseVisualStyleBackColor = this.oldUseVisualStyleBackColor;

و(نعم، لديك لإعادة BackColor أولا، وفقط قم بتعيين UseVisualStyleBackColor).

وليس لدي أي فكرة لماذا يتم استخدام UseVisualStyleBackColor، أو لماذا يفعل ما يفعل، ولكن يبدو أن العمل الآن.

و(شكرا، مارك! لم أكن قد وجدت هذا دون مساعدتكم!)

نصائح أخرى

وأظن أن الفرق هو أن واحد هو لون argb منتظم، واحد هو نظام / اللون معروفة.

وعناصر التحكم في. NET تمكن من تعقب ما إذا كان اللون هو واضح (تعيين على هذه السيطرة) أو الموروثة. وهذا يجعل من الصعب تغيير مرة أخرى بشكل صحيح ... ولكن هل يمكن أن يكون قادرا على القيام بذلك مع PropertyDescriptor، كما يلي:

    TextBox tb = new TextBox();
    tb.BackColor = Color.Red;
    // now set it back to inherited
    PropertyDescriptor prop = TypeDescriptor.GetProperties(tb)["BackColor"];
    if (prop.CanResetValue(tb))
    {
        prop.ResetValue(tb);
    }

وعالي الكعب قليلا، ولكن ينبغي لها أن تعمل.

والخاصية UseVisualStyleBackColor زر تحدد ما إذا كانت خلفية الزر يتم رسمها باستخدام الأنماط المرئية. عندما يتم تعيين الخاصية UseVisualStyleBackColor زر واحدة إلى True، يتم تجاهل الخاصية BackColor. عندما يتم تغيير الخاصية BackColor إلى لون مختلف، وتعيين الخاصية UseVisualStyleBackColor تلقائيا إلى خطأ.

ويمكنك ان ترى هذا التأثير عندما كنت في وضع التصميم. إنشاء زر وتغيير الخاصية BackColor إلى اللون الأحمر. ثم انتقل لأسفل إلى الخاصية UseVisualStyleBackColor، ونلاحظ أنه قد تم تعيينها إلى خطأ. إذا كنت ثم قم بتعيين الخاصية UseVisualStyleBackColor إلى صحيح، ولون زر تغيير مرة أخرى إلى اللون الافتراضي. سوف تبديل الملكية UseVisualStyleBackColor يعود إلى خطأ تغيير لون الزر إلى الأحمر.

والبرنامج التالي يوضح هذا الشأن.

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Button1.BackColor = Color.Red
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Button1.UseVisualStyleBackColor = Not Button1.UseVisualStyleBackColor
End Sub

وبفضل scraimer لنشر مشكلته وتحديد الملكية UseVisualStyleBackColor كما culpert مذنب.

وأو هل يمكن أن اكتب فقط:

TextBox tb = new TextBox();
//Change the Backcolor
tb.BackColor = Color.Red;
//Resets the Backcolor to its default value, its pretty strange that you don't see the method but it works with allmost all properties
tb.ResetBackColor();

وطريقة بسيطة:

myButton.BackColor = Color.Empty
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top