мне нужно, чтобы получить некоторое свойство элемента, которые вызывают событие в этом контексте:Использование «это» в случае
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
вложен в основной Пространство имен.
Пожалуйста, покажите декларацию 'Son' и как вы установите его значение. –
Оригинальное сообщение отредактировано –