';这';在一个事件中
本文关键字:一个 事件 | 更新日期: 2023-09-27 17:59:38
我需要检索触发此上下文中事件的元素的某些属性:
SoundEffect alarm;
public MainPage()
{
InitializeComponent();
Pad1.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound);
Pad2.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound);
Pad3.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound);
}
Pad1,2和3是我xaml中的一些Ellipse的名称。现在,如果我尝试在事件执行的代码中这样做(在上面的示例代码之后立即声明):
private void makeasound(object sender, MouseButtonEventArgs e)
{
string text = this.Name;
textBlock1.Text = text;
}
文本块变为空,所以我想触发元素的名称永远不会到达那里。
现在,如果我试图检索一个名为"Son"的"pads"的自定义属性,它是用依赖方法声明的,它是一个字符串,就像这样:
private void makeasound(object sender, MouseButtonEventArgs e)
{
string text = this.Son;
textBlock1.Text = text;
}
VS报告错误:
"PhoneApplication.MainPage"不包含"Son"的定义,也找不到接受类型为"PhoneApp.MainPage"的第一个参数的扩展方法"Son)(是否缺少using指令或程序集引用?)
其中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("son"在法语中的意思是声音,我来自比利时)。然后,我使用与触发元素相关的INT来访问声音的URI,然后播放这个声音。
我这样做的原因是,我想让用户更改每个键盘的INT值,从而选择每个键盘播放的声音。事实上,我似乎别无选择,只能在每次调用函数时声明这个数组(否则它就不在上下文中),这不是很优雅,但我想我可以接受(数组中有50-60个元素)
所以,对于那些读到这里的人来说,我的问题是使用触发事件的属性,当它是自定义属性时,这似乎更难。我把剩下的逻辑放在一边,以防有人提出建议。
我感谢任何读过这条消息的人,他们可能会帮助我解决这个问题。我阅读了在线文档,有两本很好的c#书,但我还没有找到适合我的解决方案。祝你今天愉快。
编辑:其他一些人愿意提供帮助,所以这里是依赖属性的声明(对不起,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
嵌套在主命名空间中。
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
似乎更有意义。
this
是指在MainPage
中定义方法的类型的实例。如果您想获得触发事件的类型的实例,那么sender
参数中就是这样的:
private void makeasound(object sender, MouseButtonEventArgs e)
{
textBlock1.Text = ((Pad)sender).Name;
}