Jam*_*lak 1 c# linq wpf keyboard-shortcuts
我正在使用WPF创建一个选项对话框,列出可能的键,以便用户可以分配程序的热键.我试图将System.Windows.Forms.Keys枚举的所有可能值过滤到AZ和F1-F12,然后将该列表绑定到ComboBox.
到目前为止,这是我的代码:
Regex filter = new Regex("(^[A-Z]$)|(^F[0-9]{1,2}$)");
IEnumerable<Key> keyList = from x in (IEnumerable<Key>)Enum.GetValues(typeof(Keys))
where filter.Match(x.ToString()).Success
select x;
keys.DataContext = keyList;
Run Code Online (Sandbox Code Playgroud)
执行此操作后,keyList包含字母"A"两次,并且缺少字母"P"到"U".我不知道为什么.
如果有更好的方法,我也对替代方法感兴趣.
你有两个错别字 - 你使用System.Windows.Input.Key
而不是System.Windows.Forms.Keys
两次.多么不幸的错字!我建议除非你真的需要在同一个文件中使用WinForms和WPF的指令,否则你要避免在那里使用它们.
这是一个简短但完整的示例(基于您的代码,但修正了错别字):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
class Test
{
static void Main()
{
Regex filter = new Regex("(^[A-Z]$)|(^F[0-9]{1,2}$)");
IEnumerable<Keys> keyList =
from x in (IEnumerable<Keys>) Enum.GetValues(typeof(Keys))
where filter.Match(x.ToString()).Success
select x;
foreach (var key in keyList)
{
Console.WriteLine(key);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用显式类型的范围变量更轻松地编写查询表达式:
IEnumerable<Keys> keyList = from Keys x in Enum.GetValues(typeof(Keys))
where filter.Match(x.ToString()).Success
select x;
Run Code Online (Sandbox Code Playgroud)
或者使用点符号开头:
var keyList = Enum.GetValues(typeof(Keys))
.Cast<Keys>()
.Where(x => filter.Match(x.ToString()).Success);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用Unconstrained Melody并获得一个强类型列表:
var keyList = Enums.GetValues<Keys>()
.Where(x => filter.Match(x.ToString()).Success);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1395 次 |
最近记录: |