我需要检索在此上下文中触发事件的元素的某些属性:
SoundEffect alarm;
public MainPage()
{
InitializeComponent();
Pad1.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound);
Pad2.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound);
Pad3.MouseLeftButtonUp += new MouseButtonEventHandler(makeasound);
}
Pad1,2 和 3 是我的 xaml 中一些椭圆的名称。现在,如果我尝试在事件执行的代码中执行此操作(在上面的示例代码之后立即声明):
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”的定义,并且找不到接受“PhoneApplication.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(“儿子”在法语中表示声音,我来自比利时)。然后我使用与触发元素关联的 INT 来访问声音的 URI,然后播放这个声音。
我这样做的原因是因为我想让用户更改每个打击垫的 INT 值,从而选择每个打击垫播放的声音。我似乎别无选择,只能在每次调用函数时声明这个数组(否则它不在上下文中)不是很优雅,但我想我可以忍受(数组中将有 50-60 个元素)
所以,对于那些读到这里的人,我的问题是使用触发事件的属性,当它是自定义属性时,这似乎更难。我把其余的逻辑放在一边,以防有人有建议。
我感谢任何阅读此消息并可能帮助我解决此问题的人。我阅读了在线文档,并且有两本不错的 c# 书籍,但我还没有找到适合我的解决方案。祝你今天过得愉快。
编辑:其他一些人愿意提供帮助,所以这里是依赖属性的声明(对不起,丹尼尔,没有看到你评论我的原始帖子)
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
嵌套在主命名空间内。