WPF 实现自定义数字输入弹窗

发布于:2025-06-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

1.前端代码实现

 <Grid>
     <Grid.RowDefinitions>
         <RowDefinition Height="100" />
         <RowDefinition Height="*" />
     </Grid.RowDefinitions>

     <Border
         Grid.Row="0"
         BorderBrush="WhiteSmoke"
         BorderThickness="0.1">
         <DockPanel>
             <WrapPanel
                 Margin="5,10,0,0"
                 VerticalAlignment="Center"
                 DockPanel.Dock="Top">
                 <Label
                     VerticalContentAlignment="Center"
                     Content="Input:"
                     FontSize="22"
                     Foreground="{DynamicResource Skin-TextColor}" />
                 <TextBox
                     x:Name="TextBox_Value"
                     Width="200"
                     Margin="5,0,0,0"
                     FontSize="20"
                     PreviewTextInput="TextBox_PreviewTextInput" />
             </WrapPanel>
             <WrapPanel
                 Margin="10,0,0,0"
                 VerticalAlignment="Center"
                 DockPanel.Dock="Top">

                 <Button
                     x:Name="Button_Clear"
                     Margin="5"
                     Click="Button_Clear_Click"
                     Content="Clear"
                     Style="{DynamicResource btn-primary}" />
                 <Button
                     x:Name="Button_Del"
                     Margin="5"
                     Click="Button_Del_Click"
                     Content="Del"
                     Style="{DynamicResource btn-primary}" />
                 <Button
                     x:Name="Button_Cancel"
                     Margin="5"
                     Click="Button_Cancel_Click"
                     Content="Cancel"
                     Style="{DynamicResource btn-primary}" />
                 <Button
                     x:Name="Button_OK"
                     Margin="5"
                     Click="Button_OK_Click"
                     Content="OK"
                     Style="{DynamicResource btn-primary}" />
             </WrapPanel>
         </DockPanel>
     </Border>

     <Border
         Grid.Row="1"
         BorderBrush="WhiteSmoke"
         BorderThickness="0.1">
         <Grid>
             <Grid.RowDefinitions>
                 <RowDefinition />
                 <RowDefinition />
                 <RowDefinition />
                 <RowDefinition />
             </Grid.RowDefinitions>
             <Grid.ColumnDefinitions>
                 <ColumnDefinition />
                 <ColumnDefinition />
                 <ColumnDefinition />

             </Grid.ColumnDefinitions>

             <Button
                 Grid.Row="0"
                 Grid.Column="0"
                 Click="Button_Click"
                 Content="7"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="0"
                 Grid.Column="1"
                 Click="Button_Click"
                 Content="8"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="0"
                 Grid.Column="2"
                 Click="Button_Click"
                 Content="9"
                 Style="{DynamicResource ButtonSizeAdaptive}" />

             <Button
                 Grid.Row="1"
                 Grid.Column="0"
                 Click="Button_Click"
                 Content="4"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="1"
                 Grid.Column="1"
                 Click="Button_Click"
                 Content="5"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="1"
                 Grid.Column="2"
                 Click="Button_Click"
                 Content="6"
                 Style="{DynamicResource ButtonSizeAdaptive}" />

             <Button
                 Grid.Row="2"
                 Grid.Column="0"
                 Click="Button_Click"
                 Content="1"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="2"
                 Grid.Column="1"
                 Click="Button_Click"
                 Content="2"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="2"
                 Grid.Column="2"
                 Click="Button_Click"
                 Content="3"
                 Style="{DynamicResource ButtonSizeAdaptive}" />

             <Button
                 Grid.Row="3"
                 Grid.Column="0"
                 Click="Button_Click"
                 Content="0"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="3"
                 Grid.Column="1"
                 Click="Button_Click"
                 Content="."
                 Style="{DynamicResource ButtonSizeAdaptive}" />
             <Button
                 Grid.Row="3"
                 Grid.Column="2"
                 Click="Button_Click"
                 Content="-"
                 Style="{DynamicResource ButtonSizeAdaptive}" />
         </Grid>
     </Border>
 </Grid>

2.后端代码实现

/// <summary>
/// DigitalInputWindow.xaml 的交互逻辑
/// </summary>
public partial class DigitalInputWindow : Window
{
    public DigitalInputWindow(string value = "")
    {
        try
        {
            InitializeComponent();
            TextBox_Value.Text = value;
            TextBox_Value.SelectionStart = value.Length;
            TextBox_Value.Focus();
        }
        catch
        {

        }
    }

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {

    }
    #region 值输入
    /// <summary>
    /// 确定
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_OK_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (TextBox_Value.Text.Trim().EndsWith("."))
            {
                TextBox_Value.Text = TextBox_Value.Text.Trim().Substring(0, TextBox_Value.Text.Trim().Length - 1);
            }
            if (!double.TryParse(TextBox_Value.Text, out double value))
            {
                MessageWindow messageWindow = new MessageWindow();
                messageWindow.Init("Error", "It's not a numerical value");
                messageWindow.Show();
            }
            else
            {
                this.DialogResult = true;
                this.Close();
            }
        }
        catch
        {

        }
    }
    /// <summary>
    /// 取消
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Cancel_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
        this.Close();
    }
    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Del_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (TextBox_Value.Text.Trim().Length > 0)
            {
                TextBox_Value.Text = TextBox_Value.Text.Substring(0, TextBox_Value.Text.Trim().Length - 1);
            }
        }
        catch
        {

        }
    }
    /// <summary>
    /// 清空
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Clear_Click(object sender, RoutedEventArgs e)
    {
        TextBox_Value.Text = string.Empty;
    }
    /// <summary>
    /// 限制输入数字
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        try
        {
            Regex re = new Regex("[^0-9.-]+");
            e.Handled = re.IsMatch(e.Text);
        }
        catch
        {

        }
    }

    #endregion
    /// <summary>
    /// 数字输入
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            Button but = sender as Button;
            string value = but.Content.ToString();
            //TextBox_Value.Text += value;
            int cursorPos = TextBox_Value.SelectionStart;
            TextBox_Value.Text = TextBox_Value.Text.Insert(cursorPos, value);
            TextBox_Value.SelectionStart = cursorPos + value.Length;
            TextBox_Value.Focus();
        }
        catch 
        {

        }
    }
    /// <summary>
    /// 返回值
    /// </summary>
    /// <returns></returns>
    public string GetValue()
    {
        return TextBox_Value.Text;
    }
}

3.效果
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到