Komut Vermeye Genel Bakış
Komut, Windows Presentation Foundation (WPF) içinde cihaz girişine göre daha semantik bir düzeyde giriş işleme sağlayan bir giriş mekanizmasıdır. Komutlara örnek olarak birçok uygulamaüzerinde bulunanKopyalama, Kesme ve Yapıştırma işlemleri örnek olarak verilmiştir.
Bu genel bakış, WPF'de hangi komutların olduğunu, hangi sınıfların komut modelinin bir parçası olduğunu ve uygulamalarınız için komutların nasıl kullan ve oluşturul olduğunu tanımlar.
Bu konu aşağıdaki bölümleri içermektedir:
Komutlar nedir?
Komutların çeşitli amaçları vardır. İlk amaç, semantiği ve komutu yürüten mantıktan bir komut çağıran nesneyi ayırmaktır. Bu, birden çok ve farklı kaynağın aynı komut mantığını çağırarak komut mantığının farklı hedefler için özelleştirilebilir. Örneğin, birçok uygulamaiçinde bulunan Kopyala,Kes ve Yapıştır düzenleme işlemleri, komutlar kullanılarak uygulanırsa farklı kullanıcı eylemleri kullanılarak çağrılabilir. Bir uygulama, kullanıcının bir düğmeye tıklayarak, bir menüdeki öğeyi seçerek veya CTRL+X gibi bir tuş bileşimi kullanarak seçili nesneleri veya metni kesmesine izin verir. Komutları kullanarak her kullanıcı eylemi türünü aynı mantığa bekleyebilirsiniz.
Komutların bir diğer amacı da bir eylemin kullanılabilir olup olmadığını belirtmektir. Bir nesneyi veya metni kesme örneğine devam etmek için, eylem yalnızca bir şey seçildiğinde mantıklıdır. Kullanıcı herhangi bir şey seçilmeden bir nesneyi veya metni kesmeye çalışırsa hiçbir şey olmaz. Bunu kullanıcıya göstermek için birçok uygulama düğmeleri ve menü öğelerini devre dışı bırakarak kullanıcının bir eylem gerçekleştirmenin mümkün olup olmadığını bilir. Bir komut, yöntemini kullanarak bir eylemin mümkün olup olmadığını CanExecute belirtebilirsiniz. Bir düğme, olayına abone CanExecuteChanged olabilir ve döndürürse devre dışı CanExecute bırakılabilir veya false döndürürse CanExecutetrue etkinleştirilebilir.
Bir komutun semantiği uygulamalar ve sınıflar arasında tutarlı olabilir, ancak eylemin mantığı üzerinde işlem yapılan belirli nesneye özeldir. CTRL+X tuş bileşimi metin sınıflarında, görüntü sınıflarında ve Web tarayıcılarında Kes komutunu çağırır, ancak Kesme işlemini gerçekleştirmenin gerçek mantığı kesme işlemini gerçekleştiren uygulama tarafından tanımlanır. , RoutedCommand istemcilerin mantığı uygulamasına olanak sağlar. Metin nesnesi seçilen metni panoya, bir görüntü nesnesi ise seçili görüntüyü kesebilirsiniz. Bir uygulama olayı işlemesi durumunda komutun hedefine erişime sahip olur ve hedefin türüne bağlı olarak Executed uygun eylemin üstesinden gelebilir.
WPF'de Basit Komut Örneği
WPF'de komut kullanmanın en basit yolu, komut kitaplığı sınıflarından biri tarafından önceden tanımlanmış bir komut kullanmak; komutu işleme için yerel desteği olan bir denetim kullanmak ve bir komutun iptali için yerel desteği olan bir denetim RoutedCommand kullanmaktır. komutu, Paste sınıfında önceden tanımlanmış komutlardan ApplicationCommands birdir. Denetim, TextBox komutun işlenmesi için yerleşik bir mantığa Paste sahip. ayrıca MenuItem sınıfının komutlarını faturalamak için yerel desteği vardır.
Aşağıdaki örnekte, klavye odağına sahip olduğu varsayıldığında bir üzerinde komutu çağıracak şekilde bir MenuItemPasteTextBoxTextBox ayarlaması gösterir.
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste" />
</Menu>
<TextBox />
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);
// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;
// Setting the command target to the TextBox
pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()
' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)
' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste
WPF Komutlarında Dört Ana Kavram
WPF'de yönlendiren komut modeli dört ana kavrama kadar 20'den fazla kavramdan biri olabilir: komut, komut kaynağı, komut hedefi ve komut bağlaması:
Komutu, yürütülecek eylemdir.
Komut kaynağı, komutu çağıran nesnedir.
Komut hedefi, komutun yürütültülür olduğu nesnedir.
Komut bağlaması, komut mantığını komuta eşler.
Önceki örnekte komutu komutu, komutu kaynaktır, komutu hedeftir ve komut PasteMenuItemTextBox bağlaması denetim tarafından TextBox sağlanır. Her zaman komut hedefi sınıfı olan denetim tarafından sağlanan durum CommandBinding olmadığını da not etmek gerekir. genellikle uygulama CommandBinding geliştiricisi tarafından oluşturulmalı veya komut CommandBinding hedefinin üst bilgilerine eklenmiş olabilir.
Komutlar
WPF'de komutlar arabirimi uygulanarak ICommand oluşturulur. ICommand , ve gibi iki Execute yöntemi ve bir olayı olan CanExecute 'i ortaya CanExecuteChanged çıkarır. Execute komutuyla ilişkili eylemleri gerçekleştirir. CanExecute , komutun geçerli komut hedefi üzerinde yürütülip yürütüle olmadığını belirler. CanExecuteChanged , komut yürütme işlemlerini merkezi hale alan komut yöneticisi, komut kaynağında, yükseltilmiş ancak henüz komut bağlaması tarafından yürütülemeyen bir komutu geçersiz sayan bir değişiklik algılarsa ortaya çıkar. WPF uygulaması ICommandRoutedCommand sınıfıdır ve bu genel bakışın odak noktasıdır.
WPF'de ana giriş kaynakları fare, klavye, mürekkep ve yönlendirilen komutlardır. Cihaz odaklı girişler, uygulama sayfasındaki nesnelere bir giriş olayı olduğunu RoutedEvent bildirmek için kullanır. A RoutedCommand farklı bir şey değil. bir öğesinin ve yöntemleri komutu için uygulama mantığını içermez, bunun yerine ile bir nesnesiyle karşılaşana kadar öğe ağacında tünel ve kabarcık yönlendiren ExecuteCanExecute olaylar RoutedCommandCommandBinding oluşturur. CommandBinding, bu olaylar için işleyicileri içerir ve komutu gerçekleştiren işleyicilerdir. WPF'de olay yönlendirme hakkında daha fazla bilgi için bkz. Yönlendirilen Olaylara Genel Bakış.
üzerinde ExecuteRoutedCommand yöntemi, komut PreviewExecuted hedefte Executed ve olaylarını yükselter. üzerinde CanExecuteRoutedCommand yöntemi, komut hedefi CanExecute üzerinde ve PreviewCanExecute olaylarını yükselter. Bu olaylar, belirli bir komut için bir nesnesine sahip olan bir nesneyle karşılaşana kadar öğe ağacında CommandBinding tünel oluşturur ve kabarcık oluşturur.
WPF çeşitli sınıflara yayılmış bir dizi ortak yönlendiren komut sağlar: MediaCommands , , , ve ApplicationCommandsNavigationCommandsComponentCommandsEditingCommands . Bu sınıflar komutun RoutedCommand uygulama mantığı değil yalnızca nesnelerden oluşur. Uygulama mantığı, komutun yürütültülür olduğu nesnenin sorumluluğundadır.
Komut Kaynakları
Komut kaynağı, komutu çağıran nesnedir. , ve komut kaynaklarına MenuItemButton örnek olarak KeyGesture verilmiştir.
WPF'de komut kaynakları genellikle ICommandSource arabirimini uygulamaz.
ICommandSource üç özelliği gösterir: Command , CommandTarget ve CommandParameter :
Command , komut kaynağı çağrıldığında yürütülecek komuttır.
CommandTarget , komutunun yürütüllecek nesnesidir. WPF'de özelliğinin yalnızca olduğunda geçerli CommandTargetICommandSource olduğunu ICommandRoutedCommand unutmayın. bir CommandTarget üzerinde ayarlanırsa ve ICommandSource karşılık gelen komut bir RoutedCommand ise, komut hedefi yoksayılır. CommandTargetayarlanmazsa, klavye odağına sahip öğe komut hedefi olur.
CommandParameter , komutu uygulayan işleyicilere bilgi almak için kullanılan kullanıcı tanımlı bir veri t t tür.
uygulayan WPF sınıfları ICommandSourceButtonBase , , ve MenuItemHyperlinkInputBinding sınıflarıdır. ButtonBase, MenuItem ve Hyperlink tıklandırıldıkları zaman bir komut çağırır ve ile ilişkili gerçekleştirilen bir InputBinding komut InputGesture çağırır.
Aşağıdaki örnek, komutu için bir MenuItem içinde komut kaynağı olarak bir kullanma ContextMenuProperties gösterir.
<StackPanel>
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Command="ApplicationCommands.Properties" />
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
StackPanel cmdSourcePanel = new StackPanel();
ContextMenu cmdSourceContextMenu = new ContextMenu();
MenuItem cmdSourceMenuItem = new MenuItem();
// Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu;
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem);
// Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties;
Dim cmdSourcePanel As New StackPanel()
Dim cmdSourceContextMenu As New ContextMenu()
Dim cmdSourceMenuItem As New MenuItem()
' Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem)
' Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties
Genellikle, bir komut kaynağı olayı CanExecuteChanged dinler. Bu olay, komut kaynağına komutun geçerli komut hedefi üzerinde yürütülebilme yeteneğinin değişmiş olduğunu bildirmiştir. Komut kaynağı, yöntemini kullanarak geçerli RoutedCommand durumunu CanExecute sorgular. Komut yürütüleyene kadar komut kaynağı kendisini devre dışı bırakabilirsiniz. Bunun bir örneği, bir MenuItem komut yürütüleyene kadar gri renkte görünür.
InputGesturebir komut kaynağı olarak kullanılabilir. WPF'de iki giriş hareketi türü ve KeyGestureMouseGesture 'tir. KeyGestureCTRL+C gibi bir klavye kısayolu olarak düşünebilirsiniz. bir KeyGesture ve kümesi KeyModifierKeys oluşur. bir MouseGesture ve isteğe MouseAction bağlı bir kümesi ModifierKeys oluşur.
bir'in InputGesture bir komut kaynağı olarak davranması için bir komutla ilişkilendirilmiş olması gerekir. Bunu gerçekleştirmenin birkaç yolu vardır. Bunun bir yolu da InputBinding kullanmak.
Aşağıdaki örnekte, ile arasında bir KeyBinding oluşturma adımları ve bilgiler ve bilgiler yer KeyGesture a. RoutedCommand
<Window.InputBindings>
<KeyBinding Key="B"
Modifiers="Control"
Command="ApplicationCommands.Open" />
</Window.InputBindings>
KeyGesture OpenKeyGesture = new KeyGesture(
Key.B,
ModifierKeys.Control);
KeyBinding OpenCmdKeybinding = new KeyBinding(
ApplicationCommands.Open,
OpenKeyGesture);
this.InputBindings.Add(OpenCmdKeybinding);
Dim OpenKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)
Dim OpenCmdKeybinding As New KeyBinding(ApplicationCommands.Open, OpenKeyGesture)
Me.InputBindings.Add(OpenCmdKeybinding)
ile ilişkilendirmenin başka InputGesture bir RoutedCommand yolu, üzerinde InputGesture 'ye InputGestureCollectionRoutedCommand eklemektir.
Aşağıdaki örnekte, bir için 'ye KeyGesture bir ekleme adımları ve bilgiler ve bilgiler yer InputGestureCollection a. RoutedCommand
KeyGesture OpenCmdKeyGesture = new KeyGesture(
Key.B,
ModifierKeys.Control);
ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture);
Dim OpenCmdKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)
ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture)
CommandBinding
bir CommandBinding komutu, komutu uygulayan olay işleyicileriyle ilişkilendirr.
sınıfı, CommandBinding ve , , ve CommandPreviewExecutedExecutedPreviewCanExecute olaylarını içeren bir özellik CanExecute içerir.
Command , ile CommandBinding ilişkilendirilen komut. ve olaylara eklenen olay PreviewExecutedExecuted işleyicileri komut mantığını uygulama. ve olaylarını ekli olay PreviewCanExecuteCanExecute işleyicileri, komutun geçerli komut hedefi üzerinde yürütülep yürütüle olmadığını belirler.
Aşağıdaki örnek, bir uygulamanın CommandBinding kökünde bir oluşturma Window gösterir. komutu CommandBinding ile ve OpenExecutedCanExecute işleyicileri ilişkilendirin.
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
ApplicationCommands.Open,
OpenCmdExecuted,
OpenCmdCanExecute);
this.CommandBindings.Add(OpenCmdBinding);
' Creating CommandBinding and attaching an Executed and CanExecute handler
Dim OpenCmdBinding As New CommandBinding(ApplicationCommands.Open, AddressOf OpenCmdExecuted, AddressOf OpenCmdCanExecute)
Me.CommandBindings.Add(OpenCmdBinding)
Ardından ve ExecutedRoutedEventHandlerCanExecuteRoutedEventHandler oluşturulur. ExecutedRoutedEventHandlerkomutu MessageBox yürütülürken bir dize görüntüleyen bir açar. , CanExecuteRoutedEventHandler özelliğini CanExecute olarak true ayarlar.
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
String command, targetobj;
command = ((RoutedCommand)e.Command).Name;
targetobj = ((FrameworkElement)target).Name;
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj);
}
Private Sub OpenCmdExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
Dim command, targetobj As String
command = CType(e.Command, RoutedCommand).Name
targetobj = CType(sender, FrameworkElement).Name
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj)
End Sub
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
Private Sub OpenCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
e.CanExecute = True
End Sub
CommandBinding, uygulamanın kökü veya denetim gibi belirli Window bir nesneye iliştirilmiş. 'nin CommandBinding ekli olduğu nesne bağlamanın kapsamını tanımlar. Örneğin, komut hedefinin üst komutuna eklenmiş bir olay tarafından ulaşabilirsiniz, ancak komut hedefinin alt bir alta CommandBindingExecuted bağlı CommandBinding bir'e ulaşamaz. Bu, olayı yükselten nesneden RoutedEvent tünellerin ve kabarcıkların doğrudan bir sonucudur.
Bazı durumlarda, sınıfı ve , ve komutları gibi komut CommandBinding hedefine TextBoxCutCopyPaste ekli olur. Ancak çoğu zaman, özellikle de aynı birden çok komut hedefi için kullanılabilirse, ana nesne veya Uygulama nesnesi gibi komut hedefinin üst bilgisine eklemek CommandBindingWindow daha CommandBinding kullanışlıdır. Bunlar, komut altyapınızı oluştururken dikkate almak istediğiniz tasarım kararlarıdır.
Komut Hedefi
Komut hedefi, komutun yürütül olduğu öğedir. bir ile ilgili RoutedCommand olarak, komut hedefi ve yönlendirmenin başladığı ExecutedCanExecute öğedir. Daha önce belirtildiği gibi, CommandTarget WPF'de özelliği yalnızca bir olduğunda ICommandSourceICommandRoutedCommand geçerlidir. bir CommandTarget üzerinde ayarlanırsa ve ICommandSource karşılık gelen komut bir RoutedCommand ise, komut hedefi yoksayılır.
Komut kaynağı, komut hedefini açıkça ayarlayabilirsiniz. Komut hedefi tanımlanmamışsa, klavye odağına sahip öğe komut hedefi olarak kullanılır. Öğesini komut hedefi olarak klavye odağıyla kullanmanın avantajlarından biri, uygulama geliştiricinin komut hedefini izlemek zorunda kalmadan birden çok hedefte komut çağırmak için aynı komut kaynağını kullanmana olanak olmasıdır. Örneğin, bir denetimi ve denetimi olan bir uygulamada Yapıştır komutunu çağırırsa, hedef veya klavye odağı olan denetime MenuItem bağlı olarak MenuItemTextBoxPasswordBoxTextBoxPasswordBox olabilir.
Aşağıdaki örnekte, komut hedefini işaretlemede ve arka kodda açıkça ayarlama adımları açık olarak açık olarak açık bir şekilde nasıl
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste"
CommandTarget="{Binding ElementName=mainTextBox}" />
</Menu>
<TextBox Name="mainTextBox"/>
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);
// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;
// Setting the command target to the TextBox
pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()
' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)
' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste
The CommandManager
, CommandManager komutla ilgili bir dizi işlev sunar. Belirli bir öğeye ve öğesinden , , ve olay işleyicilerini eklemek ve kaldırmak için PreviewExecuted bir dizi statik yöntem ExecutedPreviewCanExecuteCanExecute sağlar. Belirli bir sınıfa ve CommandBinding nesneleri InputBinding kaydetmeye yönelik bir olanak sağlar. ayrıca, CommandManager olayı ne zaman vermesi gerektiğini RequerySuggested komuta bildirmek için olay aracılığıyla bir yol CanExecuteChanged sağlar.
yöntemi, InvalidateRequerySuggested olayı yükseltmek için CommandManager 'i RequerySuggested kullanır. Bu, bir komutu devre dışı bırakması/etkinleştirmesi gereken ancak tarafından farkında olan koşullar CommandManager için kullanışlı değildir.
Komut Kitaplığı
WPF, önceden tanımlanmış bir komut kümesi sağlar. Komut kitaplığı şu sınıflardan oluşur: ApplicationCommands , , , ve NavigationCommandsMediaCommandsEditingCommandsComponentCommands . Bu sınıflar , ve Cut , , ve gibi BrowseBackBrowseForwardPlayStop komutlar Pause sağlar.
Bu komutların çoğu bir dizi varsayılan giriş bağlaması içerir. Örneğin, kopyalama komutunun uygulama tarafından işlen bir uygulama olduğunu belirtirsiniz. "CTRL+C" klavye bağlamasına otomatik olarak sahip olursanız Tablet PC kalem hareketleri ve konuşma bilgileri gibi diğer giriş cihazları için bağlamalar da elde edersiniz.
XAML kullanarak çeşitli komut kitaplıklarında komutlara başvurursanız, genellikle statik komut özelliğini ortaya çıkaran kitaplık sınıfının sınıf adını atabilirsiniz. Genellikle, komut adları dizeler olarak belirsizdir ve komutların mantıksal bir gruplama sağlamak için sahip olan türler vardır, ancak belirsizliği azaltma için gerekli değildir. Örneğin, daha ayrıntılı Command="Cut" yerine belirtesiniz. Command="ApplicationCommands.Cut" Bu, komutlar için WPF XAML işlemcisinde yerleşik olarak bulunan kullanışlı bir mekanizmadır (daha kesin bir şekilde, WPF XAML işlemcisinin yükleme zamanında başvuran bir tür dönüştürücü ICommand davranışıdır).
Yeni Özel Komutlar
Komut kitaplığı sınıflarında yer alan komutlar, kendi komutlarınızı oluşturabilirsiniz. Özel komut oluşturmanın iki yolu vardır. Birincisi, baştan başlamak ve arabirimini ICommand uygulamaktır. Diğer yol ve daha yaygın yaklaşım, veya RoutedCommandRoutedUICommand oluşturmaktır.
Özel oluşturma örneği için RoutedCommand bkz. RoutedCommand