четверг, 23 декабря 2021 г.

XAML Видимость кнопок - Использование метода CanExecute

 


ИсточникСамый тривиальный пример: когда нужно переключать состояние кнопок Cut(вырезать) и Copy(копировать) в зависимости от наличия выделенного текста, и включать кнопку Paste(вставить) только при наличии скопированного или вырезанного текста. Что мы и сделали в примере:

Как мы видели в прошлом примере, обработка команд может иметь довольно мало кода, с большим количеством методов и стандартной логикой. Вот почему разработчики WPF решили заняться созданием стандартных команд за Вас. По факту, мы можем избежать написания кода в прошлом примере, ведь TextBox может сам позаботиться о командах типа Cut, Copy, Paste, Undo и Redo.

WPF сам обрабатывает события Executed и CanExecute когда текстовое поле вроде TextBox имеет фокус. Вы можете перезаписывать эти события, что мы собственно и сделали в прошлом примере, но если Вам хватит стандартного поведения, Вы можете позволить WPF сделать работу за Вас. Взгляните, насколько проще этот пример:

<Window x:Class="WpfTutorialSamples.Commands.CommandCanExecuteSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="CommandCanExecuteSample" Height="200" Width="250"> <Window.CommandBindings> <CommandBinding Command="ApplicationCommands.Cut" CanExecute="CutCommand_CanExecute" Executed="CutCommand_Executed" /> <CommandBinding Command="ApplicationCommands.Paste" CanExecute="PasteCommand_CanExecute" Executed="PasteCommand_Executed" /> </Window.CommandBindings> <DockPanel> <WrapPanel DockPanel.Dock="Top" Margin="3"> <Button Command="ApplicationCommands.Cut" Width="60">_Cut</Button> <Button Command="ApplicationCommands.Paste" Width="60" Margin="3,0">_Paste</Button> </WrapPanel> <TextBox AcceptsReturn="True" Name="txtEditor" /> </DockPanel> </Window>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;

namespace WpfTutorialSamples.Commands
{
	public partial class CommandCanExecuteSample : Window
	{
		public CommandCanExecuteSample()
		{
			InitializeComponent();
		}

		private void CutCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
		{
			e.CanExecute = (txtEditor != null) && (txtEditor.SelectionLength > 0);
		}

		private void CutCommand_Executed(object sender, ExecutedRoutedEventArgs e)
		{
			txtEditor.Cut();
		}

		private void PasteCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
		{
			e.CanExecute = Clipboard.ContainsText();
		}

		private void PasteCommand_Executed(object sender, ExecutedRoutedEventArgs e)
		{
			txtEditor.Paste();
		}
	}
}

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...