利用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日

相关文章

  • asp.net自定义控件代码学习笔记

    关于“asp.net自定义控件代码学习笔记”的完整攻略,我可以分为以下几个部分来进行讲解: 1. 自定义控件的基本概念 自定义控件是asp.net中的一种特殊控件,它能够和普通控件一样被放置在页面上并进行交互,但是它的实现过程相对于普通控件更加灵活且复杂。 一个自定义控件通常包含两个部分:控件类和控件外观。控件类一般用来定义控件的行为和属性,控件外观则由ht…

    C# 2023年5月31日
    00
  • C#如何遍历Dictionary

    C#提供了许多方法,可以对Dictionary进行遍历操作。下面是三个常见的遍历方式: 1. 使用foreach循环遍历Dictionary Dictionary<string, int> dict = new Dictionary<string, int>(); // 添加元素 dict.Add("a", 1);…

    C# 2023年6月1日
    00
  • ASP.NET Core中的Controller使用示例

    ASP.NET Core是一个跨平台的开源Web框架,它可以用于构建高性能、可扩展的Web应用程序。在ASP.NET Core中,Controller是一个非常重要的组件,它用于处理HTTP请求并返回响应。在本文中,我们将详细讲解ASP.NET Core中的Controller使用示例。 创建一个Controller 在ASP.NET Core中,我们可以使…

    C# 2023年5月16日
    00
  • .NET 6开发TodoList应用之使用AutoMapper实现GET请求

    一、前言 本文将会详细讲解如何使用AutoMapper实现GET请求。在本文中,我们将会使用.NET 6和AutoMapper来搭建一个TodoList应用程序,以便我们更好的理解AutoMapper的作用。 二、什么是AutoMapper AutoMapper是一个.NET的对象映射库。它的作用是将一个对象类型的数据转换为另一个对象类型的数据。因为在实际项…

    C# 2023年6月3日
    00
  • C# String.EndsWith()方法: 检查字符串是否以指定的后缀结尾

    String.EndsWith()是C#中用于判断字符串是否以指定的字符串结尾的方法。该方法的定义如下: public bool EndsWith(string value); 其中,参数value表示要比较的字符串。该方法会将当前字符串与指定的字符串进行比较,如果当前字符串以指定的字符串结尾,则返回true,否则返回false。 下面分别通过两个实例来说明…

    C# 2023年4月19日
    00
  • Asp Split函数之使用多个分割符的方法

    接下来我会详细讲解 “Asp Split函数之使用多个分割符的方法” 的完整攻略。 什么是Split函数? Split函数是VBScript的内置函数,用于将一个字符串按照指定的分隔符分割成一个数组。在ASP中使用时,可以用来处理表单数据、URL参数等字符串。 Split函数的语法 Split(Expression, [Delimiter, [Limit, …

    C# 2023年6月7日
    00
  • C#实现矩阵加法、取负、数乘、乘法的方法

    要实现矩阵加法、取负、数乘、乘法,可以使用 C# 中的多维数组来表示矩阵,然后编写相应的函数实现这些操作。 定义矩阵 可以使用以下语句定义一个 2×3 的矩阵: int[,] matrix = new int[2,3]{{1,2,3},{4,5,6}}; 矩阵加法 矩阵加法的规则是将两个矩阵对应位置的元素相加,得到一个新的矩阵。 可以编写以下函数实现矩阵加法…

    C# 2023年6月7日
    00
  • 深入理解c#多态

    深入理解C#多态的完整攻略 什么是多态? 在面向对象编程(OOP)中,多态是指同一个方法在不同情况下表现出现不同的行为。简单来说,就是同样的操作在不同的对象上可以有不同的实现。多态的概念是OOP中的三大特性之一,其它两个是封装和继承。 C#中的多态 C#中的多态性是通过虚方法(Virtual Methods)、抽象类和接口实现的。关键字virtual和ove…

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