';这';在一个事件中

本文关键字:一个 事件 | 更新日期: 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;
}