c# - 使用不同方法的变量

时间:2010-12-23 18:38:57

标签: c# silverlight c#-4.0

我不确定我是否以正确的方式行事,所以希望有人可以帮助我。

我试图在一个方法中使用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));

    }

5 个答案:

答案 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是在循环内部创建的,因此唯一真正的“可行”方法是将项目作为参数传递给对象,或者将您需要的值存储在可以从中获取的位置。 (可能是作为开始其他事件的对象的标记)。