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布局错误导致的按钮重叠:
- Grid仅定义了2列,但数字按钮需要3列布局(1/4/7、2/5/8、3/6/9),布局空间不足
- num2、num5、num8按钮设置了
Grid.ColumnSpan="2",导致它们的显示区域跨列,当窗口大小变化时,会与Column1中的num3、num6、num9按钮产生重叠 - 点击重叠区域时,实际触发的是后方按钮(如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
相关产品推荐
相关产品推荐

