1

TL;博士;

1.在 WPF 中,我如何显示键符号(例如退格键,以及我将发明的自定义符号),以便它们与其他键上的字母和数字无缝对齐?

2.如何对这些按键上的文字应用发光效果,使字母、数字和符号(例如退格)以相同的方式发光?

更长的版本;

我正在 WPF 中编写一个屏幕键盘,使用 Border 作为每个键的轮廓,并使用 TextBlock 来显示文本,例如“A”键可能定义为;

<Border>
  <Border.Tag>
    <KeyValue Key="A" Function="{x:Null}" />
  </Border.Tag>
  <TextBlock Text="A" />
</Border>

功能键,例如退格键,可能是;

<Border>
  <Border.Tag>
    <KeyValue Key="{x:Null}" Function="{x:Static Functions.Backspace}" />
  </Border.Tag>
  <TextBlock Text="BACKSPACE" />
</Border>

对于 Return、Backspace、Shift、Caps Lock 等特殊键,我更喜欢显示一个符号,例如 ⏎ 而不是“Return”/“Enter”。我也有自定义键,它需要一个在 unicode 字符列表中不存在的自定义字符。

我发现 Unicode 包含标准字符的定义(查看下面的链接,如果您不向下滚动太多并导致浏览器崩溃,该链接非常有用);

http://unicode-table.com/en/search/?q=return

例如,这给了我 ⏎ = U+23CE 或 ⏎ 用于返回。

我的问题:

  1. 我将使用可能不包含这些扩展字符的字体。本文建议大多数字体只覆盖unicode中的核心字符;

http://www.typography.com/faq/question.php?faqID=41

  1. 我想使用自定义符号(我将发明),所以 unicode 字符无论如何都不能完全满足我的要求。

  2. 如果我沿着为符号创建矢量图形的路线走下去,我不确定从哪里开始。它们需要支持所有键(字母、数字和符号)上都会出现的发光动画,并且会在“按下”键时触发。在 .Net 3.5 之后,BitmapEffects 在软件渲染时被淘汰了。下面的文章建议使用 DropShadowEffect - 我应该如何创建符号以便我可以使用相同的方法使按键发光?

没有 BitmapEffects 的 OuterGlowBitmapEffect 替代方案

感谢您的阅读和您提供的任何帮助。朱利叶斯

已编辑以包含一个更清晰的示例,说明键值如何存储在键标签中。

4

2 回答 2

1

这取决于您如何处理按键事件。

  • 如果您要绑定到命令,那么您可以使用命令参数来控制键值实际上是什么,从而将其与显示的内容分开。
  • 或者,如果在事件处理程序中执行此操作 - 使用按钮属性,例如您可以在处理程序中检查的标记。

然后用可以代表您的自定义键的其他内容替换您的文本框按钮内容,图像会起作用 - 路径会更好,因为它将支持应用于您的文本框的相同效果。

于 2014-07-17T14:49:17.770 回答
1

对于视觉内容,我会考虑添加图标图像

<Geometry x:Key="appbar_user_path">
    F1 M 24,12C 27.5,12 29,14 28.4952,18.1979C 28.9462,18.4566 29.25,18.9428 29.25,19.5C 29.25,20.1818 28.7951,20.7574 28.1723,20.9397C 27.9121,21.8672 27.508,22.6882 27,23.3449L 27,26.5C 28.6667,26.8333 30,27 32,28C 34,29 34.6667,29.9167 36,31.25L 36,36L 12,36L 12,31.25C 13.3333,29.9167 14,29 16,28C 18,27 19.3333,26.8333 21,26.5L 21,23.3449C 20.492,22.6882 20.0879,21.8672 19.8277,20.9397C 19.2049,20.7574 18.75,20.1818 18.75,19.5C 18.75,18.9428 19.0538,18.4566 19.5048,18.1979C 19,14 20.5,12 24,12 Z
</Geometry>

对于屏幕键盘,我认为您需要深入研究TextCompositionManager帮助 WPF TextCompositionManager 事件

static void SendTextCompenstation( string key )
{
    var textcomp = new TextComposition( InputManager.Current, UiControl, key );
    TextCompositionManager.StartComposition( textcomp );
}
于 2014-07-17T15:26:38.933 回答