Кнопка «График» переключает на графическое окно для визуалиции результатов. Мы будем использовать 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 можно закомментировать или удалить. Готово.