多语言 Silverlight 虚拟键盘






4.75/5 (7投票s)
一个多语言 Silverlight 虚拟键盘。
引言
对于我的一个 Web 项目,我需要一个可以使用支持多语言的虚拟键盘的可能性。有很多不同的解决方案使用 JavaScript,而使用 WPF 和 Silverlight 的则少得多。到目前为止,我还没有见过一个 Silverlight 键盘控件可以支持不同的语言,所以我不得不自己实现一个。
我的实现易于定制,您可以添加任意数量的键盘布局,甚至可以自定义您自己的布局。由于这是我第一次尝试实现这样的控件,因此存在许多限制。例如,它不支持中文或其他更复杂的布局。为了使控件尽可能轻量级,我决定仅使用XmlReader
进行 XML 序列化。
Layouts
键盘布局是使用嵌入式 XML 文件定义的。布局定义让您可以完全控制键盘在屏幕上的呈现方式。例如,让我们以一个简化的布局定义为例
<keyboard language="English" culture="EN" all="false">
<Rows>
<KeyboardRow>
<Key shift="~">`</Key>
<Key shift="|">\</Key>
</KeyboardRow>
<KeyboardRow>
<Key>q</Key>
<Key shift="}">]</Key>
</KeyboardRow>
<KeyboardRow>
<Key>a</Key>
<Key shift=""">'</Key>
</KeyboardRow>
<KeyboardRow>
<Key>z</Key>
<Key shift="?">/</Key>
</KeyboardRow>
</Rows>
</keyboard>
使用属性all
,我们控制特殊键将如何添加到键盘;如果它是false
,则控件将在其默认位置呈现所有特殊键,或者,如果您需要完全控制布局,则应将其设置为true
并手动控制特殊键的位置
<keyboard language="Custom English" culture="EN" all="true">
<Rows>
<KeyboardRow>
<TabKey></TabKey>
<Key>q</Key>
<Key style="regularButton">w</Key>
<Key>e</Key>
<BackspaceKey style="longButtonFirst"></BackspaceKey>
</KeyboardRow>
<KeyboardRow>
<CapsLockKey></CapsLockKey>
<Key>f</Key>
<Key style="regularButton">g</Key>
<Key>h</Key>
<DeleteKey style="longButtonFirst"></DeleteKey>
</KeyboardRow>
<KeyboardRow>
<ShiftKey></ShiftKey>
<Key shift="<">,</Key>
<Key shift=">" style="regularButton">.</Key>
<Key shift="?">/</Key>
<EnterKey></EnterKey>
</KeyboardRow>
<KeyboardRow>
<CtrlKey></CtrlKey>
<AltKey></AltKey>
<SpaceKey style="regularButton"></SpaceKey>
<AltKey></AltKey>
<CtrlKey style="longButtonFirst">CCC</CtrlKey>
</KeyboardRow>
</Rows>
</keyboard>
每个键可以有多个属性分配给它。 style
允许选择用于呈现它的 XAML 样式,shift
允许您控制当按下 Shift 键时一个键应该如何更改其值,这同样适用于alt
和dk
(Ctrl)。
用法
可以在 Silverlight 应用程序和 HTML 页面上直接使用该控件。键盘控件可以在两种模式下运行 – 有可见的“工具栏”或没有。在工具栏中,我们有一个 Silverlight 文本框、两个按钮(确定和取消)以及一个布局选择器
如果希望将键盘作为模式对话框运行,用户可以在其中编辑其输入然后将其提交给应用程序,那么此“工具栏”很有用。通过动态更改VisibleHelperControls
属性,您可以显示或隐藏它。您可以通过多种方式与键盘控件通信。例如,您可以使用KeyPressed
事件访问它
function PluginLoaded(sender, args) {
var slCtl = document.getElementById("Xaml1");
slCtl.Content.silverKeyboard.addEventListener("KeyPressed", HandleTxtClick));
}
function HandleTxtClick(sender, args) {
alert("You clicked: " + args.PressedKey);
}
或者,您可以创建一个 JavaScript 处理程序对象,该对象应该具有SetText
和GetCurrentText
方法
Keyboard.Handler.prototype =
{
visibleToolbar: false,
inputControl: null,
Select: function(sender) {
this.inputControl = sender;
},
SetText: function(isOk, newText) {
if (this.handleEachClick || !this.inputControl ||
!newText || !isOk) return;
this.inputControl.value = newText;
},
GetCurrentText: function() {
if (this.inputControl)
return this.inputControl.value;
return '';
}
}
var keyboard = null;
if (!keyboard) keyboard = new Keyboard.Handler();
function PluginLoaded(sender, args) {
var slCtl = document.getElementById("Xaml1");
slCtl.Content.silverKeyboard.KeyboardHandler = "keyboard"
}
当按下键盘上的“确定”或“取消”按钮时,将调用方法SetText
,因此要使用此功能,您必须使工具栏可见。如果要从 Silverlight 应用程序中使用键盘控件,则应访问该控件的Logic
属性,该属性公开所有必需的事件和属性。
历史
- 2009年7月10日:版本 1.0。