我不确定我是否以正确的方式行事,所以希望有人可以帮助我。
我试图在一个方法中使用var,它包含在另一个方法中。正如所料,我得到错误:当前上下文中不存在名称“Title1”。
首先我正在读取一个xml文件,然后使用图钉填充bing地图。其中一个变量是每个xml项目的tite,我需要在下面的方法中使用“Title1”var。
以下是代码:
public void OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
var document = XDocument.Load(e.Result);
if (document.Root == null)
return;
var xmlns = XNamespace.Get("http://www.blahblah.com");
var events = from ev in document.Descendants("item")
select new
{
Latitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "lat").Value),
Longitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "long").Value),
Title = (ev.Element("title").Value),
Description = (ev.Element("description").Value),
Link = (ev.Element("link").Value),
};
QuakeLayer.Children.Clear();
foreach (var ev in events)
{
var accentBrush = (Brush)Application.Current.Resources["PhoneAccentBrush"];
var Title1 = (ev.Title);
var pin = new Pushpin
{
Location = new GeoCoordinate
{
Latitude = ev.Latitude,
Longitude = ev.Longitude
},
Background = accentBrush,
Content = Title1
};
QuakeLayer.AddChild(pin, pin.Location);
}
}
public void Pushpin_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
NavigationService.Navigate(new Uri("/blahblah.xaml?info=" + Title1, UriKind.Relative));
}
答案 0 :(得分:2)
PushPin是活动的发件人吗?如果是这样,您可以从中获取标题,因为您将其设置为内容。
public void Pushpin_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
var pushPin = (PushPin)sender;
var title = pushPin.Content;
NavigationService.Navigate(new Uri("/blahblah.xaml?info=" + title, UriKind.Relative));
}
答案 1 :(得分:2)
如果你在循环中使用匿名方法,你将能够访问这个变量(在编译期间会发生魔法):
var pin = new Pushpin
{
...
Content = Title1
};
pin.ManipulationStarted += (s, a) =>
{
// Code for the event here
// ... do something with Title1
};
QuakeLayer.AddChild(pin, pin.Location);
答案 2 :(得分:1)
您不能跨不同方法引用局部变量。首先,当它定义的函数返回时,局部变量不再存在。另一方面,看起来Title子局部变量在运行foreach循环的过程中会被赋予很多不同的值,因此将Title1变量移到类字段中将无法解决任何问题。
您最好的选择可能是将Title1与图钉对象相关联。什么对象作为发件人传递到您的图钉事件?如果那是图钉对象本身,或者图钉对象可以通过event args参数获得,那么你就可以免费回家了。图钉的Content属性包含Title1值。使用Pushpin.Content而不是Title1。
答案 3 :(得分:0)
使它成为一个类变量。或者将它作为参数传递给另一个函数。但是局部变量仅在函数内有效。 (一个函数可以递归多次调用。在这种情况下,每个堆栈框架中的所有局部变量都有多个副本。所以你要问的是没有意义的。)
答案 4 :(得分:0)
由于Title1是在循环内部创建的,因此唯一真正的“可行”方法是将项目作为参数传递给对象,或者将您需要的值存储在可以从中获取的位置。 (可能是作为开始其他事件的对象的标记)。