[WPF][UserControl] 之 热键设置控件(HotKeySettingControl)
在做设置面板的时候,经常需要一个可以用来设置热键的控件,记下当初实现这个控件的过程吧。。。
热键设置控件界面分为两个部分,描述文本与热键输入框,分别使用Label与TextBox控件,置于StackPanel中,
XAML代码如下:
<StackPanel Orientation="Horizontal">
<Label Name="label" Width="100" HorizontalContentAlignment="Right"></Label>
<TextBox Name="textbox" Width="100" PreviewKeyDown="textbox_PreviewKeyDown"></TextBox>
</StackPanel>
PreviewKeyDown事件处理如下:
private void textbox_PreviewKeyDown(object sender, KeyEventArgs e)
{
string keyString = e.Key.ToString(); //keyString 既获得的按键描述
SettingKey(keyString); //存储按键
e.Handled = true;
}
为了能够在XAML中直接使用该控件并设置热键描述文本,增加了Text方法用以设置控件描述
public string Text
{
get
{
return label.Content.ToString();
}
set
{
label.Content = value;
}
}
刚开始在使用 Text="some text..." 方式设置文本时并没有出现问题,
但是在接下来使用DynamicResource方式使用多国语言时出现了问题,编译器提示应使用DependencyProperty进行操作,于是开始手忙脚乱开始Google DependencyProperty是什么东西。。。
使用DependencyProperty实现的Text属性如下:
View Code
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text", //要注册的属性名
typeof(string), //属性数据类型
typeof(HotKeySettingControl), //父对象类型
new FrameworkPropertyMetadata(
"", //默认值
new PropertyChangedCallback(TextPropertyChangedCallback) //属性改变时触发
)
);
static void TextPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
HotKeySettingControl ctl = d as HotKeySettingControl;
ctl.label.Content = e.NewValue as string;
}
public string Text
{
get { return GetValue(TextProperty) as string; }
set { SetValue(TextProperty, value); }
}
最终运行效果如下: