65.9K
CodeProject 正在变化。 阅读更多。
Home

多语言 Silverlight 虚拟键盘

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (7投票s)

2009年7月10日

CPOL

2分钟阅读

viewsIcon

52204

downloadIcon

3020

一个多语言 Silverlight 虚拟键盘。

keyboard.png

引言

对于我的一个 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="&quot;">'</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="&lt;">,</Key>
            <Key shift="&gt;" 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 键时一个键应该如何更改其值,这同样适用于altdk(Ctrl)。

用法

可以在 Silverlight 应用程序和 HTML 页面上直接使用该控件。键盘控件可以在两种模式下运行 – 有可见的“工具栏”或没有。在工具栏中,我们有一个 Silverlight 文本框、两个按钮(确定和取消)以及一个布局选择器

toolbar.png

如果希望将键盘作为模式对话框运行,用户可以在其中编辑其输入然后将其提交给应用程序,那么此“工具栏”很有用。通过动态更改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 处理程序对象,该对象应该具有SetTextGetCurrentText方法

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。
© . All rights reserved.