我已将一些代码插入到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();
}
答案 0 :(得分:3)
将代码从MouseDown
事件移至DropDownOpening
事件;应该给你正确的行为。
答案 1 :(得分:0)
您可能使用控件本地的坐标(因为它们会出现在鼠标事件中),但是使用浮动窗口创建菜单,这会占用屏幕坐标。您可以使用Control.PointToScreen()
函数将控件的局部坐标转换为全局屏幕坐标。只需在引发事件的控件上调用PointToScreen()
即可。