利用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技术站