Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Windows Phone 8: Создаем приложение. Матрица. Часть 2

Anna | 17.06.2014 | нет комментариев

Windows Phone 8: Создаем приложение. Матрица. Часть 1
Windows Phone 8: Создаем приложение. Матрица. Часть 2

Здравствуйте. Сегодня мы продолжим создание приложения, используем новейший образец «Панорама», а так же добавим всевозможные настройки, что дозволит изменять все параметры матрицы. Сразу оговорюсь, что при задании крепко крупных чисел в некоторых настройках, круто понижается эффективность, но с этим мы еще будем бороться в следующих частях.

Так же хочу сразу припомнить основные цели этих статей: это написание приложения с применением максимального числа каждого: разных контролов, техник, образцов и т.д. Ну а так же приобретение финального продукта с заданными свойствами.

Скриншот работы приложения

Хотелось вторую часть написать всецело отточенную, в плане кода, впрочем размеры ее стали довольно огромными. Если сразу провести еще и оптимизацию, то это усложнит прослеживание логики. Оптимизация будет в дальнейшей части. Начнем.

Цели этой части

 

  1. Применять образец Панорама
  2. Создание настроек приложения

 

Добавлены следующие настройки

 

  • Скорость смены символов в заданном диапазоне
  • число змеек в очереди
  • число единовременно ползущих змеек за нажатие
  • Размер шрифта
  • Старт / Стоп
  • чистка экрана
  • Размер(число) клеточек в матрице
  • Длина змейки в заданном диапазоне
  • Горизонтальная / Вертикальная ориентация
  • Выбор языка падающих символов
  • Цвет фона матрицы
  • Цвет первого символа
  • Градиент для змейки

Дозволено посмотреть эти настройки на видео:

Перейдем к работе в Visual Studio

Создаем новейший план. Приложение Windows Phone с панорамой.
У меня имя будет SE_Matrix_2d_v_4.
Остальное как в прошлый раз.

MainPage.xaml

Здесь у нас добавилось немножко кода. В образце Панорама у меня 3 сегменты:

<!--Элемент управления Panorama-->
        <phone:Panorama Title="">
            <phone:Panorama.Background>
                <ImageBrush />
            </phone:Panorama.Background>

            <!--1-й элемент Panorama-->
            <phone:PanoramaItem >
...
            </phone:PanoramaItem>

            <!--2-й элемент Panorama-->
            <phone:PanoramaItem>   
...
            </phone:PanoramaItem>

            <!--3-й элемент Panorama-->
            <phone:PanoramaItem>   
...
            </phone:PanoramaItem>
        </phone:Panorama>

В 1-й элемент добавим непринужденно отображение матрицы. Здесь ничего не поменялось, все как и в первой части:

            <!--1-й элемент Panorama-->
            <phone:PanoramaItem >
                <Grid x:Name="LayoutRootSecond" Background="Black" Margin="0,-32,-2,7" RenderTransformOrigin="0.500,0.500" Tap="Event_Grid_Tap_LayoutRoot"/>
            </phone:PanoramaItem>

Во 2-й элемент управления добавлены первые 9 настроек из 13, описанных в начале статьи. Ничего трудного: наименование в TextBlock, TextBox для ввода значений и Button для использования заданного значения. Так же все обернуто в ScrollViewer для вероятности вертикальной прокрутки, так как список в один экран не влезает. В большинстве TextBox способ ввода выбран как числа, InputScope=«Number». Впрочем в паре элементов есть вероятность вводить негативные значения. Временно применяется всеобщая клавиатура InputScope=«Default».

Код. 2-й элемент Panorama

            <!--2-й элемент Panorama-->
            <phone:PanoramaItem>    
                <Grid x:Name="LayoutRootThierd" Grid.Column="1" Background="Transparent" Margin="0, 0,-2,7" RenderTransformOrigin="0.500,0.500" >
                    <ScrollViewer  HorizontalScrollBarVisibility="Auto"  >
                        <Grid x:Name="Grid_SettingsRight" Grid.Column="1" Background="Transparent" Margin="0, 0,-2,7" RenderTransformOrigin="0.500,0.500" >
                            <!-- Скорость падения змейки в мс/ Скорость смены символов в мс -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,3,0,0" TextWrapping="Wrap" Text="Скорость смены символов в мс" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_SppeedFrom" InputScope="Number" HorizontalAlignment="Left" Height="67" TextWrapping="Wrap" Text="20" VerticalAlignment="Top" Width="100" Margin="9,28,0,0"/>
                            <TextBox x:Name="TextBox_SppeedTo" InputScope="Number" HorizontalAlignment="Left" Height="67" TextWrapping="Wrap" Text="40" VerticalAlignment="Top" Width="100" Margin="114,28,0,0"/>
                            <Button x:Name="Button_SpeedApplay" Content=" Ok " HorizontalAlignment="Left" Height="65" Margin="288,30,0,0" VerticalAlignment="Top" Click="Event_Button_Click_SpeedApplay"/>

                            <!-- число змеек в очереди -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,95,0,0" TextWrapping="Wrap" Text="число змеек в очереди" VerticalAlignment="Top" RenderTransformOrigin="-0.256,0.233" Width="352"/>
                            <TextBox x:Name="TextBox_CountQueue" InputScope="Number" HorizontalAlignment="Left" Height="67" Margin="10,127,0,0" TextWrapping="Wrap" Text="5" VerticalAlignment="Top" Width="101" RenderTransformOrigin="0.49,-0.049"/>
                            <Button x:Name="Button_CountQueue" Content=" Ok " HorizontalAlignment="Left" Margin="287,127,0,0" VerticalAlignment="Top" Click="Event_Button_Click_CountQueue" RenderTransformOrigin="1.474,0.483" Height="67"/>

                            <!-- число змеек за нажатие -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,194,0,0" TextWrapping="Wrap" Text="число змеек за нажатие" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_СountSimultaneously" InputScope="Number" HorizontalAlignment="Left" Height="72" Margin="10,221,0,0" TextWrapping="Wrap" Text="1" VerticalAlignment="Top" Width="101"/>
                            <Button x:Name="Button_СountSimultaneously" Content=" Ok " HorizontalAlignment="Left" Margin="288,221,0,0" VerticalAlignment="Top" Click="Event_Button_Click_СountSimultaneously" RenderTransformOrigin="1.474,0.483"/>

                            <!-- Размер шрифта -->
                            <TextBlock HorizontalAlignment="Left" Margin="27,293,0,0" TextWrapping="Wrap" Text="Размер шрифта (  - [n])" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_FontSize" InputScope="Default" HorizontalAlignment="Left" Height="72" Margin="9,320,0,0" TextWrapping="Wrap" Text="-2" VerticalAlignment="Top" Width="101"/>
                            <Button x:Name="Button_FontSize" Content=" Ok " HorizontalAlignment="Left" Margin="288,320,0,0" VerticalAlignment="Top" Click="Event_Button_Click_FontSize" RenderTransformOrigin="1.474,0.483"/>

                            <!-- число смены символов в ячейке -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,392,0,0" TextWrapping="Wrap" Text="число смены символов" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_CountSymbol" InputScope="Number" HorizontalAlignment="Left" Height="72" Margin="10,419,0,0" TextWrapping="Wrap" Text="3" VerticalAlignment="Top" Width="101"/>
                            <Button x:Name="Button_CountSymbol" Content=" Ok " HorizontalAlignment="Left" Margin="288,419,0,0" VerticalAlignment="Top" Click="Event_Button_Click_CountSymbol" RenderTransformOrigin="1.474,0.483"/>

                            <!-- Сатрт / Стоп анимация -->
                            <TextBlock x:Name="TextBlock_OnOff" HorizontalAlignment="Left" Margin="28,491,0,0" TextWrapping="Wrap" Text="Вкл/Выкл анимацию" VerticalAlignment="Top" Width="352"/>
                            <ToggleButton x:Name="Button_Stop" Content="Stop" HorizontalAlignment="Left" Margin="214,523,0,0" VerticalAlignment="Top" Click="Event_Button_Click_Stop" Width="180"/>
                            <ToggleButton x:Name="Button_Start" Content="Start" HorizontalAlignment="Left" Margin="10,523,0,0" VerticalAlignment="Top" Click="Event_Button_Click_Start" Width="180"/>

                            <!-- чистка экрана -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,605,0,0" TextWrapping="Wrap" Text="Хотите очистит экран?" VerticalAlignment="Top" Width="352"/>
                            <Button Content=" YES " HorizontalAlignment="Left" Margin="10,632,0,0" VerticalAlignment="Top" Width="371" Click="Event_Button_Click_Clear"/>

                            <!-- Размер клетки для символа -->
                            <TextBlock HorizontalAlignment="Left" Margin="27,709,0,0" TextWrapping="Wrap" Text="Размер клетки для символа" VerticalAlignment="Top" Width="369"/>
                            <TextBox x:Name="TextBox_ElementSize" InputScope="Default" HorizontalAlignment="Left" Height="72" Margin="10,734,0,-17" TextWrapping="Wrap" Text="-6" VerticalAlignment="Top" Width="101"/>
                            <Button Content="Ok" HorizontalAlignment="Left" Margin="286,736,0,-19" VerticalAlignment="Top" Width="93" Click="Event_Button_Click_ElementSize"/>

                            <!-- Длина змейки -->
                            <TextBlock HorizontalAlignment="Left" Margin="27,809,0,0" TextWrapping="Wrap" Text="Длина змейки от: до:" VerticalAlignment="Top" Width="369"/>
                            <TextBox x:Name="TextBox_MinLength" InputScope="Number" HorizontalAlignment="Left" Height="72" Margin="10,834,0,-17" TextWrapping="Wrap" Text="3" VerticalAlignment="Top" Width="101"/>
                            <TextBox x:Name="TextBox_MaxLength" InputScope="Number" HorizontalAlignment="Left" Height="67" TextWrapping="Wrap" Text="10" VerticalAlignment="Top" Width="100" Margin="114,834,0,-17"/>
                            <Button Content="Ok" HorizontalAlignment="Left" Margin="286,836,0,-19" VerticalAlignment="Top" Width="93" Click="Event_Button_Click_MaxLength"/>

                            <!-- Горизонтакльное /  вертикальное расположение -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,905,0,0" TextWrapping="Wrap" Text="Повернуть матрицу" VerticalAlignment="Top" Width="352"/>
                            <ToggleButton x:Name="ToggleButton_Turn" Content="Вертикально" HorizontalAlignment="Left" Margin="10,932,0,0" VerticalAlignment="Top" Width="371" Click="Event_Button_Click_Turn"/>                        
                        </Grid>
                    </ScrollViewer>
                </Grid>

В третьем элементе остались последние 4 настройки: выбор языка, цвета и задание цвета первому элементу, фону, градиента для змейки. Так же все находится в ScrollViewer для вертикальной прокрутки. Впрочем здесь пришлось применять один нестандартный элемент управления, а именно ColorPicker. Его дозволено обнаружить в дополнительной библиотеке элементов с наименованием Coding4Fun.

Как установить Coding4Fun

У меня последние пару недель с нугет задачи, следственно качал вручную.
Переходим по ссылке.
Нажимаем на огромную красную кнопку с надписью «Via CodePlex Current Release Zip».
Качаем архив с именем «Coding4Fun.Toolkit (Windows Phone 8).zip».
Из архива копируем файл с именем «Coding4Fun.Toolkit.Controls.dll» к себе в план.
Заходим в план в папочку «References». Жмем на нее правой кнопкой — Добавить ссылку — Справа внизу выбираем Обзор… Находим нашу библиотеку и жмем ОК.
Заходим в Панель элементов. правой кнопкой где желательно в ее приделах — Предпочесть элементы… Выбираем вкладку Windows Phone Components. Справа внизу жмем обзор и вновь выбираем Coding4Fun.Toolkit.Controls.dll. Новые элементы будут подсвечены. Глядим, что б вблизи элемента ColorPicker была галочка.
Удостоверитесь, что в начале файла добавилась строчка

    xmlns:Controls="clr-namespace:Coding4Fun.Toolkit.Controls;assembly=Coding4Fun.Toolkit.Controls"

Продолжим. Перетаскиваем ColorPicker с Панели элементов. Назначаем имя. Сейчас выбирать цвет будем на одном элементе, а использовать выбранный цвет различными кнопками к различным колляциям матрицы.

                            <!-- Элемент выбора цвета. Codding4Fun -->
                            <Controls:ColorPicker x:Name="ColorPicker" VerticalAlignment="Top" Height="360" Margin="10,154,10,0"/>
                            <TextBlock HorizontalAlignment="Left" Margin="10,114,0,0" TextWrapping="Wrap" Text="Выбирете цвет" VerticalAlignment="Top" Width="412" Height="35"/>

Так же добавим кнопку, при нажатии на которую будет возникать всплывающее окно для выбора языка:

                            <!-- Выбор языка символов -->
                            <StackPanel Margin="0,0,0,649" >
                                <!-- Всплывающее окно -->
                                <Popup  Name="Popup_ButtonDropDownSelectLanguage" Margin="0,0,10,0">
                                    <StackPanel Margin="10,50,0,0" Background="DarkGray"  Width="393" Name="StackPanel_ButtonDropDownSelectLanguage">
                                    </StackPanel>
                                </Popup>
                                <TextBlock TextWrapping="Wrap" Text="Выбирете язык символов"/>
                                <!-- Кнопка, отображающая выбранный язык. При нажатии на нее всплывает окно -->
                                <Button Margin="0,10,10,0" x:Name="Button_SelectLanguage" Content="Китайский"  Click="Event_Button_Click_SelectLanguage" Height="74" />
                            </StackPanel>

И еще пара кнопок по аналогии со вторым элементом панорамы.

Код. 3-й элемент Panorama

            <!--3-й элемент Panorama-->
            <phone:PanoramaItem >
                <Grid x:Name="LayoutRoot123" Background="Transparent" Margin="0,-32,-2,7" RenderTransformOrigin="0.500,0.500" >
                    <ScrollViewer HorizontalScrollBarVisibility="Hidden" Margin="0,26,0,0" >                     
                        <Grid Margin="0,0,0,0" Height="984" >
                            <!-- Выбор языка символов -->
                            <StackPanel Margin="0,0,0,649" >
                                <!-- Всплывающее окно -->
                                <Popup  Name="Popup_ButtonDropDownSelectLanguage" Margin="0,0,10,0">
                                    <StackPanel Margin="10,50,0,0" Background="DarkGray"  Width="393" Name="StackPanel_ButtonDropDownSelectLanguage">
                                    </StackPanel>
                                </Popup>
                                <TextBlock TextWrapping="Wrap" Text="Выбирете язык символов"/>
                                <!-- Кнопка, отображающая выбранный язык. При нажатии на нее всплывает окно -->
                                <Button Margin="0,10,10,0" x:Name="Button_SelectLanguage" Content="Китайский"  Click="Event_Button_Click_SelectLanguage" Height="74" />
                            </StackPanel>

                            <!-- Элемент выбора цвета. Codding4Fun -->
                            <Controls:ColorPicker x:Name="ColorPicker" VerticalAlignment="Top" Height="360" Margin="10,154,10,0"/>
                            <TextBlock HorizontalAlignment="Left" Margin="10,114,0,0" TextWrapping="Wrap" Text="Выбирете цвет" VerticalAlignment="Top" Width="412" Height="35"/>

                            <!-- Выбор фона матрицы -->
                            <Button x:Name="Button_BackgroundColor" Content="Цвет фона" HorizontalAlignment="Left" Margin="10,533,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.404,-0.757" Width="412" Click="Event_Button_Click_ChangeBackground"/>

                            <!-- Выбор цвета первого символа -->
                            <Button x:Name="Button_FirstSymbolColor" Content="Цвет первого символа" HorizontalAlignment="Left" Margin="10,605,0,0" VerticalAlignment="Top" Width="412" Click="Event_Button_Click_FirstSymbolColor"/>

                            <!-- Выбор цвета градиента змейки -->
                            <TextBlock HorizontalAlignment="Left" Margin="10,682,0,0" TextWrapping="Wrap" Text="Выберите цвета градиента змейки" VerticalAlignment="Top" RenderTransformOrigin="-0.915,-1.222" Width="412"/>
                            <Button x:Name="Button_GradientFrom" Content="От" HorizontalAlignment="Left" Margin="10,714,0,0" VerticalAlignment="Top" Width="180" Click="Event_Button_Click_GradientFrom"/>
                            <Button x:Name="Button_GradientTo" Content="До" HorizontalAlignment="Left" Margin="245,714,0,0" VerticalAlignment="Top" Width="180" Click="Event_Button_Click_GradientTo"/>
                        </Grid>
                    </ScrollViewer>
                </Grid>
            </phone:PanoramaItem>

 

Код. MainPage.xaml

<phone:PhoneApplicationPage
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:UI="clr-namespace:Microsoft.Advertising.Mobile.UI;assembly=Microsoft.Advertising.Mobile.UI"
    xmlns:Controls="clr-namespace:Coding4Fun.Toolkit.Controls;assembly=Coding4Fun.Toolkit.Controls"
    x:Class="SE_Matrix_2d_v_4.MainPage"
    mc:Ignorable="d"
    d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait"  Orientation="Portrait"
    shell:SystemTray.IsVisible="False">

    <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
    <Grid x:Name="LayoutRoot" Background="Transparent">

        <!-- ПРИМЕЧАНИЕ О ЛОКАЛИЗАЦИИ:
            Дабы локализовать отображаемые строки, скопируйте их значения в соответствующим образом названные
            ключи в файле источников нейтрального языка приложения (AppResources.resx), а после этого
            замените жестко заданное текстовое значение между кавычками признаков
            на выражение привязки, указывающее на имя соответствующей строки.

            Пример:

                Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"

            Данная привязка указывает на строковый источник образца с именем "ApplicationTitle".

            Добавление поддерживаемых языков на вкладку "Свойства плана" создает
            новейший RESX-файл для всякого языка, в котором могут храниться переведенные значения
            строк пользовательского интерфейса. Привязка в этих примерах вызывает отрисовку
            значений признаков из RESX-файла, соответствующего
            CurrentUICulture приложения во время выполнения.
         -->

        <!--Элемент управления Panorama-->
        <phone:Panorama Title="">
            <phone:Panorama.Background>
                <ImageBrush />
            </phone:Panorama.Background>

            <!--1-й элемент Panorama-->
            <phone:PanoramaItem >
                <!--Здесь создается и отображается матрица-->
                <Grid x:Name="LayoutRootSecond" Background="Black" Margin="0,-32,-2,7" RenderTransformOrigin="0.500,0.500" Tap="Event_Grid_Tap_LayoutRoot"/>
            </phone:PanoramaItem>

            <!--2-й элемент Panorama-->
            <phone:PanoramaItem>    
                <Grid x:Name="LayoutRootThierd" Grid.Column="1" Background="Transparent" Margin="0, 0,-2,7" RenderTransformOrigin="0.500,0.500" >
                    <ScrollViewer  HorizontalScrollBarVisibility="Auto"  >
                        <Grid x:Name="Grid_SettingsRight" Grid.Column="1" Background="Transparent" Margin="0, 0,-2,7" RenderTransformOrigin="0.500,0.500" >
                            <!-- Скорость падения змейки в мс/ Скорость смены символов в мс -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,3,0,0" TextWrapping="Wrap" Text="Скорость смены символов в мс" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_SppeedFrom" InputScope="Number" HorizontalAlignment="Left" Height="67" TextWrapping="Wrap" Text="20" VerticalAlignment="Top" Width="100" Margin="9,28,0,0"/>
                            <TextBox x:Name="TextBox_SppeedTo" InputScope="Number" HorizontalAlignment="Left" Height="67" TextWrapping="Wrap" Text="40" VerticalAlignment="Top" Width="100" Margin="114,28,0,0"/>
                            <Button x:Name="Button_SpeedApplay" Content=" Ok " HorizontalAlignment="Left" Height="65" Margin="288,30,0,0" VerticalAlignment="Top" Click="Event_Button_Click_SpeedApplay"/>

                            <!-- число змеек в очереди -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,95,0,0" TextWrapping="Wrap" Text="число змеек в очереди" VerticalAlignment="Top" RenderTransformOrigin="-0.256,0.233" Width="352"/>
                            <TextBox x:Name="TextBox_CountQueue" InputScope="Number" HorizontalAlignment="Left" Height="67" Margin="10,127,0,0" TextWrapping="Wrap" Text="5" VerticalAlignment="Top" Width="101" RenderTransformOrigin="0.49,-0.049"/>
                            <Button x:Name="Button_CountQueue" Content=" Ok " HorizontalAlignment="Left" Margin="287,127,0,0" VerticalAlignment="Top" Click="Event_Button_Click_CountQueue" RenderTransformOrigin="1.474,0.483" Height="67"/>

                            <!-- число змеек за нажатие -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,194,0,0" TextWrapping="Wrap" Text="число змеек за нажатие" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_СountSimultaneously" InputScope="Number" HorizontalAlignment="Left" Height="72" Margin="10,221,0,0" TextWrapping="Wrap" Text="1" VerticalAlignment="Top" Width="101"/>
                            <Button x:Name="Button_СountSimultaneously" Content=" Ok " HorizontalAlignment="Left" Margin="288,221,0,0" VerticalAlignment="Top" Click="Event_Button_Click_СountSimultaneously" RenderTransformOrigin="1.474,0.483"/>

                            <!-- Размер шрифта -->
                            <TextBlock HorizontalAlignment="Left" Margin="27,293,0,0" TextWrapping="Wrap" Text="Размер шрифта (  - [n])" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_FontSize" InputScope="Default" HorizontalAlignment="Left" Height="72" Margin="9,320,0,0" TextWrapping="Wrap" Text="-2" VerticalAlignment="Top" Width="101"/>
                            <Button x:Name="Button_FontSize" Content=" Ok " HorizontalAlignment="Left" Margin="288,320,0,0" VerticalAlignment="Top" Click="Event_Button_Click_FontSize" RenderTransformOrigin="1.474,0.483"/>

                            <!-- число смены символов в ячейке -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,392,0,0" TextWrapping="Wrap" Text="число смены символов" VerticalAlignment="Top" Width="352"/>
                            <TextBox x:Name="TextBox_CountSymbol" InputScope="Number" HorizontalAlignment="Left" Height="72" Margin="10,419,0,0" TextWrapping="Wrap" Text="3" VerticalAlignment="Top" Width="101"/>
                            <Button x:Name="Button_CountSymbol" Content=" Ok " HorizontalAlignment="Left" Margin="288,419,0,0" VerticalAlignment="Top" Click="Event_Button_Click_CountSymbol" RenderTransformOrigin="1.474,0.483"/>

                            <!-- Сатрт / Стоп анимация -->
                            <TextBlock x:Name="TextBlock_OnOff" HorizontalAlignment="Left" Margin="28,491,0,0" TextWrapping="Wrap" Text="Вкл/Выкл анимацию" VerticalAlignment="Top" Width="352"/>
                            <ToggleButton x:Name="Button_Stop" Content="Stop" HorizontalAlignment="Left" Margin="214,523,0,0" VerticalAlignment="Top" Click="Event_Button_Click_Stop" Width="180"/>
                            <ToggleButton x:Name="Button_Start" Content="Start" HorizontalAlignment="Left" Margin="10,523,0,0" VerticalAlignment="Top" Click="Event_Button_Click_Start" Width="180"/>

                            <!-- чистка экрана -->
                            <TextBlock HorizontalAlignment="Left" Margin="28,605,0,0" TextWrapping="Wrap" Text="Хотите очистит экран?" VerticalAlignment="Top" Width="352"/>
                            <Button Content=" YES " HorizontalAlignment="Left" Margin="10,632,0,0" VerticalAlignment="Top" Width="371" Click="Event_Button_Click_Clear"/>

                            <!-- Размер клетки для символа -->
                            <TextBlock HorizontalAlignment="Left" Margin="27,709,0,0" TextWrapping="Wrap" Text="Размер клетки для символа" VerticalAlignment="Top" Width="369"/>
                            <TextBox x:Name="TextBox_ElementSize" InputScope="Default" HorizontalAlignment="Left" Height="72" Margin="10,734,0,-17" TextWrapping="Wrap" Text="-6" VerticalAlignment="Top" Width="101"/>
                            <Button Content="Ok" HorizontalAlignment="Left" Margin="286,736,0,-19" VerticalAlignment="Top" Width="93" Click="Event_Button_Click_ElementSize"/>

                            <!-- Длина змейки -->
                            <TextBlock HorizontalAlignment="Left" Margin="27,809,0,0" TextWrapping="Wrap" Text="Длина змейки от: до:" VerticalAlignment="Top" Width="369"/>
                            <TextBox x:Name="TextBox_MinLength" InputScope="Number" HorizontalAlignment="Left" Height="72" Margin="10,834,0,-17" TextWrapping="Wrap" Text="3" VerticalAlignment="Top" Width="101"/>
                            <TextBox x:Name="TextBox_MaxLength" InputScope="Number" HorizontalAlignment="Left" Height="67" TextWrapping="Wrap" Text="10" VerticalAlignment="Top" Width="100" Margin="114,834,0,-17"/>
                            <Button Content="Ok" HorizontalAlignment="Left" Margin="286,836,0,-19" VerticalAlignment="Top" Width="93" Click="Event_Button_Click_MaxLength"/>

                            <!-- Горизонтакльное /  вертикаль4>
Первым делом создаем свойства класса, которые будут отвечать за настройки:
Код. Свойства класса

        /* ****************************** Свойства класса ****************************** */
        // Случайное число
        Random random = new Random();

        // число змеек позже нажатия на экран в очереди
        int iteration = 5;

        // число единовременно появляющихся змеек позже нажатия
        int countSimultaneously = 3;

        // Скорость смены символов
        int speedFrom = 20;
        int speedTo = 40;

        // Размер клетки для символа
        int addingSize = -6;

        // Итоговый размер шрифта
        int fontSize;

        // Минимальная и максимальная длина змейки
        int minLength = 10;
        int maxLength = 15;

        // Получаем растяжение экрана
        double ScreenWidth = System.Windows.Application.Current.Host.Content.ActualWidth - 60;
        double ScreenHeight = System.Windows.Application.Current.Host.Content.ActualHeight - 100;

        // Коеффициент, отвечающий за количесвто ячеек и Отчасти за размер шрифта
        int kolich = 30;

        // Размер шрифта задается по формуле kolich   addingFontSize.
        int addingFontSize = -2;

        // число смены символов в ячейке
        int countSymbol = 3;

        // Включить (false), отключить (true) матрицу
        bool flagOnOff = false;

        // Включить (false), отключить (true) "поворот экрана"
        bool turnOnOff = true;

        // число строк и столбцов
        int countWidth = 10;
        int countHeight = 10;

        // Словарь, в котором хранятся идентификаторы языка и соответствующие ему ASCII коды символов
        Dictionary<string, int[]> languages = new Dictionary<string, int[]>();

        // Задаю язык по-умолчанию
        string actualLanguage = "Русский";

        // Флаг, отвечающий за показывать (true) / не показывать (false) всплывающее окно (PopUp) при выборе языка
        bool flagShowLanguages = true;

        // Цвет фона матрицы, ARGB
        Dictionary<string, int> colorMatrixBackground = new Dictionary<string, int>();

        // Цвет первого символа, ARGB
        Dictionary<string, int> colorFirstSymbol = new Dictionary<string, int>();

        // Цвет градиента змейки от (2-й символ) - до (конечный символ), ARGB
        Dictionary<string, int> gradientFrom = new Dictionary<string, int>();
        Dictionary<string, int> gradientTo = new Dictionary<string, int>();

 Разгляди конструктор класса:
Код. Конструктор класса

        // Конструктор
        public MainPage()
        {
            InitializeComponent();

            // Вызываем функцию настройки исходных значений цветов фона, символов и т.д.
            BeginColorSettings();

            // Инициализируем список доступных языков, а также соответствующие им ASCII коды символов
            ListLanguages();

            // число строк и столбцов
            this.countWidth = (int)Math.Round(ScreenWidth / (kolich   addingSize))   Math.Abs(addingSize);
            this.countHeight = (int)Math.Round(ScreenHeight / (kolich   addingSize))   5   Math.Abs(addingSize);

            // Создание сетки элементов, в которой будет сыпаться матрица
            CreateElement();

            // Подсвечиваем кнопку Вкл либо Выкл,  зависит от флага
            if (this.flagOnOff)
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Cyan);
                Button_Start.Background = new SolidColorBrush(Colors.Black);
            }
            else
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Black);
                Button_Start.Background = new SolidColorBrush(Colors.Cyan);
            }

            // Меняем цвет фона матрицы
            ChangeBackground();
        }

 Давайте начнем с выбора цвета. Для начала инициализируем настройки по умолчанию в способе BeginColorSettings();
Код. BeginColorSettings

        // Исходные настройки цветов фона, символов и т.д
        private void BeginColorSettings()
        {
            // Задаем исходный цвет фона матрицы
            colorMatrixBackground["A"] = 0;
            colorMatrixBackground["R"] = 0;
            colorMatrixBackground["G"] = 0;
            colorMatrixBackground["B"] = 0;

            // Задаем первоначальный цвет первого символа
            colorFirstSymbol["A"] = 255;
            colorFirstSymbol["R"] = 248;
            colorFirstSymbol["G"] = 248;
            colorFirstSymbol["B"] = 255;

            // Задаем исходный цвет градиента от (второго символа в змейке)
            gradientFrom["A"] = 255;
            gradientFrom["R"] = 1;
            gradientFrom["G"] = 255;
            gradientFrom["B"] = 1;

            // Задаем исходный цвет градиента до (последнего символа в змейке)
            gradientTo["A"] = 0;
            gradientTo["R"] = 0;
            gradientTo["G"] = 0;
            gradientTo["B"] = 0;
        }
 
Цвет фона матрицы

 Задаем цвет фона. Легко присваиваем соответствующему признаку цвет, состоящий из компонент ARGB. Отчего четыре составляющие? Прозрачность (А) нам будет необходима для создания результата затухания. 
Код. ChangeBackground

        // Способ метаморфозы цвета фона матрицы. По умолчанию черный.
        private void ChangeBackground()
        {
            // Задаю цвет фона матрицы
            LayoutRootSecond.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(colorMatrixBackground["A"]) /*Opacity*/,
                R = (byte)(colorMatrixBackground["R"]) /*Red*/,
                G = (byte)(colorMatrixBackground["G"]) /*Green*/,
                B = (byte)(colorMatrixBackground["B"]) /*Blue*/
            });
        }

 Впрочем это легко способ. Для того, что б цвет подлинно поменялся, необходимо забрать его из контролла ColorPicker, присвоить свойству и вызвать способ ChangeBackground:

Код. Event_Button_Click_ChangeBackground

        // Меняем цвет фона матрицы
        private void Event_Button_Click_ChangeBackground(object sender, RoutedEventArgs e)
        {
            // Передаем в качество класса colorMatrixBackground выбранный цвет из элемента ColorPicker для фона матрицы
            colorMatrixBackground["A"] = ColorPicker.Color.A;
            colorMatrixBackground["R"] = ColorPicker.Color.R;
            colorMatrixBackground["G"] = ColorPicker.Color.G;
            colorMatrixBackground["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет фона матрицы соответствующей кнопке
            Button_BackgroundColor.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(colorMatrixBackground["A"]) /*Opacity*/,
                R = (byte)(colorMatrixBackground["R"]) /*Red*/,
                G = (byte)(colorMatrixBackground["G"]) /*Green*/,
                B = (byte)(colorMatrixBackground["B"]) /*Blue*/
            });

            // Задаем выбранный цвет фона матрицы
            ChangeBackground();
        }
 
Цвет первого символа змейки

 Изменим цвет первого символа змейки. 1-й символ змейки вызывается в способе RandomElementQ_Async асинхронно:
                    // Вызываем на прорисовку 1-й, самый блестящий падающий элемент. Асинхронно.
                    // colorFirstSymbol["A"]. Цвет задается через настройку.                   
                    await Change(element, timeOut, colorFirstSymbol);
 
Код. Event_Button_Click_FirstSymbolColor

        // Метаморфоза цвета первого символа
        private void Event_Button_Click_FirstSymbolColor(object sender, RoutedEventArgs e)
        {
            // Передаем в качество класса colorFirstSymbol выбранный цвет из элемента ColorPicker для фона матрицы
            colorFirstSymbol["A"] = ColorPicker.Color.A;
            colorFirstSymbol["R"] = ColorPicker.Color.R;
            colorFirstSymbol["G"] = ColorPicker.Color.G;
            colorFirstSymbol["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет фона матрицы соответствующей кнопке
            Button_FirstSymbolColor.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(colorFirstSymbol["A"]) /*Opacity*/,
                R = (byte)(colorFirstSymbol["R"]) /*Red*/,
                G = (byte)(colorFirstSymbol["G"]) /*Green*/,
                B = (byte)(colorFirstSymbol["B"]) /*Blue*/
            });
        }
 
Задание цветов для градиента

 Ну вот и добрались до градиента. Первое, что необходимо сделать — это в обработчиках событий соответствующих кнопок сберечь цвет в свойства класса:
Код. Event_Button_Click_Gradient

        // Настройки. Задаем градиент змейки. Цвет второго символа.
        private void Event_Button_Click_GradientFrom(object sender, RoutedEventArgs e)
        {
            // Передаем в качество класса gradientFrom выбранный цвет из элемента ColorPicker для фона матрицы
            gradientFrom["A"] = ColorPicker.Color.A;
            gradientFrom["R"] = ColorPicker.Color.R;
            gradientFrom["G"] = ColorPicker.Color.G;
            gradientFrom["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет градиента от змейки соответствующей кнопке
            Button_GradientFrom.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(gradientFrom["A"]) /*Opacity*/,
                R = (byte)(gradientFrom["R"]) /*Red*/,
                G = (byte)(gradientFrom["G"]) /*Green*/,
                B = (byte)(gradientFrom["B"]) /*Blue*/
            });
        }

         / Настройки. Задаем градиент змейки. Цвет последнего символа.
        private void Event_Button_Click_GradientTo (object sender, RoutedEventArgs e)
        {
            // Передаем в качество класса gradientTo выбранный цвет из элемента ColorPicker для фона матрицы
            gradientTo["A"] = ColorPicker.Color.A;
            gradientTo["R"] = ColorPicker.Color.R;
            gradientTo["G"] = ColorPicker.Color.G;
            gradientTo["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет градиента до змейки соответствующей кнопке
            Button_GradientTo.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(gradientTo["A"]) /*Opacity*/,
                R = (byte)(gradientTo["R"]) /*Red*/,
                G = (byte)(gradientTo["G"]) /*Green*/,
                B = (byte)(gradientTo["B"]) /*Blue*/
            });
        }     

 Сейчас эти цвета необходимо применить к нашим символам. Переходим в способ RandomElementQ_Async и немного меняем ту часть, которая отвечает за расчет яркости и цвета символов дальнейшим образом:
Код. RandomElementQ_Async и Change

Меняем

//int greenCoefficient = (int)Math.Round(255 / (double)(count   1)) - 1;

на

                    int A_Coefficient = (int)Math.Round((gradientFrom["A"] - 10) / (double)(count   1)) - 1;
                    int R_Coefficient = (int)Math.Round((gradientFrom["R"] - gradientTo["R"]) / (double)(count   1)) - 1;
                    int G_Coefficient = (int)Math.Round((gradientFrom["G"] - gradientTo["G"]) / (double)(count   1)) - 1;
                    int B_Coefficient = (int)Math.Round((gradientFrom["B"] - gradientTo["B"]) / (double)(count   1)) - 1;

А так же перед вызовом Task dsvv = Change(previousElement, timeOut, SymbolColor); добавляем:

                            // Вызываем извлеченные элементы
                            // (greenCoefficient * (k   1)) - 20 Высчитываем яркость так, что б разница между первым и последним была на всех змейках идентичная
                            // и равномерно распределялась самостоятельно от ее длины(числа элементов)
                            SymbolColor["A"] = (gradientFrom["A"] - ((i - k) * A_Coefficient));
                            SymbolColor["R"] = (gradientFrom["R"] - ((i - k) * R_Coefficient));
                            SymbolColor["G"] = (gradientFrom["G"] - ((i - k) * G_Coefficient));
                            SymbolColor["B"] = (gradientFrom["B"] - ((i - k) * B_Coefficient));

И меняем определение способа Change, где взамен int Opacity ставим Dictionary<string, int> SymbolColor:

 // Способ метаморфозы символов в заданном элеменете
        public async Task Change(TextBlock element, int timeOut, Dictionary<string, int> SymbolColor)

А внутри этого способа задаем цвет символа с поддержкой новых значений. Меняем

            // Формируем необходимый цвет с заданной яркостью
            SolidColorBrush NewColor = new SolidColorBrush(new Color()
            {
                A = (byte)(255) /*Opacity*/,
                R = (byte)(0) /*Red*/,
                G = (byte)(Opacity) /*Green*/,
                B = (byte)(0) /*Blue*/
            });

на

            // Формируем необходимый цвет с заданной яркостью
            SolidColorBrush NewColor = new SolidColorBrush(new Color()
            {
                A = (byte)(SymbolColor["A"]) /*Opacity*/,
                R = (byte)(SymbolColor["R"]) /*Red*/,
                G = (byte)(SymbolColor["G"]) /*Green*/,
                B = (byte)(SymbolColor["B"]) /*Blue*/
            });
 
Выбор языка

 С цветами разобрались. Сейчас давайте решим вопрос с выбором языка. В конструкторе класса мы вызывали способ ListLanguages для инициализации доступных языков. Разглядим его больше детально:
Код. ListLanguages

        // Заполняем словарь идентификаторами языка и соответствующие ему ASCII коды символов
        public void ListLanguages()
        {
            // Добавляем в словарь ключь -  наименование языка и значение -  массив, состоящий из ASCII кодов символов.
            languages.Add("Матрица", new int[] { 64, 127 });
            languages.Add("Китаский", new int[] { 19968, 20223 });
            languages.Add("Английский", new int[] { 64, 127 });
            languages.Add("Цифры", new int[] { 48, 57 });
            languages.Add("Случайные символы", new int[] { 0, 1000 });
            languages.Add("Русский", new int[] { 1040, 1103 });

            // Добавляем языки в всплывающую панель для вероятности их выбора
            foreach (var language in languages)
            {
                // Создаю кнопку
                Button newLang = new Button();

                // Задаю надпись кнопки, соответствует языку
                newLang.Content = language.Key.ToString();

                // Горизонтальное выравнивание
                newLang.HorizontalAlignment = HorizontalAlignment.Stretch;

                // Толщина рамки
                newLang.BorderThickness = new Thickness(1);

                // Смещение
                newLang.Margin = new Thickness(0,0,0,0);

                // Событие, при нажатии на кнопку. Одно на все.
                newLang.Click  = Event_Button_Click_SelectLanguageUpdate;

                // Добавляю созданую и настроенную кнопку в всплывающее окно
                StackPanel_ButtonDropDownSelectLanguage.Children.Add(newLang);
            }
        }

 Сейчас добавляем обработчик кнопки, в которой показывается выбранный язык и при нажатии на которую возникает всплывающее окно:
Код. Event_Button_Click_SelectLanguage

        // Кнопка, в которой показывается нынешнее выбранное значение языка. при нажатии на нее всплывает меню для выбора иного языка.
        private void Event_Button_Click_SelectLanguage(object sender, RoutedEventArgs e)
        {
            // Показывать (true) / не показывать (false) всплывающее окно (PopUp) при выборе языка
            if (flagShowLanguages)
            {
                // Показать всплывающее окно
                Popup_ButtonDropDownSelectLanguage.IsOpen = true;
                flagShowLanguages = false;
            }
            else
            {
                // Спрятать всплывающее окно
                Popup_ButtonDropDownSelectLanguage.IsOpen = false;
                flagShowLanguages = true;
            }
        }

 В сплывающем окне находятся кнопки, при нажатии на которые и выбирается необходимый язык. У всех кнопок назначен один и тот же обработчик событий, тот, что определяет контент кнопки, тот, что и является ключом в словаре для выбора языка. Задаем значение выбранного языка в качество класса actualLanguage:
Код. Event_Button_Click_SelectLanguageUpdate

        // Всплывающее меню выбора языка.
        private void Event_Button_Click_SelectLanguageUpdate(object sender, RoutedEventArgs e)
        {
            // Если нажата кнопка выбора языка, но иной язык не выбран, то при повторном нажатии меню свернется. 
            if (!flagShowLanguages)
            {
                // Спрятать всплывающее окно
                Popup_ButtonDropDownSelectLanguage.IsOpen = false;
                flagShowLanguages = true;
            }

            // Получаем наименование кнопки, которую нажали
            string newLanguagr = (sender as Button).Content.ToString();

            // Обновляем наименование кнопки, отображающей выбранный язык
            Button_SelectLanguage.Content = newLanguagr;

            // Задаем значение языка, в котором выбирать символы случайным образом
            this.actualLanguage = newLanguagr;
        }

 Сейчас все готово, для того, что б дозволено было предпочесть беспричинный символ из заданного диапазона. Напишем способ RandomActualSymbol, тот, что и будет возвращать беспричинный символ:
Код. RandomActualSymbol

        // Вызываем эту функцию всюду, где необходимо показать беспричинный символ из выбранного языка.
        public string RandomActualSymbol()
        {
            // Получаем массив по ключу, содержащий ASCII коды символов языка, заданного в actualLanguage
            int[] sd = (languages[actualLanguage]);

            // Выбираем случайнфй символ в диапазоне от первого до последнего символа в заданом языке
            return char.ConvertFromUtf32(this.random.Next((int)sd.GetValue(0), (int)sd.GetValue(1)));
        }

 И подставим вызов этого способа всюду, где необходимо задать символ. Скажем, в способе Change:
                // Всякий раз различный символ из заданного диапазона
                element.Text = RandomActualSymbol();   
 
Старт / Стоп

 Здесь все дюже легко. В зависимости от флага flagOnOff, тот, что задан как качество класса завершаем циклы, в которых происходит обработка непринужденно самой матрицы. 
 Задаем обработчики событий кнопок «Старт» и «Стоп», которые легко меняют состояние флага на противоположный:
Код. Event_Button_Click_Stop и Event_Button_Click_Start

        // Настройки. Выключаем вероятность анимирования змеек
        private void Event_Button_Click_Stop(object sender, RoutedEventArgs e)
        {
            this.flagOnOff = true;

            // Если flagOnOff в true то подсвечиваем кнопку Stop
            if (this.flagOnOff)
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Cyan);
                Button_Start.Background = new SolidColorBrush(Colors.Black);
            }
        }

        // Настройки. Включаем вероятность анимирования змеек
        private void Event_Button_Click_Start(object sender, RoutedEventArgs e)
        {
            this.flagOnOff = false;

            // Если flagOnOff в false то подсвечиваем кнопку Start
            if (!this.flagOnOff)
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Black);
                Button_Start.Background = new SolidColorBrush(Colors.Cyan);
            }
        }

 И добавляем внутри нескольких циклов примитивное условие
 if (flagOnOff) break;

 А именно в циклах способов Event_Grid_Tap_LayoutRoot, RandomElementQ_Async, Change:
Код. Остановка матрицы

В Event_Grid_Tap_LayoutRoot:

            // число единовременно появляющихся змеек позже нажатия
            for (int i = 0; i < countSimultaneously; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

В RandomElementQ_Async здесь:


            // Цикл формирует змейку заданной длины length
            for (int i = 0; i <= length; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

и здесь:

                    // Перебираем все  элементы, составляющие змейку на данном этапе. С всяким циклом она возрастает, пока не достигнет требуемой длины.
                    for (int k = 0; k <= i; k  )
                    {                       
                        // Останавливаем анимацию
                        if (flagOnOff) break;

В Change:

            // число смены символов в всякой ячейке
            for (int i = 0; i < countSymbol; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

 Отчего даже в четырех местах? Если змеек немного, то все типично. Но если число змеек неприлично огромное, скажем, 50 , то матрица останавливается с приметными тормозами. А так мы останавливаем непринужденно всякий элемент, принимающий участие в работе механизма матрицы.
 Ну и напоследок добавим красоты, для задания цвета кнопки, которая теперь нажата. В конструкторе за это отвечает данный код:
            // Подсвечиваем кнопку Вкл либо Выкл,  зависит от флага
            if (this.flagOnOff)
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Cyan);
                Button_Start.Background = new SolidColorBrush(Colors.Black);
            }
            else
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Black);
                Button_Start.Background = new SolidColorBrush(Colors.Cyan);
            }

 Вернее сказать, задания цвета кнопки при инициализации приложения.

чистка экрана

 При срабатывании события Event_Button_Click_Clear происходит тоже самое, что и в CreateElement, только без создания элементов. Перебираются все элементы и как символ задается пустота:
Код. Event_Button_Click_Clear

        // Настройки. чистка экрана
        private void Event_Button_Click_Clear(object sender, RoutedEventArgs e)
        {
            // Перебираем сетку ячеек и устанавливаем в всякой ячейке как символ - пустоту
            for ( int i = 0; i < countWidth; i  )
            {
                for (int j = 0; j < countHeight; j  )
                {
                    // Формируем имя элемента, тот, что будем очищать
                    string elementName = "TB_"   i   "_"   j;

                    // Получаем элемент по его имени
                    object wantedNode = LayoutRoot.FindName(elementName);
                    TextBlock element = (TextBlock)wantedNode;

                    // Очищаем значение
                    element.Text = "";
                }
            }
        }
 
Горизонтальная / Вертикальная ориентация

 Вновь все исходит от флага turnOnOff. Что мы делаем? Останавливаем матрицу. Меняем надпись на кнопке. Меняем местами число строк и столбцов. Удаляем матрицу. Создаем матрицу вновь, вызывая способ CreateElement:
Код. Event_Button_Click_Turn

        // Настройки. Вериткальная / горизонтальная матрица
        private void Event_Button_Click_Turn(object sender, RoutedEventArgs e)
        {
            // Включить (true), отключить (false) "поворот экрана"
            if (turnOnOff)
            {
                // Сберегаем значение false в качество класса turnOnOff
                this.turnOnOff = false;

                // Надпись на конопке с именем ToggleButton_Turn меняю на Горизонтально
                ToggleButton_Turn.Content = "Горизонтально";

                // число строк и столбцов. Инвертируем для горизонтали.
                this.countHeight = (int)Math.Round(ScreenWidth / (kolich   addingSize))   5   Math.Abs(addingSize);
                this.countWidth = (int)Math.Round(ScreenHeight / (kolich   addingSize))   5   Math.Abs(addingSize);
            }
            else
            {
                // Сберегаем значение true в качество класса turnOnOff
                this.turnOnOff = true;

                // Надпись на конопке с именем ToggleButton_Turn меняю на Вертикально
                ToggleButton_Turn.Content = "Вертикально";

                // число строк и столбцов. Возвращаем для вертикали
                this.countWidth = (int)Math.Round(ScreenWidth / (kolich   addingSize))   Math.Abs(addingSize);
                this.countHeight = (int)Math.Round(ScreenHeight / (kolich   addingSize))   5   Math.Abs(addingSize);
            }

            // Останавливаем матрицу
            this.flagOnOff = true;

            // Удаляем матрицу (сами ячейки)
            LayoutRootSecond.Children.Clear();

            // Перерисовываем ячейки снова с новыми параметрами
            CreateElement();

            // Включаем матрицу
            this.flagOnOff = false;
        }
 
Метаморфоза размера матрицы

 Логика схожа с поворотом. Исключительная разница в том, что мы не меняем местами число строк и столбцов, а добавляем к расчету числа строк и столбцов показатель, введенный пользователем:
Код. Event_Button_Click_ElementSize

        // Настройки. Размер клетки для символа
        private void Event_Button_Click_ElementSize(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_ElementSize в качество класса addingSize
            this.addingSize = int.Parse(TextBox_ElementSize.Text.ToString());

            // число строк и столбцов. Возвращаем для вертикали
            this.countWidth = (int)Math.Round(ScreenWidth / (kolich   addingSize))   Math.Abs(addingSize);
            this.countHeight = (int)Math.Round(ScreenHeight / (kolich   addingSize))   5   Math.Abs(addingSize);

            // Останавливаем матрицу
            this.flagOnOff = true;

            // Удаляем матрицу (сами ячейки)
            LayoutRootSecond.Children.Clear();

            // Перерисовываем ячейки снова с новыми параметрами
            CreateElement();

            // Включаем матрицу
            this.flagOnOff = false;
        }
 
Остальные настройки

 Исполнены по одному образцу. Получаем введенное пользователем значение, записываем его в соответствующее качество класса, которое и подставляем в надобном месте, взамен статических значений которые были в предыдущей части.
 Скажем число единовременно ползущих змеек:
Код. Event_Grid_Tap_LayoutRoot

Взамен статики

        // Событие при нажатии на эелемет Grid (на экран)
        private void Event_Grid_Tap_LayoutRoot(object sender, System.Windows.Input.GestureEventArgs e)
        {
            // число единовременно появляющихся змеек позже нажатия
            for (int i = 0; i < 5; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

                Start();

                //Задержка между вызовами. Для красоты матрицы.
                Task.Delay(100);
            }
        }

Делаем динамику:

        // Событие при нажатии на эелемет Grid (на экран)
        private void Event_Grid_Tap_LayoutRoot(object sender, System.Windows.Input.GestureEventArgs e)
        {
            // число единовременно появляющихся змеек позже нажатия
            for (int i = 0; i < countSimultaneously; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

                Start();

                //Задержка между выго элемента TextBlock
                    // Также отвечает за разворот вертикальный / горизонтальный
                    int turnY = j * (kolich   addingSize);
                    int turnX = i * (kolich   addingSize);

                    // Включить (false), отключить (true) "поворот экрана"
                    if (turnOnOff)
                    {
                        // Вертикальное, стандартное расположение
                        element.Margin = new Thickness(turnX, turnY, 0, 0);
                    }
                    else
                    {
                        // Повернутое, горизонтальное расположение
                        element.Margin = new Thickness(turnY, turnX, 0, 0);
                    }

                    // Задаем цвет символа
                    element.Foreground = new SolidColorBrush(Colors.Green);

                    // Задаем размер шрифта
                    element.FontSize = fontSize;

                    // Добавляем сделанный элемент в Grid
                    LayoutRootSecond.Children.Add(element);
                }
            }
        }

        // Событие при нажатии на эелемет Grid (на экран)
        private void Event_Grid_Tap_LayoutRoot(object sender, System.Windows.Input.GestureEventArgs e)
        {
            // число единовременно появляющихся змеек позже нажатия
            for (int i = 0; i < countSimultaneously; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

                Start();

                //Задержка между вызовами. Для красоты матрицы.
                Task.Delay(100);
            }
        }

        // Способ запуска змейки
        public async void Start()
        {
            int count;

            // число змеек позже нажатия на экран в очереди
            for (count = 0; count < iteration; count  )
            {
                // Предисловие змейки по горизонтали случайным образом
                int ranX = random.Next(0, countWidth);

                // Предисловие змейки по вертикали случайным образом
                int ranY = random.Next(-5, countHeight - 1);

                // Длина змейки случайным образом
                int length = random.Next(minLength, maxLength);

                // Скорость смены символов в змейке случайным образом
                int time = random.Next(speedFrom, speedTo);

                await Task.Delay(1);

                //Обработка змейки
                await RandomElementQ_Async(ranX, ranY, length, time);
            }
        }

        // Определяю элемент, в котором необходимо менять символы
        public async Task RandomElementQ_Async(int x, int y, int length, int timeOut)
        {
            // Словарь для хранения идентификаторов ячеек, которые вызывались на предыдущем этапе.
            Dictionary<int, TextBlock> dicElem = new Dictionary<int, TextBlock>();

            // Задаем цвет символов
            Dictionary<string, int> SymbolColor = new Dictionary<string, int>();

            // Счетчик, необходим для обработки случаев, когда не выполняется условие if ((y   i) < countHeight && (y   i) >= 0). Смотри на 4 строчки вниз.
            // Тоесть элемент в котором необходимо менять символы выше либо ниже нашей сетки (матрицы элементов).
            int count = 0;

            // Цикл формирует змейку заданной длины length
            for (int i = 0; i <= length; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

                //Проверяем, что б змейка отображалась только в координатах, которые существуют в нашей сетке
                if ((y   i) < countHeight && (y   i) >= 0)
                {
                    // Формируем имя элемента, в котором будут меняться символы
                    string elementName = "TB_"   x   "_"   (y   i);

                    // Получаем элемент по его имени
                    object wantedNode = LayoutRoot.FindName(elementName);
                    TextBlock element = (TextBlock)wantedNode;

                    // Отправляем элемент в словарь, из которого он будет извлекаться для результата "падения" и "затухания" змейки
                    dicElem[count] = (element);

                    // Определяем коеффициент для подсчета яркости. 1-й элемент(тот, что падает) -  всега самый блестящий, конечный - самый темный.
                    // Отнимаем 1, потому, что конечный элемент (когда к -  наивысшее) в результате получается огромнее 255 и становится блестящим.
                    int A_Coefficient = (int)Math.Round((gradientFrom["A"] - 10) / (double)(count   1)) - 1;
                    int R_Coefficient = (int)Math.Round((gradientFrom["R"] - gradientTo["R"]) / (double)(count   1)) - 1;
                    int G_Coefficient = (int)Math.Round((gradientFrom["G"] - gradientTo["G"]) / (double)(count   1)) - 1;
                    int B_Coefficient = (int)Math.Round((gradientFrom["B"] - gradientTo["B"]) / (double)(count   1)) - 1;
                    //int greenCoefficient = (int)Math.Round(255 / (double)(count   1)) - 1;

                    // Вызываем на прорисовку 1-й, самый блестящий падающий элемент. Асинхронно.
                    // colorFirstSymbol["A"]. Цвет задается через настройку.                   
                    await Change(element, timeOut, colorFirstSymbol);

                    // Перебираем все  элементы, составляющие змейку на данном этапе. С всяким циклом она возрастает, пока не достигнет требуемой длины.
                    for (int k = 0; k <= i; k  )
                    {                       
                        // Останавливаем анимацию
if (flagOnOff) break;

                        // Если змейка начинаеися "выше" исходных координат (скажем, если y = -5)
                        if (dicElem.ContainsKey(k))
                        {
                            //Извлекаем элементы, которые обязаны следовать за самым блестящим. Создаем результат "затухания" цвета
                            TextBlock previousElement = dicElem[k];

                            // Вызываем извлеченные элементы
                            // (greenCoefficient * (k   1)) - 20 Высчитываем яркость так, что б разница между первым и последним была на всех змейках идентичная
                            // и равномерно распределялась самостоятельно от ее длины(числа элементов)
                            SymbolColor["A"] = (gradientFrom["A"] - ((i - k) * A_Coefficient));
                            SymbolColor["R"] = (gradientFrom["R"] - ((i - k) * R_Coefficient));
                            SymbolColor["G"] = (gradientFrom["G"] - ((i - k) * G_Coefficient));
                            SymbolColor["B"] = (gradientFrom["B"] - ((i - k) * B_Coefficient));

                            Task dsvv = Change(previousElement, timeOut, SymbolColor);
                        }
                    }
                    count  ;
                }
            }
        }

        // Способ метаморфозы символов в заданном элеменете
        public async Task Change(TextBlock element, int timeOut, Dictionary<string, int> SymbolColor)
        {
            // Формируем необходимый цвет с заданной яркостью
            SolidColorBrush NewColor = new SolidColorBrush(new Color()
            {
                A = (byte)(SymbolColor["A"]) /*Opacity*/,
                R = (byte)(SymbolColor["R"]) /*Red*/,
                G = (byte)(SymbolColor["G"]) /*Green*/,
                B = (byte)(SymbolColor["B"]) /*Blue*/
            });

            // При всяком "падении" на 1 клеточку равномерно "затухает"
            element.Foreground = NewColor;

            // число смены символов в всякой ячейке
            for (int i = 0; i < countSymbol; i  )
            {
                // Останавливаем анимацию
                if (flagOnOff) break;

                // Всякий раз различный символ из заданного диапазона
                element.Text = RandomActualSymbol();              

                // Размер шрифта
                element.FontSize = fontSize;

                // Скорость смены символов в ячейке
                await Task.Delay(timeOut);
            }
        }

        // Загрузка данных для элементов ViewModel
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (!App.ViewModel.IsDataLoaded)
            {
                App.ViewModel.LoadData();
            }
        }

        /* ****************************** События ****************************** */
        // Настройки. Скорость смены символов.
        private void Event_Button_Click_SpeedApplay(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_SppeedFrom в качество класса speedFrom
            this.speedFrom = int.Parse(TextBox_SppeedFrom.Text.ToString());

            // Сберегаем значение их соответствующего TextBox TextBox_SppeedTo в качество класса speedTo
            this.speedTo = int.Parse(TextBox_SppeedTo.Text.ToString());
        }

        // Настройки. число змеек в очереди
        private void Event_Button_Click_CountQueue(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_CountQueue в качество класса iteration
            this.iteration = int.Parse(TextBox_CountQueue.Text.ToString());
        }

        // Настройки. число змеек за нажатие
        private void Event_Button_Click_СountSimultaneously(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_СountSimultaneously в качество класса countSimultaneously
            this.countSimultaneously = int.Parse(TextBox_СountSimultaneously.Text.ToString());
        }

        // Настройки. Размер шрифта
        private void Event_Button_Click_FontSize(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_FontSize в качество класса addingFontSize
            this.addingFontSize = int.Parse(TextBox_FontSize.Text.ToString());

            // Вычисляем тоговый размер шрифта для разметки / переразметки
            this.fontSize = kolich   addingFontSize   addingSize;
        }

        // Настройки. число смены символов в ячейке
        private void Event_Button_Click_CountSymbol(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_CountSymbol в качество класса countSymbol
            this.countSymbol = int.Parse(TextBox_CountSymbol.Text.ToString());
        }

        // Настройки. Выключаем вероятность анимирования змеек
        private void Event_Button_Click_Stop(object sender, RoutedEventArgs e)
        {
            this.flagOnOff = true;

            // Если flagOnOff в true то подсвечиваем кнопку Stop
            if (this.flagOnOff)
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Cyan);
                Button_Start.Background = new SolidColorBrush(Colors.Black);
            }
        }

        // Настройки. Включаем вероятность анимирования змеек
        private void Event_Button_Click_Start(object sender, RoutedEventArgs e)
        {
            this.flagOnOff = false;

            // Если flagOnOff в false то подсвечиваем кнопку Start
            if (!this.flagOnOff)
            {
                Button_Stop.Background = new SolidColorBrush(Colors.Black);
                Button_Start.Background = new SolidColorBrush(Colors.Cyan);
            }
        }

        // Настройки. чистка экрана
        private void Event_Button_Click_Clear(object sender, RoutedEventArgs e)
        {
            // Перебираем сетку ячеек и устанавливаем в всякой ячейке как символ - пустоту
            for ( int i = 0; i < countWidth; i  )
            {
                for (int j = 0; j < countHeight; j  )
                {
                    // Формируем имя элемента, тот, что будем очищать
                    string elementName = "TB_"   i   "_"   j;

                    // Получаем элемент по его имени
                    object wantedNode = LayoutRoot.FindName(elementName);
                    TextBlock element = (TextBlock)wantedNode;

                    // Очищаем значение
                    element.Text = "";
                }
            }
        }

        // Настройки. Размер клетки для символа
        private void Event_Button_Click_ElementSize(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_ElementSize в качество класса addingSize
            this.addingSize = int.Parse(TextBox_ElementSize.Text.ToString());

            // число строк и столбцов. Возвращаем для вертикали
            this.countWidth = (int)Math.Round(ScreenWidth / (kolich   addingSize))   Math.Abs(addingSize);
            this.countHeight = (int)Math.Round(ScreenHeight / (kolich   addingSize))   5   Math.Abs(addingSize);

            // Останавливаем матрицу
            this.flagOnOff = true;

            // Удаляем матрицу (сами ячейки)
            LayoutRootSecond.Children.Clear();

            // Перерисовываем ячейки снова с новыми параметрами
            CreateElement();

            // Включаем матрицу
            this.flagOnOff = false;
        }

        // Настройки. Задаем максимальную и минимальную длину змейки
        private void Event_Button_Click_MaxLength(object sender, RoutedEventArgs e)
        {
            // Сберегаем значение их соответствующего TextBox TextBox_MinLength в качество класса minLength
            this.minLength = int.Parse(TextBox_MinLength.Text.ToString());

            // Сберегаем значение их соответствующего TextBox TextBox_MaxLength в качество класса maxLength
            this.maxLength = int.Parse(TextBox_MaxLength.Text.ToString());
        }

        // Настройки. Вериткальная / горизонтальная матрица
        private void Event_Button_Click_Turn(object sender, RoutedEventArgs e)
        {
            // Включить (true), отключить (false) "поворот экрана"
            if (turnOnOff)
            {
                // Сберегаем значение false в качество класса turnOnOff
                this.turnOnOff = false;

                // Надпись на конопке с именем ToggleButton_Turn меняю на Горизонтально
                ToggleButton_Turn.Content = "Горизонтально";

                // число строк и столбцов. Инвертируем для горизонтали.
                this.countHeight = (int)Math.Round(ScreenWidth / (kolich   addingSize))   5   Math.Abs(addingSize);
                this.countWidth = (int)Math.Round(ScreenHeight / (kolich   addingSize))   5   Math.Abs(addingSize);
            }
            else
            {
                // Сберегаем значение true в качество класса turnOnOff
                this.turnOnOff = true;

                // Надпись на конопке с именем ToggleButton_Turn меняю на Вертикально
                ToggleButton_Turn.Content = "Вертикально";

                // число строк и столбцов. Возвращаем для вертикали
                this.countWidth = (int)Math.Round(ScreenWidth / (kolich   addingSize))   Math.Abs(addingSize);
                this.countHeight = (int)Math.Round(ScreenHeight / (kolich   addingSize))   5   Math.Abs(addingSize);
            }

            // Останавливаем матрицу
            this.flagOnOff = true;

            // Удаляем матрицу (сами ячейки)
            LayoutRootSecond.Children.Clear();

            // Перерисовываем ячейки снова с новыми параметрами
            CreateElement();

            // Включаем матрицу
            this.flagOnOff = false;
        }

        // Заполняем словарь идентификаторами языка и соответствующие ему ASCII коды символов
        public void ListLanguages()
        {
            // Добавляем в словарь ключь -  наименование языка и значение -  массив, состоящий из ASCII кодов символов.
            languages.Add("Матрица", new int[] { 64, 127 });
            languages.Add("Китаский", new int[] { 19968, 20223 });
            languages.Add("Английский", new int[] { 64, 127 });
            languages.Add("Цифры", new int[] { 48, 57 });
            languages.Add("Случайные символы", new int[] { 0, 1000 });
            languages.Add("Русский", new int[] { 1040, 1103 });

            // Добавляем языки в всплывающую панель для вероятности их выбора
            foreach (var language in languages)
            {
                // Создаю кнопку
                Button newLang = new Button();

                // Задаю надпись кнопки, соответствует языку
                newLang.Content = language.Key.ToString();

                // Горизонтальное выравнивание
                newLang.HorizontalAlignment = HorizontalAlignment.Stretch;

                // Толщина рамки
                newLang.BorderThickness = new Thickness(1);

                // Смещение
                newLang.Margin = new Thickness(0,0,0,0);

                // Событие, при нажатии на кнопку. Одно на все.
                newLang.Click  = Event_Button_Click_SelectLanguageUpdate;

                // Добавляю созданую и настроенную кнопку в всплывающее окно
                StackPanel_ButtonDropDownSelectLanguage.Children.Add(newLang);
            }
        }

        // Вызываем эту функцию всюду, где необходимо показать беспричинный символ из выбранного языка.
        public string RandomActualSymbol()
        {
// Получаем массив по ключу, содержащий ASCII коды символов языка, заданного в actualLanguage
            int[] sd = (languages[actualLanguage]);

            // Выбираем случайнфй символ в диапазоне от первого до последнего символа в заданом языке
            return char.ConvertFromUtf32(this.random.Next((int)sd.GetValue(0), (int)sd.GetValue(1)));
        }

        // Кнопка, в которой показывается нынешнее выбранное значение языка. при нажатии на нее всплывает меню для выбора иного языка.
        private void Event_Button_Click_SelectLanguage(object sender, RoutedEventArgs e)
        {
            // Показывать (true) / не показывать (false) всплывающее окно (PopUp) при выборе языка
            if (flagShowLanguages)
            {
                // Показать всплывающее окно
                Popup_ButtonDropDownSelectLanguage.IsOpen = true;
                flagShowLanguages = false;
            }
            else
            {
                // Спрятать всплывающее окно
                Popup_ButtonDropDownSelectLanguage.IsOpen = false;
                flagShowLanguages = true;
            }
        }

        // Всплывающее меню выбора языка.
        private void Event_Button_Click_SelectLanguageUpdate(object sender, RoutedEventArgs e)
        {
            // Если нажата кнопка выбора языка, но иной язык не выбран, то при повторном нажатии меню свернется.
            if (!flagShowLanguages)
            {
                // Спрятать всплывающее окно
                Popup_ButtonDropDownSelectLanguage.IsOpen = false;
                flagShowLanguages = true;
            }

            // Получаем наименование кнопки, которую нажали
            string newLanguagr = (sender as Button).Content.ToString();

            // Обновляем наименование кнопки, отображающей выбранный язык
            Button_SelectLanguage.Content = newLanguagr;

            // Задаем значение языка, в котором выбирать символы случайным образом
            this.actualLanguage = newLanguagr;
        }

        // Меняем цвет фона матрицы
        private void Event_Button_Click_ChangeBackground(object sender, RoutedEventArgs e)
        {
            // Передаем в качество класса colorMatrixBackground выбранный цвет из элемента ColorPicker для фона матрицы
            colorMatrixBackground["A"] = ColorPicker.Color.A;
            colorMatrixBackground["R"] = ColorPicker.Color.R;
            colorMatrixBackground["G"] = ColorPicker.Color.G;
            colorMatrixBackground["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет фона матрицы соответствующей кнопке
            Button_BackgroundColor.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(colorMatrixBackground["A"]) /*Opacity*/,
                R = (byte)(colorMatrixBackground["R"]) /*Red*/,
                G = (byte)(colorMatrixBackground["G"]) /*Green*/,
                B = (byte)(colorMatrixBackground["B"]) /*Blue*/
            });

            // Задаем выбранный цвет фона матрицы
            ChangeBackground();
        }

        // Способ метаморфозы цвета фона матрицы. По умолчанию черный.
        private void ChangeBackground()
        {
            // Задаю цвет фона матрицы
            LayoutRootSecond.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(colorMatrixBackground["A"]) /*Opacity*/,
                R = (byte)(colorMatrixBackground["R"]) /*Red*/,
                G = (byte)(colorMatrixBackground["G"]) /*Green*/,
                B = (byte)(colorMatrixBackground["B"]) /*Blue*/
            });
        }

        // Исходные настройки цветов фона, символов и т.д
        private void BeginColorSettings()
        {
            // Задаем первоначальный цвет фона матрицы
            colorMatrixBackground["A"] = 0;
            colorMatrixBackground["R"] = 0;
            colorMatrixBackground["G"] = 0;
            colorMatrixBackground["B"] = 0;

            // Задаем первоначальный цвет первого символа
            colorFirstSymbol["A"] = 255;
            colorFirstSymbol["R"] = 248;
            colorFirstSymbol["G"] = 248;
            colorFirstSymbol["B"] = 255;

            // Задаем первоначальный цвет градиента от (второго символа в змейке)
            gradientFrom["A"] = 255;
            gradientFrom["R"] = 1;
            gradientFrom["G"] = 255;
            gradientFrom["B"] = 1;

            // Задаем первоначальный цвет градиента до (последнего символа в змейке)
            gradientTo["A"] = 0;
            gradientTo["R"] = 0;
            gradientTo["G"] = 0;
            gradientTo["B"] = 0;
        }

        // Метаморфоза цвета первого символа
        private void Event_Button_Click_FirstSymbolColor(object sender, RoutedEventArgs e)
        {
            // Передаем в качество класса colorFirstSymbol выбранный цвет из элемента ColorPicker для фона матрицы
            colorFirstSymbol["A"] = ColorPicker.Color.A;
            colorFirstSymbol["R"] = ColorPicker.Color.R;
            colorFirstSymbol["G"] = ColorPicker.Color.G;
            colorFirstSymbol["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет фона матрицы соответствующей кнопке
            Button_FirstSymbolColor.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(colorFirstSymbol["A"]) /*Opacity*/,
                R = (byte)(colorFirstSymbol["R"]) /*Red*/,
                G = (byte)(colorFirstSymbol["G"]) /*Green*/,
                B = (byte)(colorFirstSymbol["B"]) /*Blue*/
            });
        }

        // Настройки. Задаем градиент змейки. Цвет второго символа.
        private void Event_Button_Click_GradientFrom(object sender, RoutedEventArgs e)
        {
// Передаем в качество класса gradientFrom выбранный цвет из элемента ColorPicker для фона матрицы
            gradientFrom["A"] = ColorPicker.Color.A;
            gradientFrom["R"] = ColorPicker.Color.R;
            gradientFrom["G"] = ColorPicker.Color.G;
            gradientFrom["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет градиента от змейки соответствующей кнопке
            Button_GradientFrom.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(gradientFrom["A"]) /*Opacity*/,
                R = (byte)(gradientFrom["R"]) /*Red*/,
                G = (byte)(gradientFrom["G"]) /*Green*/,
                B = (byte)(gradientFrom["B"]) /*Blue*/
            });
        }

        // Настройки. Задаем градиент змейки. Цвет последнего символа.
        private void Event_Button_Click_GradientTo (object sender, RoutedEventArgs e)
        {
            // Передаем в качество класса gradientTo выбранный цвет из элемента ColorPicker для фона матрицы
            gradientTo["A"] = ColorPicker.Color.A;
            gradientTo["R"] = ColorPicker.Color.R;
            gradientTo["G"] = ColorPicker.Color.G;
            gradientTo["B"] = ColorPicker.Color.B;

            // Задаем выбранный цвет градиента до змейки соответствующей кнопке
            Button_GradientTo.Background = new SolidColorBrush(new Color()
            {
                A = (byte)(gradientTo["A"]) /*Opacity*/,
                R = (byte)(gradientTo["R"]) /*Red*/,
                G = (byte)(gradientTo["G"]) /*Green*/,
                B = (byte)(gradientTo["B"]) /*Blue*/
            });
        }     
    }
}





Итоги


 Вторая часть окончена. Знаю, что код немножко корявый, но как на меня так особенно легко проследить логику. В дальнейшей части займемся оптимизацией кода, сохранением настроек при выходе из приложения, локализацией под английский язык, привязкой к данным.

 П.С. Если знаете как отменнее сделать на данном этапе — умоляю в комментарии. И не забывайте, что приложение создается этапами и будут еще как минимум 2 части… Буду признателен, если подскажете, как решить загвоздку на последнем видео, так как панорама сдвигается только, если «хватать» за пределами ScrollViewer.


Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB