Язык программирования C#9 и платформа .NET5
Шрифт:
Последний фрагмент кода, который понадобится добавить для данной вкладки, отвечает за изменение цвета штрихов, нарисованных в
InkCanvas
. Свойство DefaultDrawingAttributes
элемента InkCanvas
возвращает объект DrawingAttributes
, который позволяет конфигурировать многочисленные аспекты пера, включая его размер и цвет (помимо других настроек). Модифицируйте код C# следующей реализацией метода ColorChanged
:
private void ColorChanged(object sender, SelectionChangedEventArgs e)
{
//
Получить выбранный элемент в раскрывающемся списке.
string colorToUse =
(this.comboColors.SelectedItem as ComboBoxItem)?.Content.ToString;
// Изменить цвет, используемый для визуализации штрихов.
this.MyInkCanvas.DefaultDrawingAttributes.Color =
(Color)ColorConverter.ConvertFromString(colorToUse);
}
Вспомните, что
ComboBox
содержит коллекцию ComboBoxIterns
. В сгенерированной разметке XAML присутствует такое определение:
<ComboBox x:Name="comboColors" Width="100" SelectionChanged="ColorChanged">
<ComboBoxItem Content="Red"/>
<ComboBoxItem Content="Green"/>
<ComboBoxItem Content="Blue"/>
</ComboBox>
В результате обращения к свойству
SelectedItem
получается выбранный элемент ComboBoxItem
, который хранится как экземпляр общего типа Object
. После приведения Object
к ComboBoxItem
извлекается значение Content
, которое будет строкой Red
, Green
или Blue
. Эта строка затем преобразуется в объект Color
с применением удобного служебного класса ColorConverter
. Снова запустите программу. Теперь должна появиться возможность переключения между цветами при визуализации изображения. Обратите внимание, что элементы управления
ComboBox
и ListBox
также могут иметь сложное содержимое, а не только список текстовых данных. Чтобы получить представление о некоторых возможностях, откройте редактор XAML для окна и измените определение элемента управления ComboBox
, поместив в него набор элементов StackPanel
, каждый из которых содержит Ellipse
и Label
(свойство Width
элемента ComboBox
установлено в 175
):
<ComboBox x:Name="comboColors" Width="175" Margin="10,0,0,0"
SelectionChanged="ColorChanged">
<StackPanel Orientation ="Horizontal" Tag="Red">
<Ellipse Fill ="Red" Height ="50" Width ="50"/>
<Label FontSize ="20" HorizontalAlignment="Center"
VerticalAlignment="Center" Content="Red"/>
</StackPanel>
<StackPanel Orientation ="Horizontal" Tag="Green">
<Ellipse Fill ="Green" Height ="50" Width ="50"/>
<Label FontSize ="20" HorizontalAlignment="Center"
VerticalAlignment="Center" Content="Green"/>
</StackPanel>
<StackPanel Orientation ="Horizontal" Tag="Blue">
<Ellipse Fill ="Blue" Height ="50" Width ="50"/>
<Label FontSize ="20" HorizontalAlignment="Center"
VerticalAlignment="Center" Content="Blue"/>
</StackPanel>
</ComboBox>
В
определении каждого элементаStackPanel
выполняется присваивание значения свойству Tag
, что является быстрым и удобным способом выявления, какой стек элементов был выбран пользователем (для этого существуют и лучшие способы, но пока достаточно такого). С указанной поправкой необходимо изменить реализацию метода ColorChanged
:
private void ColorChanged(object sender, SelectionChangedEventArgs e)
{
// Получить свойство Tag выбранного элемента StackPanel.
string colorToUse = (this.comboColors.SelectedItem
as StackPanel).Tag.ToString;
...
}
После запуска программы элемент управления
ComboBox
будет выглядеть так, как показано на рис. 25.21. Сохранение, загрузка и очистка данных InkCanvas
Последняя часть вкладки
Ink API
позволит сохранять и загружать данные контейнера InkCanvas
, а также очищать его содержимое, добавляя обработчики событий для кнопок в панели инструментов. Модифицируйте разметку XAML для кнопок за счет добавления разметки, отвечающей за события щелчков:
<Button Grid.Column="0" x:Name="btnSave" Margin="10,10"
Width="70" Content="Save Data"
Click="SaveData"/>
<Button Grid.Column="1" x:Name="btnLoad" Margin="10,10"
Width="70" Content="Load Data"
Click="LoadData"/>
<Button Grid.Column="2" x:Name="btnClear" Margin="10,10"
Width="70" Content="Clear"
Click="Clear"/>
Импортируйте пространства имен
System.IO
и System.Windows.Ink
в файл кода. Реализуйте обработчики событий следующим образом:
Поделиться с друзьями: