如何在 Bing 地图上设置缩放级别?
How can I set the Zoom Level on my Bing Map?
我有 19 个菜单项的共享事件处理程序,标记为“1”到“19”,相应的标记值为 1 到 19:
// This event handler is shared by all 19 zoom level menu items
private void toolStripMenuItem_ZoomLevel1_Click(object sender, EventArgs e)
{
//int zoomLevel = sender.Tag; // "object does not contain a definition for tag"
//int zoomLevel = Convert.ToInt32(sender.Tag); // " "
//int zoomLevel = (sender as toolStripMenuItem).Tag; // type or namespace 'toolStripMenuItem' could not be found
//int zoomLevel = (sender as MenuItem).Tag; // "cannot implicitly convert object to int"
int zoomLevel = Convert.ToInt32((sender as MenuItem).Tag);
this.userControl11.myMap.ZoomLevel = zoomLevel;
}
但是,在运行时,当我 select 这些菜单项之一时,我得到一个空引用:“对象引用未设置为对象的实例”
菜单项(发送者)显然存在,并且有一个标签值。这里的 null 是什么?
更新
使用建议的代码:
this.userControl11.myMap.ZoomLevel = (int)((ToolStripMenuItem)sender).Tag;
...我得到,“指定的转换在运行时无效”。
“故事的其余部分”/血淋淋的细节是:
System.InvalidCastException HResult=0x80004002 Message=Specified
cast is not valid. Source=MyMaps StackTrace: at
MyMaps.Form1.toolStripMenuItem_ZoomLevel1_Click(Object sender,
EventArgs e) in
C:\Users\bclay\source\repos\MyMaps\MyMaps\Form1.cs:line 138 at
System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e) at
System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e) at
System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs
e, ToolStripItemEventType met) at
System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e,
ToolStripItemEventType met) at
System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea) at
System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons
button, Int32 clicks) at
System.Windows.Forms.Control.WndProc(Message& m) at
System.Windows.Forms.ScrollableControl.WndProc(Message& m) at
System.Windows.Forms.ToolStrip.WndProc(Message& m) at
System.Windows.Forms.ToolStripDropDown.WndProc(Message& m) at
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&
m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr
hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at
System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr
dwComponentID, Int32 reason, Int32 pvLoopData) at
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context) at
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32
reason, ApplicationContext context) at
System.Windows.Forms.Application.Run(Form mainForm) at
MyMaps.Program.Main() in
C:\Users\bclay\source\repos\MyMaps\MyMaps\Program.cs:line 19
根据您的事件处理程序的名称,我假设您正在处理 ToolStrioMenuItem
的点击事件,因此您需要将发件人转换为 ToolStripMenuItem
。
如果您不确定类型,请转到设计器并单击您正在处理其单击事件的 control/item,然后查看属性并检查 属性 window 在下拉列表中,并在投射发件人时使用该类型:
//To make it a bit more readable:
var item = (ToolStripMenuItem)sender;
var tag = item.Tag;
var value = Convert.ToInt32(tag);
this.userControl11.myMap.ZoomLevel = value;
//Or in a single line:
this.userControl11.myMap.ZoomLevel = Convert.ToInt32(((ToolStripMenuItem)sender).Tag);
这是您其余尝试的问题:
int zoomLevel = sender.Tag;
事件处理程序的发送者参数是对象类型,object
没有标记 属性。
int zoomLevel = Convert.ToInt32(sender.Tag);
同上
int zoomLevel = (sender as toolStripMenuItem).Tag;
打字错误! toolStripMenuItem 应该是 ToolStripMenuItem
int zoomLevel = (sender as MenuItem).Tag;
ToolStripMenuItem 不会驱动 from/isn 无法转换为 MenuItem,因此当您尝试使用 as
运算符将其转换为 MenuItem 时,结果为 null
,并尝试获取标记为null,会引发对象空引用异常。
我有 19 个菜单项的共享事件处理程序,标记为“1”到“19”,相应的标记值为 1 到 19:
// This event handler is shared by all 19 zoom level menu items
private void toolStripMenuItem_ZoomLevel1_Click(object sender, EventArgs e)
{
//int zoomLevel = sender.Tag; // "object does not contain a definition for tag"
//int zoomLevel = Convert.ToInt32(sender.Tag); // " "
//int zoomLevel = (sender as toolStripMenuItem).Tag; // type or namespace 'toolStripMenuItem' could not be found
//int zoomLevel = (sender as MenuItem).Tag; // "cannot implicitly convert object to int"
int zoomLevel = Convert.ToInt32((sender as MenuItem).Tag);
this.userControl11.myMap.ZoomLevel = zoomLevel;
}
但是,在运行时,当我 select 这些菜单项之一时,我得到一个空引用:“对象引用未设置为对象的实例”
菜单项(发送者)显然存在,并且有一个标签值。这里的 null 是什么?
更新
使用建议的代码:
this.userControl11.myMap.ZoomLevel = (int)((ToolStripMenuItem)sender).Tag;
...我得到,“指定的转换在运行时无效”。
“故事的其余部分”/血淋淋的细节是:
System.InvalidCastException HResult=0x80004002 Message=Specified cast is not valid. Source=MyMaps StackTrace: at MyMaps.Form1.toolStripMenuItem_ZoomLevel1_Click(Object sender, EventArgs e) in C:\Users\bclay\source\repos\MyMaps\MyMaps\Form1.cs:line 138 at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e) at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e) at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e) at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met) at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met) at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea) at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at System.Windows.Forms.ToolStrip.WndProc(Message& m) at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at MyMaps.Program.Main() in C:\Users\bclay\source\repos\MyMaps\MyMaps\Program.cs:line 19
根据您的事件处理程序的名称,我假设您正在处理 ToolStrioMenuItem
的点击事件,因此您需要将发件人转换为 ToolStripMenuItem
。
如果您不确定类型,请转到设计器并单击您正在处理其单击事件的 control/item,然后查看属性并检查 属性 window 在下拉列表中,并在投射发件人时使用该类型:
//To make it a bit more readable:
var item = (ToolStripMenuItem)sender;
var tag = item.Tag;
var value = Convert.ToInt32(tag);
this.userControl11.myMap.ZoomLevel = value;
//Or in a single line:
this.userControl11.myMap.ZoomLevel = Convert.ToInt32(((ToolStripMenuItem)sender).Tag);
这是您其余尝试的问题:
int zoomLevel = sender.Tag;
事件处理程序的发送者参数是对象类型,
object
没有标记 属性。int zoomLevel = Convert.ToInt32(sender.Tag);
同上
int zoomLevel = (sender as toolStripMenuItem).Tag;
打字错误! toolStripMenuItem 应该是 ToolStripMenuItem
int zoomLevel = (sender as MenuItem).Tag;
ToolStripMenuItem 不会驱动 from/isn 无法转换为 MenuItem,因此当您尝试使用
as
运算符将其转换为 MenuItem 时,结果为null
,并尝试获取标记为null,会引发对象空引用异常。