wpf--通过Popup弹出自定义输入“键盘“的实现

53 篇文章 3 订阅

wpf之Popup弹出自定义输入"键盘"
在很多工厂的信息化MES系统中,车间的采集数据的机器是触摸屏电脑(工厂环境所限,用外接鼠标键盘反而不方便)。

由于没有外接键盘,所以用户无法像坐在办公室一样,用鼠标键盘进行录入信息。

这时我们可以用wpf的Popup控件,当点击一个"文本框"时,弹出一个自定义的键盘(UserControl),实现如下图效果:
在这里插入图片描述
自定义用户控件(UserControl),“键盘”:

<UserControl.Resources>

</UserControl.Resources>

<Grid.RowDefinitions>




</Grid.RowDefinitions>
<Grid.ColumnDefinitions>



</Grid.ColumnDefinitions>

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace PopupDemo
{
///
/// NumericKeyboard.xaml 的交互逻辑
///
public partial class NumericKeyboard : UserControl
{
public NumericKeyboard()
{
InitializeComponent();
}
public bool HasMaxValue
{
get { return (bool)GetValue(HasMaxValueProperty); }
set { SetValue(HasMaxValueProperty, value); }
}

    // Using a DependencyProperty as the backing store for HasMaxValue.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty HasMaxValueProperty =
        DependencyProperty.Register("HasMaxValue", typeof(bool), typeof(NumericKeyboard), new UIPropertyMetadata(true));



    public int MaxValue
    {
        get { return (int)GetValue(MaxValueProperty); }
        set { SetValue(MaxValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MaxValue.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MaxValueProperty =
        DependencyProperty.Register("MaxValue", typeof(int), typeof(NumericKeyboard), new UIPropertyMetadata(0));



    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(int), typeof(NumericKeyboard), new UIPropertyMetadata(0));



    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsChecked.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.Register("IsChecked", typeof(bool), typeof(NumericKeyboard), new UIPropertyMetadata(false));


    private void btnMin_Click(object sender, RoutedEventArgs e)
    {
        //if (Item != null && Item.Quantity1 > 0)
        //{
        //    Item.Quantity2 = Item.Quantity1;
        //}
        Value = 0;
    }

    private void AddNumber(int num)
    {
        //if (Item != null)
        //{
        //    int cnt = Item.Quantity2 * 10 + num;
        //    if (Item.Quantity1 > 0 && cnt > Item.Quantity1)
        //    {
        //        Item.Quantity2 = Item.Quantity1;
        //    }
        //    else
        //    {
        //        Item.Quantity2 = cnt;
        //    }
        //}
        if (HasMaxValue)
        {
            Value = Math.Min(MaxValue, Value * 10 + num);
        }
        else
        {
            Value = Value * 10 + num;
        }
    }


    private void button2_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(2);
    }

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(3);
    }

    private void button4_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(4);
    }

    private void button5_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(5);
    }

    private void button6_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(6);
    }

    private void button7_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(7);
    }

    private void button8_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(8);
    }

    private void button9_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(9);
    }

    private void button0_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(0);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        AddNumber(1);
    }

    private void btnClose_Click(object sender, RoutedEventArgs e)
    {
        IsChecked = false;
    }

}

}
主窗体:

Xaml:

<Window.Resources>

</Window.Resources>

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace PopupDemo
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window,INotifyPropertyChanged
{
private int terminalNo;

    public int TerminalNo
    {
        get { return terminalNo; }
        set 
        {
            if(value!=terminalNo)
            {
                terminalNo = value;
                OnPropertyChanged("TerminalNo");
            }
        }
    }
    

    public MainWindow()
    {
        InitializeComponent();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private void btnShow_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(string.Format("终端编号的值为{0}", TerminalNo));
    }
}

}
验证输入后,绑定TextBlock的Text属性上值是否真的变化了:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
WPF(Windows Presentation Foundation)是微软推出的一种用于创建Windows应用程序的框架。在WPF中,我们可以通过自定义输入键盘实现用户输入的个性化。 首先,我们需要创建一个新的WPF用户控件,该控件将用于自定义输入键盘的显示和交互。在该控件中,我们可以添加按钮、文本框和其他UI元素来构建我们想要的键盘布局。 接着,我们可以为每个按钮绑定相应的命令或事件处理程序。例如,我们可以为数字按钮添加点击事件,使其在文本框中显示相应的数字字符。 同时,我们还可以借助WPF中的命令绑定机制,为键盘按钮添加更复杂的功能。例如,我们可以使用命令绑定将Shift按钮与大写字母绑定,使用户可以通过点击Shift按钮来切换字母的大小写。 此外,我们还可以使用WPF的样式和模板功能来美化自定义输入键盘的外观。通过为按钮和键盘控件定义相应的样式和模板,我们可以实现各种特效和动画效果,提升用户体验。 最后,我们需要在应用程序中将自定义输入键盘添加到相应的界面或窗口中。可以通过在XAML中引用我们创建的自定义输入键盘控件,或者在代码中动态地将其添加到用户界面中。 总之,通过WPF的强大功能,我们可以灵活地定制和实现自定义输入键盘,以满足不同应用场景和用户需求。这使得用户在使用WPF应用程序时可以得到更方便、个性化的输入体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光怪陆离的节日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值