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

yizhihongxing

利用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#实现将json转换为DataTable的方法

    将一个Json字符串转换为DataTable可以使用Json.NET库来实现。具体步骤如下: 步骤一:安装Json.NET库 在Visual Studio中打开NuGet包管理器,搜索并安装Newtonsoft.Json库。 注:也可以通过在项目的Package Manager控制台输入以下命令进行安装: Install-Package Newtonsoft…

    C# 2023年5月31日
    00
  • C#实现封面图片生成器的示例代码

    下面我将为你详细讲解使用C#实现封面图片生成器的完整攻略。 1. 确定需求 在实现封面图片生成器前,我们需要明确需求: 需要生成一张图片 图片需要包含标题、封面图等元素 生成的图片需要具有可定制性 2. 安装依赖项 我们需要安装以下两个依赖项: SkiaSharp:是一个开源的2D图形库,适用于各种.NET平台。该库提供了对Skia图形引擎的封装,使开发者可…

    C# 2023年6月3日
    00
  • 三步将Asp.Net页面输出到EXCEL里

    下面是“三步将Asp.Net页面输出到Excel里”的完整攻略,包含两个示例。 1. 引用Excel操作库 在输出Asp.Net页面到Excel前,需要先引用Excel操作库。常用的Excel操作库包括: NPOI(Nuget包名:NPOI) EPPlus(Nuget包名:EPPlus) 这里以NPOI为例。我们可以通过Nuget引入NPOI: Instal…

    C# 2023年6月3日
    00
  • C#推送信息到APNs的方法

    C#推送信息到APNs可以通过APNs官方提供的HTTP/2 API实现。 以下是实现的步骤: 1. 创建APNs证书 a. 在 https://developer.apple.com/ 上登录账号b. 进入 “Certificates, Identifiers & Profiles” 页面c. 点击左侧菜单栏的 “Keys” ,然后点击右上角 “C…

    C# 2023年6月1日
    00
  • C#中using关键字的使用方法示例

    下面我将为您详细讲解“C#中using关键字的使用方法示例”的完整攻略。 1. using关键字的基本语法 在C#中,using关键字通常用于释放对象的资源,以确保程序的高效性和安全性。它的基本语法如下: using (resource) { // 对象资源的使用代码块 } 其中,resource表示需要释放的对象资源。对象资源通常是一些需要手动释放的资源对…

    C# 2023年5月31日
    00
  • c#格式化数字的方法

    当我们在C#中处理数字时,有时需要格式化数字,比如保留特定数量的小数,增加千分号,增加货币符号等。下面是几种常用的C#格式化数字的方法。 1. ToString方法 ToString方法是C#中最常用的格式化数字的方法之一。通过该方法,可以将数字转换为指定格式的字符串。下面是几个示例: 1.1 保留指定小数位数 double num = 123.456789…

    C# 2023年5月14日
    00
  • ASP.NET Core 3.0迁移的完美避坑指南

    ASP.NET Core 3.0迁移的完美避坑指南 ASP.NET Core 3.0是一个重大的版本更新,其中包含了许多新功能和改进。但是,由于这些更改,迁移现有的ASP.NET Core应用程序可能会遇到一些问题。在本攻略中,我们将提供一些有用的提示和技巧,以帮助您成功地将现有的ASP.NET Core应用程序迁移到3.0版本。 1. 更新NuGet包 在…

    C# 2023年5月16日
    00
  • Unity实现喷漆效果

    Unity实现喷漆效果,可以分以下步骤来完成: 创建一个基本的场景,并导入一个模型。 为模型创建着色器,并定义一个接口来控制喷漆效果。 为着色器添加代码,以添加喷漆效果,其中需要使用到模板纹理、贴图以及渲染纹理等技术。 添加触发器并创建脚本,以在场景中呈现喷漆效果。 导出场景或打包场景,以便在Web程序或其他平台上调用。 以下是两个示例,以更深入地解释如何实…

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