Как создать событие самодельным управлением в WinForms? - PullRequest
0 голосов
/ 30 ноября 2011

Я работаю над своим первым проектом на C # и .NET, который использует WinForms, так как WPF был бы излишним для наших целей.Я создал так называемое ButtonMenu, которое включает в себя все пункты меню, которые являются кнопками.Этот класс является производным от класса управления Windows.

Одной из кнопок ButtonMenu является кнопка «Культура», которая при нажатии в этом приложении с одним касанием должна изменять язык всех форм приложения.has.

Изначально ButtonMenu был просто своего рода классом наложения, который обращался к элементам управления BaseForm и содержал методы.BaseForm держал кнопки внутри собственного GroupBox.Позже я столкнулся с проблемами такого рода дизайна и решил сделать из него отдельный элемент управления.

Мой вопрос Как я могу создать событие (или что-то подобное), которое может быть перехвачено BaseForm,где находится ButtonMenu?BaseForm в настоящее время не может реагировать на это событие и не может изменить язык всех своих собственных элементов управления, таких как текстовые поля и кнопки.

Спасибо за вашу помощь!

То, что я пробовал до сих пор, показано ниже.К сожалению, я не могу добраться до отмеченной линии.

    public class BaseForm : Form
{
    […]
    protected static ButtonMenu m_ButtonMenu = null;


    protected override void OnResize(EventArgs e)
    {
        […]
        m_ButtonMenu = ButtonMenu.GetInstance(m_CurrentCulture, Size);

        m_ButtonMenu.Visible = true;
        […]
    }

    public override void UpdateWidgets()
    {
        […]
        try
        {
            […]

            // Translate button menu into current language:
            m_ButtonMenu.AdaptButtons(m_CurrentCulture);
        }
        catch (ArgumentOutOfRangeException aaore)
        {
        […]


        […]
    }

    protected void InitializeWidgets()
    {
    {
        string strMethod = Name + ":InitializeWidgets(): ";

        m_ButtonMenu = ButtonMenu.GetInstance(m_CurrentCulture, Size);

        SuspendLayout();

        Controls.Add(m_ButtonMenu);
        m_ButtonMenu.Top = Height - m_ButtonMenu.Height;

        ResumeLayout();
        […]
        m_ButtonMenu.Click += new System.EventHandler(this.ButtonMenu_CultureClick);
    }

    private void ButtonMenu_CultureClick(object sender, EventArgs eas)
    {
        int iSelection = listViewMessages.SelectedIndices[0];  // <<<<< NEVER REACHED!

        […]
    } 

1 Ответ

4 голосов
/ 30 ноября 2011

Просто определите событие в вашем классе.

Когда захочешь, позвони.

// field
event EventHandler somethingHappened;

// in a method:
var threadSafeCopy = somethingHappened;
if(threadSafeCopy != null)
{ 
  threadSafeCopy(this, e);
}

Где e - это экземпляр EventArgs или подтип EventArgs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...