Проект xml1 с пустым окном

0) Main Menu в VC# 2010 Express: Tools → Options → Show all Settings → Projects and Solutions → Visual Studio projects location: → C:\temp

1) Main Menu в VC# 2010 Express: File → New Project... →
Installed Templates: Windows Forms Application
Name: xml1
→ OK
Появится Form1.cs[Design].

2) Стереть два лишних файла: Form1.Designer.cs и Program.cs. Открыть Solution Explorer - draw1: xml1 и после открыть ветку Form1.cs. Кликнуть правой кнопкой на Program.cs. Откроется контекстное меню - кликнуть на DeleteПоявится Message Box : "'Program.cs' will be deleted permanently". Кликнуть ОК. Так же удалите Form1.Designer.cs (не стирайте элемент Form1 полностью - он нужен).Также удалить и нажать на стрелку или плюс для открытия ветки - элемент в дереве проекта Вы найдете эти файлы в окне и

3)Кликните правой кнопкой мыши на Form1. Откроется контекстное меню. Кликните на View Code.
Вы увидите код, созданный автоматически при создании проекта для окна Form1.cs. Сотрите этот код полностью.

4)Напишите в полностью очищенном окне следующие четыре строчки кода:

public class Form1 : System.Windows.Forms.Form

   static void Main() { System.Windows.Forms.Application.Run( newForm
1() ); }
}

5) Кликните Debug в MainMenu. Откроется подменю. Кликните на Start Without Debugging CtrlF5. Мини-программа автоматически скомпилируется и запустится. Обратите внимание на окно Error List в нижней части основного окна Visual Studio. Список ошибок должен быть пуст. Исправляйте ошибки, начиная сверху. После исправления первой, попробуйте снова скомпилировать код, так как часто одна ошибка синтаксиса создает несколько ошибок компиляции кода.

Важно: Всегда закрывайте все запущенные инстанции приложения xml1перед тем, как внести изменения в код и скомпилировать новую программу! Если есть сомнения все ли инстанции закрыты, запустите системную программу TaskManager, нажав комбинацию клавиш Ctrl+Alt+Del, и если в списке запущенных процессов найдется xml1.exe– удалите его.

Рисовалка с динамическим массивом

Если вы не видите код, - двойной клик по Form1.cs, передаст фокус окну с кодом.
Стирайте весь код и в пустом окне Form1.cs напишите следующий код:

using System; 
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
using System.IO;
public class Form1 : Form
{
[STAThread] static void Main()
{
Application.Run( new Form1() );
}
   Graphics g; 
Point p0, p1;
ArrayList polygon = new ArrayList();
System.Text.StringBuilder polygon_string = new System.Text.StringBuilder();
Brush redbrush = new SolidBrush( Color.Red );
Brush graybrush = SystemBrushes.Control;
Brush blackbrush = SystemBrushes.ControlText;
Pen redpen = new Pen( Color.Red, 4 );
   public Form1() 
{
Text = "XML1: Store & Read Polygones in XML-Format";
      Width = 800; Height = 600; g = this.CreateGraphics(); 
}
   protected override void OnMouseDown( MouseEventArgs e ) 
{
polygon.Clear();
Invalidate();
p0 = e.Location;
polygon.Add( p0 );
}
   protected override void OnMouseMove( MouseEventArgs e ) 
{
if ( e.Button == MouseButtons.None ) return;
p1 = e.Location;
Int32 dx = p1.X - p0.X;
Int32 dy = p1.Y - p0.Y;
if ( dx*dx + dy*dy < 100 ) return;
g.DrawLine( redpen, p0, p1 );
polygon.Add( p1 ); p0 = p1;
}
   protected override void OnMouseUp( MouseEventArgs e ) 
{
      if ( polygon.Count < 2 ) return; 
polygon_string.Length = 0;
      polygon_string.Append( "\"" ); 
      for ( Int32 i=0; i < polygon.Count; i++ ) 
{
p0 = (Point)polygon[i];
polygon_string.Append( p0.X );
polygon_string.Append( "," );
polygon_string.Append( p0.Y );
if ( i < polygon.Count-1 ) polygon_string.Append( ", " );
}
polygon_string.Append( "\"" ); Invalidate();
}
   protected override void OnPaint( PaintEventArgs e ) 
{
g.FillRectangle( graybrush, 0, 0, Width, 2*Font.Height );
g.DrawString( "Press the left mouse button and move!", Font, redbrush, Width/2-50, 0 );
g.DrawString( polygon_string.ToString(), Font, blackbrush, 0, Font.Height );
for ( Int32 i=0; i < polygon.Count-1; i++ )
g.DrawLine( redpen, (Point)polygon[i], (Point)polygon[i+1] );
}
}

Кликните Debug в MainMenu. Откроется подменю. Кликните на Start Without Debugging CtrlF5. Мини-программа автоматически скомпилируется и запустится. Обратите внимание на окно Error List в нижней части основного окна Visual Studio.

File-Menu

Версия 2: закройте программу xml1.
Допишите в конструктор  public Form1() под строкой
   Text = "XML1: Store & Read Polygons in XML-Format"; следующий код:

MenuItem miSaveTXT = new MenuItem( "SaveAsTXT ", new EventHandler(MenuFileSaveAsTXT ) ); 
MenuItem miSaveXAML = new MenuItem( "SaveAsXAML", new EventHandler(MenuFileSaveAsXAML) );
MenuItem miSaveSVG = new MenuItem( "SaveAsSVG ", new EventHandler(MenuFileSaveAsSVG ) );
MenuItem miRead = new MenuItem( "&Read ", new EventHandler(MenuFileRead) );
MenuItem miExit = new MenuItem( "&Exit ", new EventHandler(MenuFileExit) );
MenuItem miFile = new MenuItem( "&File ", new MenuItem[] {
miSaveTXT, miSaveXAML, miSaveSVG, miRead, miExit} );
Menu = new System.Windows.Forms.MainMenu( new MenuItem[] { miFile } );

и пять новых заготовок для функций под функцией  protected override void OnPaint( PaintEventArgs e ), но внутри класса  public class Form1 : System.Windows.Forms.Form :

private void MenuFileSaveAsTXT( object obj, EventArgs ea ) 
{
}
private void MenuFileSaveAsXAML( object obj, EventArgs ea ) 
{
}
private void MenuFileSaveAsSVG( object obj, EventArgs ea ) 
{
}
private void MenuFileRead( object obj, EventArgs ea ) 
{
}
private void MenuFileExit( object obj, EventArgs ea ) { 
Application.Exit();
}

 Кликните на Start Without Debugging CtrlF5.

Запись в текстовой файл

Версия 3.  Закройте все инстанции xml1.
Напишите следующий код в пустой функции private void MenuFileSaveAsTXT( object obj, EventArgs ea ):

   SaveFileDialog dlg = new SaveFileDialog(); 
dlg.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ;
if ( dlg.ShowDialog() != DialogResult.OK ) return;
Int32 n0 = dlg.FileName.IndexOf( ".txt" );
if ( n0 < 0 )
dlg.FileName += ".txt";
StreamWriter sw = new StreamWriter( dlg.FileName );
sw.WriteLine( "This file comes from my XML1.exe" );
sw.WriteLine( "Polyline Points " );
sw.WriteLine( polygon_string );
sw.Close();

 Кликните на Start Without Debugging CtrlF5.

Нарисуйте единицу и запишите ее в файл под именем "one.txt", Нарисуйте двойку и запишите ее в файл под именем "two.txt" и т.д. Расширение  .txt не обязательно - если оно отсутствует, то добавится автоматически.
Контролируйте, чтобы файл был записан в директорию c:\temp\xml1\bin\debug . Иначе придется долго искать ваш  one.txt по всему компьютеру.
Запустите Notepad или Textpad. Откройте файл c:\temp\xml1\bin\debug\one.txt.
Сравните строки с кодом void MenuFileSaveAsTXT( object obj, EventArgs ea ).
Измените строку "This file comes from my XML1.exe", перекомпилируйте код, стартуйте приложение и перезапишите файл еще раз и просмотрите его содержание через стандартный Notepad.

Запись в XAML-Файл

Версия 3: Закройте xml1.
Допишите код в функцию private void MenuFileSaveAsXAML( object obj, EventArgs ea ):

   SaveFileDialog dlg = new SaveFileDialog(); 
dlg.Filter = "XAML files (*.xaml)|*.xaml|All files (*.*)|*.*" ;
if ( dlg.ShowDialog() != DialogResult.OK ) return;
Int32 n0 = dlg.FileName.IndexOf( ".xaml" );
if ( n0 < 0 ) dlg.FileName += ".xaml";
StreamWriter sw = new StreamWriter( dlg.FileName );
sw.WriteLine( "<Canvas xmlns =\
"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" );
sw.WriteLine( " xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" );
sw.WriteLine( "<!--This file comes from my XML1.exe.-->" );
sw.WriteLine( "<Polyline Points = " );
sw.WriteLine( polygon_string + " Stroke=\"Red\" StrokeThickness=\"4\" />" );
sw.WriteLine( "</Canvas>" );
sw.Close();

Кликните на Start Without Debugging CtrlF5.
Нарисуйте единицу и запишите под именем "one.xaml", нарисуйте двойку и запишите под именем "two.xaml" и т.д. Контролируйте, чтобы файл был записан в директорию c:\temp\xml1\bin\debug . Иначе придется долго искать ваш  one.xaml по всему компьютеру.
Запустите Notepad или Textpad. Откройте файл c:\temp\xml1\bin\debug\one.xaml.
Сравните строчки в файле с кодом функции void MenuFileSaveAsXAML( object obj, EventArgs ea ).
Измените строчку This file comes from my XML1.exe в строке < title > в коде, перекомпилируйте код и проверните все еще раз - и просмотрите содержание обновленного one.xaml через стандартный Notepad.
Найдите записанный файл на компьютере и дважды кликните на него для просмотра в браузере.

Запись в SVG-Файл

Версия 4: закройте xml1.
Допишите код в функцию private void MenuFileSaveAsSVG( object obj, EventArgs ea ):

   SaveFileDialog dlg = new SaveFileDialog(); 
dlg.Filter = "svg files (*.svg)|*.svg|All files (*.*)|*.*" ;
if ( dlg.ShowDialog() != DialogResult.OK ) return;
Int32 n0 = dlg.FileName.IndexOf( ".svg" );
if ( n0 < 0 ) dlg.FileName += ".svg";
StreamWriter sw = new StreamWriter( dlg.FileName );
sw.WriteLine( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" );
sw.WriteLine( "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\">" );
sw.WriteLine( "<title>This file comes from my XML1.exe</title>" );
sw.WriteLine( "<polyline fill = \"none\" stroke = \"red\" stroke-width = \"4\" points = " );
sw.WriteLine( polygon_string ); sw.WriteLine( " />" ); sw.WriteLine( "</svg>" );
sw.Close();

Кликните на Start Without Debugging CtrlF5.
Нарисуйте единицу и запишите под именем "one.svg", нарисуйте двойку и запишите под именем "two.svg" и т.д. Контролируйте, чтобы файл был записан в директорию c:\temp\xml1\bin\debug . Иначе придется долго искать ваш  one.svg по всему компьютеру.
Откройте созданный файл c:\temp\xml1\bin\debug\one.svg в Notepad или Textpad.
Сравните строчки в файле с кодом функции void MenuFileSaveAsXAML( object obj, EventArgs ea ).
Измените строчку This file comes from my XML1.exe в строке < title > в коде, перекомпилируйте код и проверните все еще раз - и просмотрите содержание обновленного one.svg через стандартный Notepad.
Найдите записанный файл  one.svg на компьютере и дважды кликните на него для просмотра в браузере.

Чтение Text-, XAML- и SVG-Файлов

Версия 5: закройте xml1.
Допишите код в функцию private void MenuFileRead( object obj, EventArgs ea ):

   OpenFileDialog dlg = new OpenFileDialog(); 
dlg.Filter = "All files (*.*)|*.*";
if ( dlg.ShowDialog() != DialogResult.OK ) return;
StreamReader sr = new StreamReader( dlg.FileName );
String file_string = sr.ReadToEnd();
sr.Close();
Int32 n0 = file_string.IndexOf( "olyline" );
if ( n0 < 0 ) return;
Int32 n1 = file_string.IndexOf( "oints", n0+7 );
if ( n1 < 0 ) return;
Int32 n2 = file_string.IndexOf( "\"" , n1+5 ); if ( n2 < 0 ) return;
Int32 n3 = file_string.IndexOf( "\"" , n2+1 ); if ( n3 < 0 ) return;
String all_coordinates_string = file_string.Substring( n2+1, n3-n2-1 );
string[] coordinates_string_array = all_coordinates_string.Split(',');
polygon.Clear();
for ( Int32 i=0; i < coordinates_string_array.Length; i+=2 )
{
p1.X = Convert.ToInt32( coordinates_string_array[i ] );
p1.Y = Convert.ToInt32( coordinates_string_array[i+1] );
polygon.Add( p1 );
}
Invalidate();

Кликните на Start Without Debugging CtrlF5.
Теперь вы можете читать и отображать записанные фалы в вашем приложении xml1 .

Дополнительные задания

Кликните в главном меню Visual Studio Help -> View Help. Кликните папку Index и вбейте в поле фильтров .NET Framework. Затем перейдите в поле поиска и наберите последовательно ключевые слова: StringBuilder, ArrayList, MainMenu, FileDialog, SaveFileDialog, OpenFileDialog, StreamWriter, StreamReader, Convert, String class, methods: IndexOf и Split . Вы получите статьи, поясняющие назначение, синтаксис и примеры использования соответствующих объектов и методов. Прочтите описание всех использованных в этой работе методов. 
Закройте  Visual Studio, запустите Explorer, сотрите полностью директорию C:\temp\xml1.
Снова запустите Visual Studio и создайте туже программу еще раз и повторяйте процесс, пока не сможете создать аналогичную программу с нуля без описания.
Попробуйте различные варианты программы (под разными названиями  xml2, xml3 и т.д.), на базе приведенных примеров.

Сложное задание: Попробуйте создать версию содержащую список объектов ArrayList, который хранить под-списки  polygon[i], для того чтобы рисовать и сохранять несколько Полигонов. 

Анимируйте ваш XAML в браузере 
Пример 1: анимация вращения: загрузите ваш XAML-Файл в Textpad и добавьте код, как указано в примере - анимационная часть выделена красным.

<Canvas xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!--This file comes from my XML1.exe.-->
<Polyline Points = "127,97, 125,87, 131,79, 139,73, 149,70, 160,74, 169,85, 176,93, 183,108, 185,121, 181,136, 176,152, 171,170, 167,181, 162,192, 158,202, 149,220, 140,237, 132,248, 124,254, 115,262, 107,268, 97,277, 89,285, 85,295, 83,305, 82,315, 93,315, 110,316, 126,316, 145,316, 165,316, 176,316, 192,316, 203,316, 213,317, 224,317" Stroke="Red" StrokeThickness="4"> <!--Caution: No backslash!-->
<Polyline.RenderTransform>
   <RotateTransform x:Name="mytrans" CenterX="200" CenterY="200"/>
</Polyline.RenderTransform>
<Polyline.Triggers>
   <EventTrigger RoutedEvent="Polyline.Loaded">
      <BeginStoryboard>
         <Storyboard TargetName="mytrans" TargetProperty="Angle" RepeatBehavior="Forever">
            <DoubleAnimation From="0" To="360" Duration="0:0:2"/>
         </Storyboard>
      </BeginStoryboard>
   </EventTrigger>
</Polyline.Triggers>
</Polyline>
</Canvas>

Если браузер выдает ошибку, то это возможно из-за того, что вы забыли убрать за выражением  StrokeThickness="4" один "/>" (обратный слэш), который закрывает объект Polyline. Там должен остаться только  ">", так как теперь объект закрывается командой </Polyline> сразу после анимации.

Пример 2: анимация масштабирования: поменяйте 3 строки в примере 1:
до: <RotateTransform x:Name="mytrans" CenterX="200" CenterY="200"/>
после: <ScaleTransform  x:Name="mytrans" CenterX="200" CenterY="200"/>

до: <Storyboard TargetName="mytrans" TargetProperty= "Angle" RepeatBehavior="Forever">
после: <Storyboard TargetName="mytrans" TargetProperty="ScaleX" RepeatBehavior="Forever" AutoReverse="True">
до: <DoubleAnimation From="0" To="360" Duration="0:0:2"/>
после: <DoubleAnimation From="-1" To= "1" Duration="0:0:2"/>

Попробуйте сделать тоже самое масштабирование по оси Y

Материалы для чтения:

http://msdn.microsoft.com/en-us/library/ms752059(VS.100).aspx
https://ru.wikipedia.org/wiki/SVG
www.adobe.com/svg/overview/svg.htm

Удачи! :)