Цель лабораторной работы: рассмотреть примеры практического использования стандартных и нестандартных команд. Перевод команд из неактивного состояния в активное и обратно. В качестве примеров команд мы рассмотрим операции Копировать, Вырезать и Вставить, доступные во многих приложениях.
На основании рассмотренных в лабораторной работе примеров разработать WPF приложение "Блокнот", позволяющее с помощью меню и горячих клавиш редактировать текст (копировать, вырезать, вставлять, изменять шрифт).
Задача. Вы хотите, чтобы программа реагировала на команды меню, щелчки по панели инструментов и клавиатурные комбинации.
Решение. Технология WPF включает в себя целый ряд стандартных обработчиков команд, реагирующих на события стандартных элементов управления.
Например, если ассоциировать пункт меню Сору (Копировать) со
<Window x: Class ="WpfTextEditor.Windowl"
... >
<DockPanel Name="dockPanell" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto">
<MenuItem Header="_Edit">
<MenuItem Header="_Copy" Cammand="Copy"/>
<MenuItem Header="_Cut" Cammand="Cut"/>
<MenuItem Header="_Paste" Cammand="Paste"/>
</MenuItem>
</Menu>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar >
<Button Command="ApplicationCommands.Copy">
<Image Source="Resources\Copy.png" Opacity="l" />
</Button>
</ToolBar>
</ToolBarTray>
</DockPanel>
</Window>
Задача. Вы хотите создать собственные команды, специфичные для данного приложения.
Решение. Обычно команды сгруппированы в статических классах, чтобы к ним удобнее было обращаться. Определим две команды:
public class WpfTextEditorCommands
{
public static RoutedUICommand ExitCommand;
public static RoutedUICommand WordWrapCommand;
static WpfTextEditorCommands ()
{
InputGestureCollection exitInputs =
new InputGestureCollection();
exitInputs.Add(new KeyGesture(Key.F4, ModifierKeys.Alt) ) ;
ExitCommand = new RoutedUICommand("Exit application",
"ExitApplication",
typeof(WpfTextEditorCommands), exitInputs);
WordWrapCommand = new RoutedUICommand("Word wrap", "Wordwrap",
typeof (WpfTextEditorCommands) ) ;
}
}
Теперь можно связывать эти команды с элементами управления и закреплять их за обработчиками событий:
public partial class Window1:Window
{
public Window1()
{
InitializeComponent();
// Создать обработчики для наших нестандартных команд
CommandBinding cmdBindingExit = new
CommandBinding (WpfTextEditorCommands.ExitCommand);
cmdBindingExit.Executed += new
ExecutedRoutedEventHandler(cmdBindingExit_Executed);
CommandBinding cmdBindingWordWrap = new
CommandBinding (WpfTextEditorCommands.WordWrapCommand);
cmdBindingWordWrap.Executed += new
ExecutedRoutedEventHandler(cmdBindingWordWrap_Executed);
this.CommandBindings.Add(cmdBindingExit);
this.CommandBindings.Add(cmdBindingWordWrap);
}
void cmdBindingWordWrap_Executed(object sender, ExecutedRoutedEventArgs e)
{
textBox.TextWrapping =
((textBox.TextWrapping == TextWrapping.NoWrap) ?
TextWrapping.Wrap : TextWrapping.NoWrap);
}
void cmdBindingExit_Executed(object sender, ExecutedRoutedEventArgs e)
{
Application.Current.Shutdown();
}
}
Соберем все вместе с помощью XAML-кода:
<Window x:Class="WpfTextEditor.Windowl"
... >
<DockPanel Name="dockPanel1"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto">
<MenuItem Header="_Fi1e">
<MenuItem Header="_Exit"
Command="local:WpfTextEditorCommands.ExitCommand"/>
</MenuItem>
<MenuItem Header="_View">
<MenuItem Header="_Wordwrap" IsCheckable="True"
Name="menuItemWordWrap"
Command="local:WpfTextEditorCommands.WordWrapCommand"/>
</MenuItem>
</Menu>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<CheckBox IsChecked="{Binding Mode=TwoWay,
ElementName=menuItemWordWrap, Path=IsChecked}"
Command="local:WpfTextEditorCommands.WordWrapCommand">
<Image Source="Resources\WordWrap.png"
OpacityMask="White"/>
</CheckBox>
</ToolBar>
</ToolBarTray>
</DockPanel>
</Window>
Приложение почти готово. На разработку мы потратили минимум усилий и при этом познакомились с такими впечатляющими возможностями WPF, как связывание данных и реализация команд.
Задача. Вы хотите избирательно переводить команды из неактивного состояния в активное и обратно, в зависимости от состояния приложения.
Решение. Пусть команда Exit (Выход) становится неактивной, когда в текстовое поле введен текст. Внешне это будет проявляться в том, что пункт меню окрасится в серый цвет, а кнопка панели инструментов перестанет действовать.
public partial class Windowl:Window
{
public Windowl()
{
InitializeComponent();
//Создать обработчики для наших нестандартных команд
CommandBinding cmdBindingExit =
new CommandBinding (WpfTextEditor Commands.ExitCommand);
cmdBindingExit.Executed +=
new ExecutedRoutedEventHandler(cmdBindingExit_Executed);
cmdBindingExit.CanExecute +=
new CanExecuteRoutedEventHandler(cmdBindingExit_CanExecute);
//. . .
}
void cmdBindingExit_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = textBox.Text.Length == 0;
}
}
Мы убедились, что команды представляют собой механизм ввода в WPF и Silverlight, обеспечивающий обработку ввода на более семантическом уровне по сравнению с устройствами ввода. В качестве примеров команд мы рассмотрели операции Копировать, Вырезать и Вставить, доступные во многих приложениях.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.