Динамически сгенерированное выпадающее меню появляется в верхнем левом углу экрана - PullRequest
3 голосов
/ 16 июня 2009

Я подключил некоторый код к событиям MouseDown и Click ToolStripMenuItem, чтобы сгенерировать меню во время выполнения, но оно появляется в левом верхнем углу экрана, а не под пунктом меню. Не имеет значения, находится ли код в MouseDown или Click, меню всегда находится не в том месте. Что я делаю не так?

Вот пример кода:

private void windowToolStripMenuItem_MouseDown(object sender, MouseEventArgs e)
{
    windowToolStripMenuItem.BuildOpenWindowsDropDown(Program.windowManager, (Form f) => (f.SomeProperty == SomeValue));
}

Метод расширения:

static class ExtensionMethods
{
    public static void BuildOpenWindowsDropDown(this ToolStripDropDownItem toModify, WindowManager windowManager, Predicate<Form> constraint)
    {
        toModify.DropDownItems.Clear();
        List<Form> windows = windowManager.FindOpenWindows(constraint);
        if (windows != null)
        {
            windows.ForEach((Form f) =>
            {
                ToolStripItem tsi = toModify.DropDownItems.Add(f.Text);
                tsi.Tag = f;
                EventHandler clickHandler = new EventHandler(
                    (object sender, EventArgs e) =>
                    {
                        Form fToShow = (Form)((ToolStripItem)sender).Tag;
                        fToShow.Show();
                    });
                tsi.Click += clickHandler;
            });
        }
    }
}

И фрагмент из класса WindowManager:

    public List<Form> FindOpenWindows(Predicate<Form> constraint)
    {
        var foundTs = from form in windows
                          where constraint(form)
                                && form.Created
                          select form;

        return foundTs.ToList();
    }

Ответы [ 2 ]

3 голосов
/ 16 июня 2009

Переместить код из события MouseDown в событие DropDownOpening; это должно дать вам правильное поведение.

0 голосов
/ 16 июня 2009

Скорее всего, вы используете координаты, которые являются локальными для элемента управления (как они бы поступали в событиях мыши), но создаете свое меню с помощью плавающего окна, которое будет ожидать экранных координат. Вы можете использовать функцию Control.PointToScreen() для перевода локальных координат элемента управления в глобальные координаты экрана. Просто позвоните PointToScreen() на элемент управления, который вызывает события.

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