动态生成的下拉菜单显示在屏幕的左上角

时间:2009-06-15 21:58:23

标签: c# .net winforms

我已将一些代码插入到ToolStripMenuItem的MouseDown和Click事件中以在运行时生成菜单,但菜单显示在屏幕的左上角而不是菜单项下。如果代码在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 个答案:

答案 0 :(得分:3)

将代码从MouseDown事件移至DropDownOpening事件;应该给你正确的行为。

答案 1 :(得分:0)

您可能使用控件本地的坐标(因为它们会出现在鼠标事件中),但是使用浮动窗口创建菜单,这会占用屏幕坐标。您可以使用Control.PointToScreen()函数将控件的局部坐标转换为全局屏幕坐标。只需在引发事件的控件上调用PointToScreen()即可。