c # - использовать переменные из разных методов - PullRequest
1 голос
/ 23 декабря 2010

Я не уверен, что делаю это правильно или нет, так что, надеюсь, кто-нибудь сможет мне помочь.

Я пытаюсь использовать переменную в методе, который содержится в другом методе. Как и ожидалось, я получаю сообщение об ошибке: имя 'Title1' не существует в текущем контексте.

Сначала я читаю XML-файл, затем заполняю карты Bing кнопками. Одной из переменных является tite каждого элемента xml, мне нужно использовать переменную «Title1» в моем методе ниже.

Вот код:

 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 ]

2 голосов
/ 23 декабря 2010

Если вы используете анонимный метод внутри цикла, вы сможете получить доступ к этой переменной (магия происходит во время компиляции):

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 голосов
/ 23 декабря 2010

Является ли 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 голос
/ 23 декабря 2010

Нельзя ссылаться на локальные переменные в разных методах. Во-первых, локальная переменная больше не существует, когда возвращается функция, определенная в. С другой стороны, похоже, что локальной переменной Title будет присвоено множество различных значений в ходе выполнения цикла foreach для событий, поэтому перемещение переменной Title1 в поле класса ничего не решит.

Лучше всего ассоциировать Title1 с объектом канцелярской кнопки. Какой объект передается в событие pushpin как отправитель? Если это сам объект канцелярской кнопки или объект канцелярской кнопки доступен через параметр args события, то вы свободны. Свойство Content в канцелярской кнопке содержит значение Title1. Используйте Pushpin.Content вместо Title1.

0 голосов
/ 23 декабря 2010

Так как Title1 создается внутри цикла, единственный реальный «жизнеспособный» метод - передать объект в качестве параметра объекту ИЛИ сохранить его значение, которое вам нужно, в месте, откуда вы могли бы его получить. (Возможно, в качестве тега на объекте, который запускает другое ваше событие).

0 голосов
/ 23 декабря 2010

Сделайте это переменной класса.Или передать его в качестве аргумента другой функции.Но локальная переменная действительна только внутри функции.(Функцию можно вызывать многократно рекурсивно. В этом случае в каждом кадре стека есть несколько копий всех локальных переменных. Поэтому то, что вы спрашиваете, не имеет смысла.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...