利用WPF窗口程序设计简单计算器

利用WPF窗口程序设计简单计算器攻略

WPF(Windows Presentation Foundation)是Windows应用程序开发的一种技术,它通过XAML语言和C#等编程语言实现了数据绑定、样式样板、动画、2D和3D绘图等功能,再加上.NET框架的各种支持,使得WPF成为Windows应用程序开发中非常重要的工具。接下来,本文将详细讲解如何利用WPF窗口程序设计简单计算器的完整攻略。

第一步:创建窗口布局

首先,我们需要根据需求设计计算器的布局,如下所示:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Text="计算器" FontSize="20" FontWeight="Bold" Margin="5"/>
    <Grid Grid.Row="1" Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBox Grid.Row="0" Height="40" FontSize="20" Margin="0,5" TextAlignment="Right"/>
        <Grid Grid.Row="1" Margin="0,5">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Button Grid.Column="0" Command="{Binding KeyPress}" CommandParameter="1" Content="1" FontSize="20" Margin="5"/>
            <Button Grid.Column="1" Command="{Binding KeyPress}" CommandParameter="2" Content="2" FontSize="20" Margin="5"/>
            <Button Grid.Column="2" Command="{Binding KeyPress}" CommandParameter="3" Content="3" FontSize="20" Margin="5"/>
            <TextBlock Grid.Column="3" Text="{Binding Input}" FontSize="20" Margin="5" TextAlignment="Right"/>
        </Grid>
        <!-- 还可以继续添加数字和操作符按钮 -->
    </Grid>
</Grid>

上面这段代码使用了WPF的Grid布局,主要分为两个部分:第一部分是标题,第二部分是计算器的主体部分,包括一个文本框和一些按钮。

第二步:完成数据绑定

接下来,我们需要为计算器的输入框和按钮添加数据绑定。在代码中,我们使用了一个名为KeyPress的命令,用于捕捉用户输入的数字和操作符,然后将它们绑定到数据上。具体代码如下:

public partial class MainWindow : Window
{
    private CalculatorViewModel viewModel;

    public MainWindow()
    {
        InitializeComponent();
        viewModel = new CalculatorViewModel();
        DataContext = viewModel;
    }
}

public class CalculatorViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string input = string.Empty;

    public string Input
    {
        get { return input; }
        set
        {
            if (input != value)
            {
                input = value;
                OnPropertyChanged("Input");
            }
        }
    }

    public ICommand KeyPress => new RelayCommand<string>(param =>
    {
        if (param == "C")
        {
            Input = string.Empty;
        }
        else if (param == "=")
        {
            try
            {
                Input = new DataTable().Compute(Input, null).ToString();
            }
            catch (Exception)
            {
                Input = "Error";
            }
        }
        else
        {
            Input += param;
        }
    });

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class RelayCommand<T> : ICommand
{
    private readonly Action<T> execute;
    private readonly Predicate<T> canExecute;

    public RelayCommand(Action<T> execute) : this(execute, null)
    {
    }

    public RelayCommand(Action<T> execute, Predicate<T> canExecute)
    {
        this.execute = execute ?? throw new ArgumentNullException("execute");
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return canExecute?.Invoke((T)parameter) ?? true;
    }

    public void Execute(object parameter)
    {
        execute((T)parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}

上面这段代码中,CalculatorViewModel代表计算器的数据模型,KeyPres是一个命令,用于捕获用户的输入。RelayCommand是一个WPF命令的实现,它通过传递了一个泛型类型的参数,来控制按钮的行为。

第三步:运行程序

完成了上述两步操作后,运行程序,即可看到WPF窗口程序设计的简单计算器已经成功运行。用户可以通过这个计算器进行简单的数值运算,例如加减乘除等等。

示例一:实现加法运算

在上面的数据绑定代码中,我们使用了一个名为input的字符串,记录用户输入的数值和操作符。在执行加法时,只需要通过代码逻辑来实现字符串连接即可。具体代码如下:

public ICommand KeyPress => new RelayCommand<string>(param =>
{
    if (param == "C")
    {
        Input = string.Empty;
    }
    else if (param == "=")
    {
        try
        {
            Input = new DataTable().Compute(Input, null).ToString();
        }
        catch (Exception)
        {
            Input = "Error";
        }
    }
    else if (param == "+")
    {
        if (Input.EndsWith("+"))
        {
            return;
        }
        Input += "+";
    }
    else
    {
        Input += param;
    }
});

上述代码中,我们通过在KeyPres命令中添加一个判断,控制加号的行为,从而实现了加法运算。

示例二:实现乘法运算

除了加法运算,我们还可以通过模仿上面代码来实现其他的数值运算,例如乘法运算。具体代码如下:

public ICommand KeyPress => new RelayCommand<string>(param =>
{
    if (param == "C")
    {
        Input = string.Empty;
    }
    else if (param == "=")
    {
        try
        {
            Input = new DataTable().Compute(Input, null).ToString();
        }
        catch (Exception)
        {
            Input = "Error";
        }
    }
    else if (param == "+")
    {
        if (Input.EndsWith("+"))
        {
            return;
        }
        Input += "+";
    }
    else if (param == "*")
    {
        if (Input.EndsWith("*"))
        {
            return;
        }
        Input += "*";
    }
    else
    {
        Input += param;
    }
});

上述代码中,我们添加了一个判断,用于判断用户输入的是不是乘号,如果是,则将其添加到字符串中,从而实现乘法运算。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用WPF窗口程序设计简单计算器 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#中调用Windows API的技术要点说明

    当我们需要使用Windows系统提供的某些功能时,我们可以使用Windows API进行调用。在C#中,调用Windows API需要遵循以下的技术要点: 使用DllImport特性声明API函数 DllImport特性允许我们声明和使用Windows API函数。使用DllImport特性需要注意以下几点: 我们需要指定Windows API函数的名称、所…

    C# 2023年5月31日
    00
  • C#根据身份证号码判断出生日期和性别

    C# 根据身份证号码判断出生日期和性别 步骤1:获取身份证号码的输入 在 C# 中,我们可以通过 Console.ReadLine() 方法获取用户输入的身份证号码。示例代码如下: Console.WriteLine("请输入身份证号码:"); string idCard = Console.ReadLine(); 步骤2:校验身份证号码…

    C# 2023年6月1日
    00
  • C#简单获取时间差的小例子

    下面我来详细讲解如何实现“C#简单获取时间差的小例子”。 目录 问题描述 解决方案 使用TimeSpan获取时间差 使用DateTime的Subtract方法获取时间差 总结 问题描述 在编写C#程序时,我们常常需要获取时间差,比如计算某个操作执行的时间、计算两个时间点之间的时长等等。那么,如何快速、简单地获取时间差呢? 解决方案 以下是两种使用C#获取时间…

    C# 2023年6月1日
    00
  • C#实现读取写入Json文件

    下面是详细的C#实现读取写入JSON文件的攻略: 1. Json.Net 库的引用 C#中常用的第三方JSON库是Json.Net,需要先引用它。可以通过NuGet来安装,在项目目录下执行以下命令: Install-Package Newtonsoft.Json 或在Visual Studio中通过菜单命令:Tools-> NuGet Package …

    C# 2023年5月31日
    00
  • .net设计模式之装饰模式(Decorator)

    当我们需要在不改变原有类的情况下对其进行新功能添加或修改时,装饰模式是一种适用的设计模式。它允许向一个现有对象添加新的功能,同时又不改变其结构。该模式是一种结构性模式。 装饰模式(Decorator)的基本结构 装饰模式有四个角色: 抽象构建(Component):定义一个对象接口,可以给这些对象动态地添加职责。 具体构建(ConcreteComponent…

    C# 2023年6月3日
    00
  • 详解使用DotNet CLI创建自定义的WPF项目模板

    我来为你详细讲解使用DotNet CLI创建自定义的WPF项目模板的完整攻略。以下是具体步骤: 步骤一:创建WPF项目 首先,我们需要创建一个WPF项目。可以在Visual Studio中创建或者使用以下命令在终端中创建: dotnet new wpf -n <项目名称> 这样我们就创建了一个名为<项目名称>的WPF项目。 步骤二:创…

    C# 2023年6月7日
    00
  • C#中的cookie编程简单实例与说明

    C#中的cookie编程可以用来在客户端存储和检索数据。下面将介绍如何使用cookie编程,并提供两个简单的示例来说明如何在C#中使用cookie。 什么是cookie cookie是在Web浏览器中存储的小型文本文件,用于存储用户的偏好设置、登录信息、购物车等数据。当用户与网站建立连接时,网站可以将cookie发送到用户的浏览器中,浏览器将会存储该cook…

    C# 2023年5月31日
    00
  • C#实现的简单随机数产生器功能示例

    下面我将为您详细讲解如何实现C#的随机数产生器功能示例。 1. 什么是随机数 随机数是指在一定范围内的数字,由于没有特定的规律和模式,所以看起来就像是随机产生的数字。在程序设计中,随机数被广泛应用于生成随机数据,加密算法,游戏开发等领域。 2. C#实现随机数产生器 在C#中,产生随机数可以使用Random类。下面是一个简单的示例,演示了如何使用Random…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部