انقر فوق حدث لا يتم إطلاقه لـ UserControl المخصص في نموذج

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

سؤال

لقد قمت بإنشاء UserControl يسمى Toggle, ، هذا هو الكود الخاص بي لذلك

[DefaultEvent("Click")]
public partial class Toggle : UserControl {

    public bool ToggleStatus { get { return toggleStatus; } }
    private bool toggleStatus { get; set; }

    public Toggle() {
        InitializeComponent();
        toggleStatus = true;
    }

    private void toggleClick(object sender, EventArgs e) {
        if (toggleStatus) { // currently set as "true" or "on"
            this.lblSwitch.Dock = DockStyle.Right;                
            this.pnlBackground.BackColor = System.Drawing.Color.Red;
            toggleStatus = false;
        } else { // currently set as "false" or "off"
            this.lblSwitch.Dock = DockStyle.Left;                
            this.pnlBackground.BackColor = System.Drawing.Color.Green;
            toggleStatus = true;
        }
    }
}

ال toggleClick الطريقة مرتبطة بحدث النقر لعناصر التحكم داخل UserControl;هذا ينطلق على ما يرام.

ومع ذلك، عندما أضع بلدي Toggle التحكم في نموذج ومحاولة ربط حدث بالنقر عليه، فلن يتم تشغيله.

    private void toggleSoundClick(object sender, EventArgs e) {
        soundToggle = !soundToggle;
    }

لقد تأكدت من أن الطريقة الصحيحة مرتبطة بحدث النقر في ملف Designer.cs الخاص بي لكل من UserControl والنموذج الخاص بي

تحكم المستخدم:

this.lblSwitch.Click += new System.EventHandler(this.toggleClick);
this.pnlBackground.Click += new System.EventHandler(this.toggleClick);

(لقد ربطته بعنصري تحكم في ملفي Toggle لأنني أريد إطلاقه بغض النظر عن المكان الذي تنقر فيه على عنصر التحكم)

استمارة:

this.tglSound.Click += new System.EventHandler(this.toggleSoundClick);

السلوك المتوقع لـ UserControl هو التشغيل toggleClick (وهو ما يفعله) فيجب أن ينطلق النموذج toggleSoundClick (وهو ما لا يحدث).لقد رأيت هذا السلوك يعمل بشكل جيد مع UserControls الأخرى التي صممتها واستخدمتها في نفس المشروع.

للتوضيح:

لدي UserControl يسمى ServerDisplay.لدي طريقة مرتبطة بحدث النقر في لوحة الخلفية ServerDisplay (في رمز ServerDisplay) الذي يُظهر رسالة عشوائية:

    private void ServerDisplay_Click(object sender, EventArgs e) {
        MessageBox.Show("test");
    }

ثم، لدي ServerDisplay التحكم الموجود في النموذج الخاص بي.لدي طريقة مرتبطة بحدث النقر الخاص به أيضًا (في الكود الخاص بالنموذج الخاص بي)

    private void serverDisplayClick(object sender, EventArgs e) {
        if (loaded) {
            ServerDisplay display = (ServerDisplay)sender;
            this.lblLastServer.Text = "Last server joined was " + display.Server.Name + " at " + DateTime.Now.ToString("h:mm tt");
            centerControl(this.lblLastServer);
        }
    } 

عندما أقوم بالنقر على ServerDisplay التحكم في النموذج الخاص بي، فإنه يُظهر messageBox (رمز من الداخل ServerDisplay)، ثم يقوم بتحديث التسمية التي حددتها في الكود (الكود من النموذج).هذا هو السلوك المقصود، لكنه لا يعمل مع الآخرين UserControl.

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

المحلول

وأخيرا حظيت بها!الطريقة التي تم بها إعداد عنصر التحكم، كان لدي عنصر التحكم نفسه، لوحة تملأ الخلفية بأكملها (استخدمت هذا للون)، ثم لوحة أخرى داخل اللوحة الأولى لتكون بمثابة "المفتاح".

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

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