You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF计算器程序异常Bug:数字2按钮相关计算出错

计算器数字2按钮计算逻辑异常问题

XAML代码

<Window x:Class="rekenmachine_variant_true.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:rekenmachine_variant_true"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="118*"/>
            <ColumnDefinition Width="683*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="0*"/>
        </Grid.RowDefinitions>

        <Button Content="1" Click="num_Click" HorizontalAlignment="Left" Margin="27,334,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num1" FontFamily="Courier New" FontSize="72"/>
        <Button Content="2" Click="num_Click" HorizontalAlignment="Left" Margin="117,334,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num2" FontFamily="Courier New" FontSize="72" Grid.ColumnSpan="2"/>
        <Button Content="3" Click="num_Click" HorizontalAlignment="Left" Margin="90,334,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num3" FontFamily="Courier New" FontSize="72" Grid.Column="1"/>
        <Button Content="4" Click="num_Click" HorizontalAlignment="Left" Margin="27,244,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num4" FontFamily="Courier New" FontSize="72"/>
        <Button Content="5" Click="num_Click" HorizontalAlignment="Left" Margin="117,244,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num5" FontFamily="Courier New" FontSize="72" Grid.ColumnSpan="2"/>
        <Button Content="6" Click="num_Click" HorizontalAlignment="Left" Margin="90,244,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num6" FontSize="72" FontFamily="Courier New" Grid.Column="1"/>
        <Button Content="7" Click="num_Click" HorizontalAlignment="Left" Margin="27,155,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num7" FontSize="72" FontFamily="Courier New"/>
        <Button Content="8" Click="num_Click" HorizontalAlignment="Left" Margin="117,155,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="num8" FontSize="72" FontFamily="Courier New" Grid.ColumnSpan="2"/>
        <Button Content="9" Click="num_Click" HorizontalAlignment="Left" Margin="90,155,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="num9" FontSize="72" FontFamily="Courier New" Grid.Column="1"/>
        <Button Content="0" Click="num_Click" HorizontalAlignment="Left" Margin="180,244,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="num0" FontSize="72" FontFamily="Courier New" FontStyle="Normal" Grid.Column="1"/>

        <Button Content="." Click="decimal_Click" HorizontalAlignment="Left" Margin="180,334,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="Nul_Copy" FontSize="72" FontFamily="Courier New" FontStyle="Normal" Grid.Column="1"/>
        <Button Content="*" Click="keer_Click"  HorizontalAlignment="Left" Margin="391,333,0,0" VerticalAlignment="Top" Height="80" Width="80"  FontSize="72" FontFamily="Courier New" Grid.Column="1"/>
        <Button Content="/" Click="deel_Click" HorizontalAlignment="Left" Margin="483,333,0,0" VerticalAlignment="Top" Height="80" Width="80" FontSize="72" FontFamily="Courier New" Grid.Column="1"/>
        <Button Content="=" Click="is_Click" HorizontalAlignment="Left"  Margin="575,332,0,0" VerticalAlignment="Top" Height="81" Width="80" FontSize="72" FontFamily="Courier New" FontStyle="Normal" Grid.Column="1"/>
        <Button Content="+" Click="plus_Click" HorizontalAlignment="Left" Margin="391,243,0,0" VerticalAlignment="Top" Height="80" Width="80" FontSize="72" FontFamily="Courier New" Grid.Column="1"/>
        <Button Content="-" Click="minus_Click" HorizontalAlignment="Left" Margin="483,243,0,0" VerticalAlignment="Top" Height="80" Width="80" FontSize="72" FontFamily="Courier New" Grid.Column="1"/>
        <Button Content="%" Click="modulo_Click" HorizontalAlignment="Left" Margin="392,155,0,0" VerticalAlignment="Top" Height="80" Width="263"  FontSize="72" FontFamily="Courier New" Grid.Column="1"/>

        <Button Content="CE" Click="clear_Click" HorizontalAlignment="Left" Margin="180,155,0,0" VerticalAlignment="Top"  Height="80" Width="80" FontSize="72" FontFamily="Bahnschrift Condensed" Background="#FFFFE74E" Grid.Column="1"/>
        <Button x:Name="minmax" Content="-/+" Click="minusPlus_Click" HorizontalAlignment="Left"  Margin="575,243,0,0" VerticalAlignment="Top" Height="81" Width="80" FontSize="36" FontFamily="Courier New" FontStyle="Normal" Grid.Column="1" FontWeight="SemiBold"/>

        <TextBox x:Name="TxtBox" HorizontalAlignment="Left" Margin="27,24,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="746" Grid.ColumnSpan="2" Height="110" FontSize="72" FontStyle="Normal" FontFamily="Segoe UI" TextAlignment="Right"/>
    </Grid>
</Window>

CS代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 rekenmachine_variant_true
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        decimal valueFirst;
        decimal valueSecond;

        char operators;

        private void decimal_Click(object sender, RoutedEventArgs e)
        {
            if (!TxtBox.Text.Contains("."))
            {
                TxtBox.Text += '.';
            }
        }

        private void num_Click(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            TxtBox.Text += btn.Content.ToString();
            valueFirst = decimal.Parse(TxtBox.Text);
        }

        private void minusPlus_Click(object sender, RoutedEventArgs e)
        {
            if (TxtBox.Text.Contains("-"))
            {
                TxtBox.Text = TxtBox.Text.Trim('-');
            }
            else
            {
                TxtBox.Text = "-" + TxtBox.Text;
            }
        }

        private void minus_Click(object sender, RoutedEventArgs e)
        {
            valueFirst = decimal.Parse(TxtBox.Text);
            TxtBox.Clear();
            operators = '-';
        }

        private void plus_Click(object sender, RoutedEventArgs e)
        {
            valueFirst = decimal.Parse(TxtBox.Text);
            TxtBox.Clear();
            operators = '+';
        }

        private void keer_Click(object sender, RoutedEventArgs e)
        {
            valueFirst = decimal.Parse(TxtBox.Text);
            TxtBox.Clear();
            operators = '*';
        }

        private void deel_Click(object sender, RoutedEventArgs e)
        {
            valueFirst = decimal.Parse(TxtBox.Text);
            TxtBox.Clear();
            operators = '/';
        }

        private void modulo_Click(object sender, RoutedEventArgs e)
        {
            valueFirst = decimal.Parse(TxtBox.Text);
            TxtBox.Clear();
            operators = '%';
        }

        private void is_Click(object sender, RoutedEventArgs e)
        {
            valueSecond = decimal.Parse(TxtBox.Text);
            decimal result = 0;

            if(operators == '+')
            {
                result = valueFirst + valueSecond;
                TxtBox.Text = result.ToString();
            }
            else if (operators == '-')
            {
                result = valueFirst - valueSecond;
                TxtBox.Text = result.ToString();
            }
            else if (operators == '*')
            {
                result = valueFirst * valueSecond;
                TxtBox.Text = result.ToString();
            }
            else if (operators == '/')
            {
                result = valueFirst / valueSecond;
                TxtBox.Text = result.ToString();
            }
            else if (operators == '%')
            {
                result = valueFirst % valueSecond;
                TxtBox.Text = result.ToString();
            }
            if (TxtBox.Text == "0")
            {
                TxtBox.Clear();
            }
        }

        private void clear_Click(object sender, RoutedEventArgs e)
        {
            TxtBox.Clear();
        }

        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

问题说明

已知minPlus、modulo和decimal按钮存在问题,计划自行修复;清除按钮仅清除文本框,未重置数值变量。当前核心问题:所有涉及数字2按钮(num2)的计算均出错,修改按钮Content属性无效,示例如下:

  • 2 + 6 = 12(预期8)
  • 2 - 6 结果为空
  • 85 + 2 = 4(预期87)

问题根源

与decimal类型无关,完全是XAML布局错误导致的按钮重叠:

  1. Grid仅定义了2列,但数字按钮需要3列布局(1/4/7、2/5/8、3/6/9),布局空间不足
  2. num2、num5、num8按钮设置了Grid.ColumnSpan="2",导致它们的显示区域跨列,当窗口大小变化时,会与Column1中的num3、num6、num9按钮产生重叠
  3. 点击重叠区域时,实际触发的是后方按钮(如num6)的Click事件,导致输入错误的数字,进而计算结果异常

解决方案

1. 修改Grid列定义

增加列数,确保数字按钮有足够的布局空间:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

2. 修复数字按钮布局

移除num2、num5、num8的Grid.ColumnSpan="2"属性,将它们放在正确的列中,并调整Margin确保布局整齐:

<!-- 第一列(数字1、4、7) -->
<Button Content="1" Click="num_Click" HorizontalAlignment="Left" Margin="27,334,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num1" FontFamily="Courier New" FontSize="72"/>
<Button Content="4" Click="num_Click" HorizontalAlignment="Left" Margin="27,244,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num4" FontFamily="Courier New" FontSize="72"/>
<Button Content="7" Click="num_Click" HorizontalAlignment="Left" Margin="27,155,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num7" FontSize="72" FontFamily="Courier New"/>

<!-- 第二列(数字2、5、8、0) -->
<Button Content="2" Click="num_Click" HorizontalAlignment="Left" Margin="117,334,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num2" FontFamily="Courier New" FontSize="72" Grid.Column="1"/>
<Button Content="5" Click="num_Click" HorizontalAlignment="Left" Margin="117,244,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num5" FontFamily="Courier New" FontSize="72" Grid.Column="1"/>
<Button Content="8" Click="num_Click" HorizontalAlignment="Left" Margin="117,155,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="num8" FontSize="72" FontFamily="Courier New" Grid.Column="1"/>
<Button Content="0" Click="num_Click" HorizontalAlignment="Left" Margin="117,424,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="num0" FontSize="72" FontFamily="Courier New" FontStyle="Normal" Grid.Column="1"/>

<!-- 第三列(数字3、6、9、小数点) -->
<Button Content="3" Click="num_Click" HorizontalAlignment="Left" Margin="207,334,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num3" FontFamily="Courier New" FontSize="72" Grid.Column="2"/>
<Button Content="6" Click="num_Click" HorizontalAlignment="Left" Margin="207,244,0,0" VerticalAlignment="Top" Height="80" Width="80" Name="num6" FontSize="72" FontFamily="Courier New" Grid.Column="2"/>
<Button Content="9" Click="num_Click" HorizontalAlignment="Left" Margin="207,155,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="num9" FontSize="72" FontFamily="Courier New" Grid.Column="2"/>
<Button Content="." Click="decimal_Click" HorizontalAlignment="Left" Margin="207,424,0,0" VerticalAlignment="Top" Height="80" Width="80" x:Name="btnDecimal" FontSize="72" FontFamily="Courier New" FontStyle="Normal" Grid.Column="2"/>

3. 调整操作按钮位置

根据新的列定义,调整右侧操作按钮的Margin,确保整体布局协调。

额外优化建议

  • 清除按钮clear_Click中添加数值变量重置逻辑:
private void clear_Click(object sender, RoutedEventArgs e)
{
    TxtBox.Clear();
    valueFirst = 0;
    valueSecond = 0;
    operators = '\0';
}
  • 为避免输入非数字内容引发异常,在num_Click和操作符事件中添加decimal.TryParse判断。

内容的提问来源于stack exchange,提问作者ZanyZilch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:20:30