需要一些指导来使用C#制作GUI计算器吗?
我对需要一些指导来使用C#制作GUI计算器吗?,c#,wpf,calculator,C#,Wpf,Calculator,我对WPF完全陌生,但对oop,泛型等非常熟悉。。但我想做一个计算器,看看 在那里,我通过自己的编码获得我的方法 但我有点困惑的问题是,如何获得显示在文本框中的值并进行求和 调查来源: using System; using System.Windows; using System.Text; namespace WpfCalculatorGUI { /// <summary> /// Interaction logic for MainWindow.xaml
WPF
完全陌生,但对oop
,泛型
等非常熟悉。。但我想做一个计算器,看看
在那里,我通过自己的编码获得我的方法
但我有点困惑的问题是,如何获得显示在文本框中的值并进行求和
调查来源:
using System;
using System.Windows;
using System.Text;
namespace WpfCalculatorGUI
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public void nine(Object sender, RoutedEventArgs e)
{
DispBox.AppendText("9");
}
}
}
使用系统;
使用System.Windows;
使用系统文本;
命名空间WpfCalculatorGUI
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
公共无效九(对象发送者,路由目标e)
{
DispBox.AppendText(“9”);
}
}
}
请提供指导。解决此问题的正确方法是创建MVVM体系结构并使用绑定。你必须阅读更多关于这方面的内容,因为这是一个很长的话题 一个快到一半的'n'dirty解决方案可能是绑定到表单本身:
<Window x:Name="rootControl" ...
<TextBox Text="{Binding ElementName=rootControl, Path=Display, Mode=TwoWay}" ...
设置Name=“tb”(这就是我命名的文本框)并将Click=“Button\u Click”添加到您的1,2,3,4,。。。。按钮
然后在.cs文件中执行此操作,以在文本框中显示单击的数字
private void Button_Click(object sender, RoutedEventArgs e)
{
Button b = (Button)sender;
tb.Text += b.Content.ToString();
}
private void Result_Click(object sender, RoutedEventArgs e)
{
try
{
result();
}
catch (Exception exc)
{
Console.WriteLine("Receiving", exc.StackTrace);
tb.Text = "Error!";
}
}
private void result()
{
String op;
int iOp = 0;
if (tb.Text.Contains("+"))
{
iOp = tb.Text.IndexOf("+");
}
else if (tb.Text.Contains("-"))
{
iOp = tb.Text.IndexOf("-");
}
else if (tb.Text.Contains("*"))
{
iOp = tb.Text.IndexOf("*");
}
else if (tb.Text.Contains("/"))
{
iOp = tb.Text.IndexOf("/");
}
else
{
tb.Text = "Error";
}
op = tb.Text.Substring(iOp, 1);
double op1 = Convert.ToDouble(tb.Text.Substring(0, iOp));
double op2 = Convert.ToDouble(tb.Text.Substring(iOp + 1, tb.Text.Length - iOp - 1));
if (op == "+")
{
tb.Text += "=" + (op1 + op2);
}
else if (op == "-")
{
tb.Text += "=" + (op1 - op2);
}
else if (op == "*")
{
tb.Text += "=" + (op1 * op2);
}
else
{
tb.Text += "=" + (op1 / op2);
}
}
在我看来,在WPF中访问UI中的控制值的最佳方法是使用MVVM模式和数据绑定。google“WPF中的MVVM简介”有很多教程,请查看caliburn.micro,了解一个伟大的MVVM框架
MVVM框架或体系结构的目的是什么?它将数据的行为、业务逻辑的行为和表示层联系在一起。基本上,以您的计算器为例:您可能会有一个模拟计算器功能(输入/输出)的calculator
类,您会有一个CalculatorViewModel
,其中包含ICommand
实现,以便激活计算器命令,例如input(int值)
或Add()
或Equals()
,它们将调用计算器
类上的等效方法。最后,您将拥有绑定到计算器视图模型
WPF页面(视图
)的WPF应用程序使用绑定将其全部粘在一起-您可以在XAML中添加一个按钮,该按钮在其中间具有值“代码>1”/代码>该按钮将绑定到<代码>输入< /代码>命令,将值<代码> 1 <代码>作为参数。绑定将知道如何在<代码> VIEWSMODS中调用<代码>输入< /代码>方法。这将依次调用计算器上的Input
,并处理通知用户界面(通过INotifyPropertyChanged
)显示需要更新。您的视图上的文本框
将绑定到视图模型上的结果
,该结果从计算器
中获取其值。他已经将名称设置为DispBox。除此之外,这在WPF环境中是完全不合适的解决方案-这里应该将MVVM与数据绑定一起使用ng.如果你不介意的话,你从哪里想到了“tb”?
@Romiox我刚开始学习WPF,我知道我还有很多东西要学。我只是告诉你几天前我实现计算器的时候做了些什么:(我明白了:)但我有点困惑..你是如何在这里创建tb
对象的..这就是我要问的:)@VipulSharma问题是,您使用total WindowsForms样式编写了计算器,仅使用WPF。程序没有实际的体系结构,没有视图模型,没有绑定等。如果您遵循这条路径,代码将越来越难以维护。在编写实际的WPF代码之前,请不要犯我的错误并阅读有关MVVM的内容……因此,首先我必须学习MVVM体系结构
?…我第一次听到这个名称……好吧,学习数据绑定以完成任务。在为WPF专门准备了.MVVM(Model-View-Viewmodel)之后,您将需要进入MVVM。一般的规则是,如果您遵循MVVM体系结构,WPF将帮助您。但若你们不把代码和视图分开,那个么实现起来就会越来越困难。数据绑定实际上是MVVM的一部分,因此您将在途中了解它。我还可以补充一点,将计算器和显示逻辑分开是明智的——应该有一个计算器类,它处理输入、计算和提供输出。我意识到这只是一个人为的例子,但您不应该将值“9”直接添加到文本框中-您应该将9传递给计算器类,该类应执行任何内部更新/计算,并更改其结果
值。显示更新应该是视图模型的关注点,因此任何输入命令都应该从计算器中获取新值。这将有助于创建一个清洁剂solution@Charleh请注意“中途”一词:)WPF的有趣之处在于,虽然它使复杂的事情变得简单,但它也使简单的事情变得复杂-简单的计算器应用程序需要3倍的代码量才能在WinForms中编写。我的意思是,OP的代码中没有什么可以修复的。它应该从头重写。
private void Button_Click(object sender, RoutedEventArgs e)
{
Button b = (Button)sender;
tb.Text += b.Content.ToString();
}
private void Result_Click(object sender, RoutedEventArgs e)
{
try
{
result();
}
catch (Exception exc)
{
Console.WriteLine("Receiving", exc.StackTrace);
tb.Text = "Error!";
}
}
private void result()
{
String op;
int iOp = 0;
if (tb.Text.Contains("+"))
{
iOp = tb.Text.IndexOf("+");
}
else if (tb.Text.Contains("-"))
{
iOp = tb.Text.IndexOf("-");
}
else if (tb.Text.Contains("*"))
{
iOp = tb.Text.IndexOf("*");
}
else if (tb.Text.Contains("/"))
{
iOp = tb.Text.IndexOf("/");
}
else
{
tb.Text = "Error";
}
op = tb.Text.Substring(iOp, 1);
double op1 = Convert.ToDouble(tb.Text.Substring(0, iOp));
double op2 = Convert.ToDouble(tb.Text.Substring(iOp + 1, tb.Text.Length - iOp - 1));
if (op == "+")
{
tb.Text += "=" + (op1 + op2);
}
else if (op == "-")
{
tb.Text += "=" + (op1 - op2);
}
else if (op == "*")
{
tb.Text += "=" + (op1 * op2);
}
else
{
tb.Text += "=" + (op1 / op2);
}
}