2013-02-14 3 views
0

мне нужно, чтобы получить некоторое свойство элемента, которые вызывают событие в этом контексте:Использование «это» в случае

SoundEffect alarm; 
public MainPage() 
    { 
     InitializeComponent(); 

     Pad1.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound); 
     Pad2.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound); 
     Pad3.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound); 

    } 

Pad1,2 и 3 являются имена некоторых Ellipse у меня в XAML. Теперь, если я попытаюсь сделать это в коде, выполняемом события (объявлен сразу после того, как образец кода выше):

private void makeasound(object sender, MouseButtonEventArgs e) 
    { 
     string text = this.Name; 
     textBlock1.Text = text; 
    }  

Текстовый блок становится пустым, поэтому я предполагаю, что имя запускающего элемента никогда не попадает туда.

Теперь все становится более грязным, если я пытаюсь получить пользовательское свойство «колодки» под названием «Сын», объявленный с помощью метода зависимостей, который является строкой, например:

private void makeasound(object sender, MouseButtonEventArgs e) 
     { 
      string text = this.Son; 
      textBlock1.Text = text; 
     } 

VS сообщает об ошибке:

«PhoneApplication.MainPage» не содержит определения для «Сын» и не используется метод расширения «Сын», принимающий первый аргумент типа «PhoneApplication.MainPage» (вам не хватает использования директива или сборка?)

Где Phoneapplication - это имя приложения и основное пространство имен кода. Как бы это было не достаточно просто, я пытаюсь это сделать:

Это обычное свойство - это INT. Я знаю, что я объявил право зависимостей, так как VS разрешил мне скомпилировать. Каждый Pad имеет это настраиваемое свойство, хранящее int, и мне нужно получить его для доступа к элементу массива. Функция срабатывает так:

private void makeasound(object sender, MouseButtonEventArgs e) 
    { 
     int x = this.Son; 
     var sons = new[] { "sons/firstsound.wav", "sons/secondsound.wav", "sons/thirdsound.wav" }; 
     string target = sons[x]; 
     StreamResourceInfo info = Application.GetResourceStream(
     new Uri(target, UriKind.Relative)); 
     alarm = SoundEffect.FromStream(info.Stream); 
     Microsoft.Xna.Framework.FrameworkDispatcher.Update(); 
     alarm.Play(); 
    }  

Итак, я объявляю массив, хранящий URI для звуков, которые я хотел бы играть («сын» означает звук на французском, я из Бельгии). Затем я использую INT, связанный с элементом триггера, для доступа к URI звука, затем я воспроизвожу этот звук.

Причина, по которой я делаю это, заключается в том, что я хочу, чтобы пользователь менял значение INT для каждого пэда и поэтому выбирал, какой звук играет каждый пэд. Тот факт, что у меня нет выбора, кроме как объявлять этот массив каждый раз, когда вызывается функция (иначе это не в контексте) не очень изящно, но я думаю, что я могу жить с этим (массив будет содержать 50-60 элементов)

Итак, для тех, кто это читает, моя проблема заключается в использовании свойства запускающего события, которое кажется сложнее, когда это настраиваемое свойство. Я оставил логику, если бы у кого-то были советы.

Я благодарю всех, кто прочитал это сообщение, и кто может помочь мне разобраться в этом. Я читал онлайн-документацию, и у меня есть две хорошие книги C#, но я не нашел решение для меня. Имейте славный день.

EDIT: Некоторые другие готовы помочь, так вот декларация свойства зависимостей (Daniel К сожалению, не видел, как вы прокомментировали мой оригинальный пост)

namespace MyNamespace 
{ 

    public static class MyClass 
    { 


     public static readonly DependencyProperty SonProperty = DependencyProperty.RegisterAttached("Son", 
      typeof(string), typeof(MyClass), new PropertyMetadata(null)); 

     public static string GetSon(UIElement element) 
     { 
      if (element == null) 
       throw new ArgumentNullException("element"); 
      return (string)element.GetValue(SonProperty); 
     } 
     public static void SetSon(UIElement element, string value) 
     { 
      if (element == null) 
       throw new ArgumentNullException("element"); 
      element.SetValue(SonProperty, value); 
     } 
    } 

Mynamespace вложен в основной Пространство имен.

+0

Пожалуйста, покажите декларацию 'Son' и как вы установите его значение. –

+0

Оригинальное сообщение отредактировано –

ответ

3

this относится к текущему экземпляру MainPage. Не для пэда, который был нажат.Это sender:

var pad = (Pad)sender; 
var text = pad.Name; 
textBlock1.Text = text; 

Son является вложенное свойство, а не нормальный. Вы можете получить его значение, как это:

var pad = (Pad)sender; 
var son = MyClass.GetSon(pad); 

Пожалуйста, обратите внимание, что вы объявили его в качестве string. Видя, как вы хотите его использовать, кажется, имеет смысл объявить его как int.

+0

Большое спасибо, потому что это не упоминается ни в одной из двух книг, которые у меня есть. То, что вы написали, работает, но знаете ли вы, почему он не работает с пользовательскими свойствами? У меня все еще есть сообщение об ошибке, упомянутое сразу после третьего образца кода моего исходного сообщения ... Спасибо, в любом случае –

+0

@ user2062760: Пожалуйста, см. Обновленный ответ. –

+0

Спасибо! Я почти там ... пожалуйста, медведь со мной еще на секунду, и я положил «Зеленый чек» слева! VS говорит, что имя «MyClass» не существует в текущем контексте. Структура такова: сразу после функции, о которой мы говорим, появляется закрывающая фигурная скобка, которая заканчивается закрытым частным классом MainPage: PhoneApplicationPage. После этого это новое пространство имен, называемое -MyNamespace, а затем «MyClass» мы говорим около. Поэтому MyClass принадлежит MyNamespace, который вложен в основное пространство имен. Благодарим вас за то, что вы зашли так далеко –

0

this относится к экземпляру типа, в котором определяется метод, в данном случае MainPage. Если вы хотите получить экземпляр типа, вызвавшего событие, это то, что в параметре sender:

private void makeasound(object sender, MouseButtonEventArgs e) 
{ 
    textBlock1.Text = ((Pad)sender).Name; 
} 
+0

Спасибо. Он работает, как упоминалось выше, но не с настраиваемым свойством, созданным с помощью «метода зависимостей». Все еще упоминается ошибка. –

+0

@ user2062760 Тогда вы не набрасываете его на правильный тип. Мы не знаем, что это за тип. – Servy

+0

Свойство Custom называется «Son» и является строковым. Если я возьму код, предложенный выше, Даниэлем Хихартом и заменил «Имя» на «Сын», я получил сообщение об ошибке, и программа не компилирует ... зависимость объявляется внутри класса, который принадлежит пространству имен, вложенному внутри основное пространство имен. Может быть, я не понимаю, что вы говорите, «приведя его к правильному типу». Если да, скажите, пожалуйста. Спасибо в любом случае –

Смежные вопросы