写了一个简单的播放器,把上下键设置为音量的快捷键,但是按下这两个键的时候Listbox的选择项也会发生改变(如果listbox中没有选中任何一项的话则不会更改。)
于是就想办法把这个keyDowm事件给搞掉,百度了都是给重新处理keyDowm事件,没有达到想要的效果。
这里的关键在于KeyDowm中的e.Handled:bool 获取或设置一个值,指示路由事件的处理状态(详细的说明自己用vs看)。
但是,我们在listbox中加入KeyDowm事件,设置e.Handled=true,这是没有效果的,按上下键他该干嘛还是干嘛。
这里的原因我自己觉得大概是这么回事:
这个listbox“天生”就有使用“上”、“下”(其他的键没试过,不知道有没有哈)的本事,你在代码中给他加一个KeyDowm处理事件,当我按下“上/下”键的时候,他就先使用了他的天生本事,然后再执行你在事件中让他做的事情,所以,人家本事都使出来了,这时候你再设置再告诉人家,这个KeyDowm事件不用做了,这还有意义么?
基于上面的想法,我就想到了给listbox创造一个儿子(至于为什么不是女儿……),把listbox的本事给改造一下再传给他儿子。于是,请看下面代码(哈哈,代码就几句却被我扯了这么多,我真佩服我自己!):
好了,下面我们解决问题,新建一个类,继承System.Windows.Controls.ListBox
public class ListBox : System.Windows.Controls.ListBox
{
//这里把KeyDowm事件给设置为已处理。你在页面中在添加KeyDowm事件,它是不认账的了,就比如说:你都做了那我还用做?
protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
{
e.Handled = true;
}
}
然后,在页面中就不要用系统的listbox了,用你自己写的这个。
最后,上面提到的原因也不知道正确与否,哪位前辈高人看到,希望指点一二。