Кнопка «График» переключает на графическое окно для визуалиции результатов. Мы будем использовать html-страницу «test_graph.htm» из текущей директории.

В ней следующее содержимое.

 

<!DOCTYPE html>

<html>

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <title>Canvas drawing</title>

    <style type="text/css">

        body { background-color:#ffe; border:2px solid #cfc; }

    </style>

    <script type="text/javascript" src="jquery-1.11.1.min.js"></script>

</head>

<body>

    <h1>Canvas drawing</h1>

</body>

</html>

 

В конструктор добавляем код загрузки.

 

            string sDir = AppDomain.CurrentDomain.BaseDirectory;

            web1.Navigate("file:///" + sDir + "test_graph.htm");

            button2.Click += Button2_Click;

 

 

Добавляем новый обработчик

 

        //скрыть/показать элементы интерфейса

        private void Button2_Click(object sender, RoutedEventArgs e)

        {

           

Label1.Visibility = Label1.IsVisible ? Visibility.Hidden : Visibility.Visible;

            Label2.Visibility = Label2.IsVisible ? Visibility.Hidden : Visibility.Visible;

            sv1.Visibility = sv1.IsVisible ? Visibility.Hidden : Visibility.Visible;

            textBlock2.Visibility = textBlock2.IsVisible ? Visibility.Hidden : Visibility.Visible;

            web1.Visibility = web1.IsVisible ? Visibility.Hidden : Visibility.Visible;

            button2.Content = Label1.IsVisible ? "График" : "Команды";

        }

 

Здесь происходит переключение видимости. Если окно команд видимо, делаем его невидимым, а компонент WebBrowser видимым. И наоборот.

 

Запускаем программу, получаем после нажатия кнопки «График» переключение на html-страницу (рис.2.4).

Рис.2.4. Результат нажатия кнопки «График»

С реализацией кнопки «График» закончено.

 

Кнопка «Готово». Добавляем пространство имен

//for open dialog

using Microsoft.Win32;

 

Добавляем обработчик

        // загрузить скрипт из файла

        private void Button3_Click(object sender, RoutedEventArgs e)

        {

            string data;

            OpenFileDialog openFileDialog = new OpenFileDialog();

            if (openFileDialog.ShowDialog() == true)

            {

                data = File.ReadAllText(openFileDialog.FileName, Encoding.UTF8);

                textBlock1.Text = data;

            }

       }

 

И ссылку на него в конструкторе

            button3.Click += Button3_Click;

 

Готово.

 

Кнопка « Сохранить ». Добавляем обработчик

       // сохранить скрипт в файле

        private void Button4_Click(object sender, RoutedEventArgs e)

        {

            OpenFileDialog openFileDialog = new OpenFileDialog

            {

                CheckFileExists = false

            };

            if (openFileDialog.ShowDialog() == true)

            {

                File.WriteAllText(openFileDialog.FileName, textBlock1.Text, Encoding.UTF8);

            }

        }

И ссылку на него в конструкторе

            button4.Click += Button4_Click;

 

Готово.

 

Кнопка «Компилировать». Добавляем обработчик

 

private void Button5_Click(object sender, RoutedEventArgs e)

        {

            OpenFileDialog openFileDialog = new OpenFileDialog

            {

                CheckFileExists = false

            };

            if (openFileDialog.ShowDialog() == false) return;

            string fname = openFileDialog.FileName;

            if (fname.LastIndexOf(".cs") == fname.Length - 3)

            {

                var data = File.ReadAllText(openFileDialog.FileName, Encoding.UTF8);

                textBlock1.Text = data;

                fname = fname.Substring(0, fname.Length - 3) + ".dll";

            }

            string sourceDll = textBlock1.Text;

            string outputAssembly = fname;

            CompilerResults results;

            try

            {

                CSharpCodeProvider provider = new CSharpCodeProvider();

                //признак build dll

                CompilerParameters compilerParams2 = new CompilerParameters

                { OutputAssembly = outputAssembly, GenerateExecutable = false };

                //to allow LINQ

                compilerParams2.ReferencedAssemblies.Add("System.Core.Dll");

 

                //Компиляция dll

                results = provider.CompileAssemblyFromSource(compilerParams2, sourceDll);

                //Выводим информацию об ошибках

                Console(string.Format("Number of Errors DLL: {0}", results.Errors.Count));

                foreach (CompilerError err in results.Errors)

                {

                    Console(string.Format("ERROR {0}", err.ErrorText));

                }

                //test

                Console(string.Format("Try Assembly:"));

                Assembly assembly = Assembly.LoadFile(outputAssembly);

                Type type = assembly.GetType("MathPanelExt.QuadroEqu");

                MethodInfo method = type.GetMethod("Solve");

                double x1 = 0, x2 = 0;

                object[] pars = new object[5];

                pars[0] = 1.0;

                pars[1] = 0.0;

                pars[2] = -1.0;

                pars[3] = null;

                pars[4] = null;

                object res = method.Invoke(null, pars);

                //bool blResult = (bool)res;

                //if (blResult)

                {

                    x1 = (double)pars[3];

                    x2 = (double)pars[4];

                }

                Console(string.Format("x1 {0}, x2 {1}", x1, x2));

//end of test

            }

            catch (Exception ex) { Console(ex.ToString()); }

        }

 

И ссылку на него в конструкторе

            button5.Click += Button5_Click;

 

Создадим простой класс и сохраним его в папке scripts.

using System;

 

namespace MathPanelExt

{

       /// <summary>

       /// class for solving the quadratic equation

       /// </summary>

 

       public class QuadroEqu

       {

              public QuadroEqu()

              {

              }

              /// <summary>

              /// calculate roots of quadratic equation

              /// </summary>

              public static void Solve(double a, double b, double c, out double x1, out double x2)

              {

                      double discr = Math.Sqrt(b * b - 4 * a * c);

                      x1 = (-b - discr) / (2 * a);

                      x2 = (-b + discr) / (2 * a);

              }

       }

}

 

Запускаем программу, нажимаем на «Компилировать». Получаем результат в окне сообщений.

Try Assembly:

x1 -1, x2 1

 

После этого блок test можно закомментировать или удалить. Готово.