0

我需要检索在此上下文中触发事件的元素的某些属性:

 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嵌套在主命名空间内。

4

2 回答 2

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.

于 2013-02-14T16:16:16.053 回答
0

this指在其中定义方法的类型的实例,在本例中为MainPage. 如果您想获取触发事件的类型的实例,这就是sender参数中的内容:

private void makeasound(object sender, MouseButtonEventArgs e)
{
    textBlock1.Text = ((Pad)sender).Name;
}  
于 2013-02-14T16:17:41.673 回答