SoftKeyboard.xaml 8.9 KB

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