SoftKeyboard.xaml 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <UserControl x:Class="ivf_tl_Operate.CustomUserControls.SoftKeyboard"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6. xmlns:local="clr-namespace:ivf_tl_Operate.CustomUserControls"
  7. mc:Ignorable="d"
  8. d:DesignWidth="760" d:DesignHeight="560">
  9. <!--
  10. M4-04-1 · 自绘内置软键盘(数字键盘 + 密码/全键盘)
  11. ====================================================================
  12. 取代 osk.exe 系统软键盘(需求 11)。两种模式由 KeyboardMode 切换:
  13. Number : 0-9 / 退格 / 清除 / 确定 —— 数字/参数输入(M4-04-5)。
  14. Password : 全键盘(字母+数字+常用符号)+ 退格/清除/Shift/确定 —— 登录账号/调试密码(M4-04-4)。
  15. 所有按键经统一事件路由到后台,后台仅发 KeyInput / RequestClose 事件,
  16. 由宿主(SoftKeyboardHost)写回目标 TextBox/PasswordBox —— 键盘本身不直接依赖任何页面。
  17. 按键尺寸 MinHeight/MinWidth 引用全局 TouchMinSize(=48)(M4-01-4),触控友好;
  18. 布局全用 Grid/UniformGrid 星号,不写死像素,随顶层 Viewbox(Uniform) 等比缩放(M4-01-1)。
  19. -->
  20. <UserControl.Resources>
  21. <!--
  22. 键盘按键隐式样式:统一触控基准、字号、间距与按下反馈,作用域仅本控件内的标准 Button
  23. (动态注入的全键盘按键同样命中)。MinHeight/MinWidth 引用全局 TouchMinSize(=48)(M4-01-4)。
  24. 标题栏「×」按显式 Width/Height 自带尺寸,本样式只补字号/反馈,不破坏其布局。
  25. -->
  26. <Style TargetType="{x:Type Button}">
  27. <Setter Property="MinHeight" Value="{StaticResource TouchMinSize}"/>
  28. <Setter Property="MinWidth" Value="{StaticResource TouchMinSize}"/>
  29. <Setter Property="Margin" Value="4"/>
  30. <Setter Property="FontSize" Value="32"/>
  31. <Setter Property="FontWeight" Value="Medium"/>
  32. <Setter Property="Stylus.IsPressAndHoldEnabled" Value="False"/>
  33. <Style.Triggers>
  34. <Trigger Property="IsPressed" Value="True">
  35. <Setter Property="Opacity" Value="0.75"/>
  36. </Trigger>
  37. </Style.Triggers>
  38. </Style>
  39. </UserControl.Resources>
  40. <Border Background="#FFF7F8FA" BorderBrush="#FFB0B4B9" BorderThickness="2" CornerRadius="16" Padding="16">
  41. <Grid>
  42. <Grid.RowDefinitions>
  43. <RowDefinition Height="Auto"/>
  44. <RowDefinition Height="*"/>
  45. </Grid.RowDefinitions>
  46. <!-- 标题栏:当前输入回显(密码模式按掩码显示) + 关闭 -->
  47. <Grid Grid.Row="0" Margin="4 0 4 12">
  48. <Grid.ColumnDefinitions>
  49. <ColumnDefinition Width="*"/>
  50. <ColumnDefinition Width="Auto"/>
  51. </Grid.ColumnDefinitions>
  52. <Border Grid.Column="0" Background="White" BorderBrush="#FFD0D4D9" BorderThickness="1" CornerRadius="8" MinHeight="56">
  53. <TextBlock x:Name="_preview" Text="" FontSize="32" Foreground="#FF333333"
  54. VerticalAlignment="Center" Margin="16 0" TextTrimming="CharacterEllipsis"/>
  55. </Border>
  56. <Button Grid.Column="1" Content="×" FontSize="40" Width="56" Height="56" Margin="12 0 0 0"
  57. Background="#FFB0B4B9" Foreground="White" BorderThickness="0"
  58. Click="Close_Click"/>
  59. </Grid>
  60. <!-- ===== 数字键盘(KeyboardMode=Number,默认显示) ===== -->
  61. <!-- 4 行 × 4 列:左 3 列为 0-9,右 1 列为 退格/清除/确定 -->
  62. <Grid x:Name="_numberPad" Grid.Row="1">
  63. <Grid.RowDefinitions>
  64. <RowDefinition Height="*"/>
  65. <RowDefinition Height="*"/>
  66. <RowDefinition Height="*"/>
  67. <RowDefinition Height="*"/>
  68. </Grid.RowDefinitions>
  69. <Grid.ColumnDefinitions>
  70. <ColumnDefinition Width="*"/>
  71. <ColumnDefinition Width="*"/>
  72. <ColumnDefinition Width="*"/>
  73. <ColumnDefinition Width="*"/>
  74. </Grid.ColumnDefinitions>
  75. <Button Grid.Row="0" Grid.Column="0" Content="1" Tag="1" Click="Key_Click"/>
  76. <Button Grid.Row="0" Grid.Column="1" Content="2" Tag="2" Click="Key_Click"/>
  77. <Button Grid.Row="0" Grid.Column="2" Content="3" Tag="3" Click="Key_Click"/>
  78. <Button Grid.Row="0" Grid.Column="3" Content="⌫" Background="#FFD0B070" Foreground="White" Click="Back_Click"/>
  79. <Button Grid.Row="1" Grid.Column="0" Content="4" Tag="4" Click="Key_Click"/>
  80. <Button Grid.Row="1" Grid.Column="1" Content="5" Tag="5" Click="Key_Click"/>
  81. <Button Grid.Row="1" Grid.Column="2" Content="6" Tag="6" Click="Key_Click"/>
  82. <Button Grid.Row="1" Grid.Column="3" Content="清除" Background="#FFE0A0A0" Foreground="White" Click="Clear_Click"/>
  83. <Button Grid.Row="2" Grid.Column="0" Content="7" Tag="7" Click="Key_Click"/>
  84. <Button Grid.Row="2" Grid.Column="1" Content="8" Tag="8" Click="Key_Click"/>
  85. <Button Grid.Row="2" Grid.Column="2" Content="9" Tag="9" Click="Key_Click"/>
  86. <!-- 确定:占数字键盘右列下两行 -->
  87. <Button Grid.Row="2" Grid.RowSpan="2" Grid.Column="3" Content="确定" Background="#FF4D75AC" Foreground="White" Click="Enter_Click"/>
  88. <Button Grid.Row="3" Grid.Column="0" Content="." Tag="." Click="Key_Click"/>
  89. <Button Grid.Row="3" Grid.Column="1" Content="0" Tag="0" Click="Key_Click"/>
  90. <Button Grid.Row="3" Grid.Column="2" Content="-" Tag="-" Click="Key_Click"/>
  91. </Grid>
  92. <!-- ===== 全键盘/密码键盘(KeyboardMode=Password 时显示) ===== -->
  93. <Grid x:Name="_fullPad" Grid.Row="1" Visibility="Collapsed">
  94. <Grid.RowDefinitions>
  95. <RowDefinition Height="*"/>
  96. <RowDefinition Height="*"/>
  97. <RowDefinition Height="*"/>
  98. <RowDefinition Height="*"/>
  99. <RowDefinition Height="*"/>
  100. </Grid.RowDefinitions>
  101. <!-- 第1行:数字 1234567890(运行时注入按键) -->
  102. <UniformGrid x:Name="_rowDigits" Grid.Row="0" Rows="1" Columns="10"/>
  103. <!-- 第2行:qwertyuiop -->
  104. <UniformGrid x:Name="_rowQ" Grid.Row="1" Rows="1" Columns="10"/>
  105. <!-- 第3行:asdfghjkl -->
  106. <UniformGrid x:Name="_rowA" Grid.Row="2" Rows="1" Columns="9"/>
  107. <!-- 第4行:Shift + zxcvbnm + 退格 -->
  108. <Grid Grid.Row="3">
  109. <Grid.ColumnDefinitions>
  110. <ColumnDefinition Width="1.5*"/>
  111. <ColumnDefinition Width="7*"/>
  112. <ColumnDefinition Width="1.5*"/>
  113. </Grid.ColumnDefinitions>
  114. <Button Grid.Column="0" x:Name="_shiftBtn" Content="⇧" Background="#FFB0B4B9" Foreground="White" Click="Shift_Click"/>
  115. <UniformGrid x:Name="_rowZ" Grid.Column="1" Rows="1" Columns="7"/>
  116. <Button Grid.Column="2" Content="⌫" Background="#FFD0B070" Foreground="White" Click="Back_Click"/>
  117. </Grid>
  118. <!-- 第5行:清除 + 空格 + 确定 -->
  119. <Grid Grid.Row="4">
  120. <Grid.ColumnDefinitions>
  121. <ColumnDefinition Width="2*"/>
  122. <ColumnDefinition Width="6*"/>
  123. <ColumnDefinition Width="2*"/>
  124. </Grid.ColumnDefinitions>
  125. <Button Grid.Column="0" Content="清除" Background="#FFE0A0A0" Foreground="White" Click="Clear_Click"/>
  126. <Button Grid.Column="1" Content="空格" Tag=" " Click="Key_Click"/>
  127. <Button Grid.Column="2" Content="确定" Background="#FF4D75AC" Foreground="White" Click="Enter_Click"/>
  128. </Grid>
  129. </Grid>
  130. </Grid>
  131. </Border>
  132. </UserControl>