Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要一些指导来使用C#制作GUI计算器吗?_C#_Wpf_Calculator - Fatal编程技术网

需要一些指导来使用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);
            }
        }