C# 动态生成的下拉菜单出现在屏幕的左上角

C# 动态生成的下拉菜单出现在屏幕的左上角,c#,.net,winforms,C#,.net,Winforms,我在ToolStripMenuItem的MouseDown和Click事件中插入了一些代码,以便在运行时生成一个菜单,但是菜单显示在屏幕的左上角,而不是菜单项下。无论代码是鼠标向下还是单击,菜单总是位于错误的位置。我做错了什么 下面是一个代码示例: private void windowToolStripMenuItem_MouseDown(object sender, MouseEventArgs e) { windowToolStripMenuItem.BuildOpenWindow

我在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;
            });
        }
    }
}
静态类扩展方法
{
公共静态void BuildOpenWindowsDropDown(此工具条带DropDownItem toModify、WindowManager、WindowManager、谓词约束)
{
toModify.DropDownItems.Clear();
列表窗口=windowManager.FindOpenWindows(约束);
如果(windows!=null)
{
windows.ForEach((表格f)=>
{
ToolStripItem tsi=toModify.DropDownItems.Add(f.Text);
tsi.Tag=f;
EventHandler clickHandler=新建EventHandler(
(对象发送方,事件参数)=>
{
表单fToShow=(表单)((ToolStripItem)发送者).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();
    }
公共列表FindOpenWindows(谓词约束)
{
var founds=来自windows中的窗体
何处约束(形式)
&&表单。创建
选择表格;
return founds.ToList();
}

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

将代码从
鼠标向下移动到事件;这应该会给您提供正确的行为。

您能添加一个关于如何创建菜单并显示它的代码示例吗?实际上,我没有在设计时构建下拉列表(我不能),而是反复调用ToolStripMenuItem的DropDownItems属性的add方法。我也遇到了同样的问题,而且我还没有尝试过这个解决方案,但让我们假设它是有效的…我的问题是,为什么这应该有效?有什么区别?