如何:啟用命令
下列範例示範如何在 Windows Presentation Foundation (WPF) 中使用命令。 此範例示範如何將 RoutedCommand (部分機器翻譯) 與 Button (部分機器翻譯) 建立關聯、建立 CommandBinding (部分機器翻譯),以及建立會實作 RoutedCommand (部分機器翻譯) 的事件處理常式。 如需命令的詳細資訊,請參閱命令概觀。
範例
程式碼的第一個區段會建立由 Button (部分機器翻譯) 和 StackPanel (部分機器翻譯) 組成的使用者介面 (UI),並建立會將命令處理常式與 CommandBinding (部分機器翻譯) 建立關聯的 RoutedCommand (部分機器翻譯)。
Command (部分機器翻譯) 的 Button (部分機器翻譯) 屬性會與 Close (部分機器翻譯) 命令相關聯。
CommandBinding (部分機器翻譯) 會新增至根 CommandBindingCollection (部分機器翻譯) 的 Window (部分機器翻譯)。 Executed (部分機器翻譯) 和 CanExecute (部分機器翻譯) 事件處理常式會連結至這個繫結,並與 Close (部分機器翻譯) 命令相關聯。
沒有 CommandBinding (部分機器翻譯) 就沒有命令邏輯,只有用來叫用命令的機制。 按一下 Button (部分機器翻譯) 時,則會在命令目標上先後引發 PreviewExecuted (部分機器翻譯) RoutedEvent (英文) 與 Executed (部分機器翻譯) RoutedEvent (英文)。 這些事件會周遊元素樹狀以尋找該特定命令的 CommandBinding (部分機器翻譯)。 值得注意的是,因為 RoutedEvent (英文) 會在元素樹狀中進行事件的通道處理和反昇處理,所以必須謹慎考慮 CommandBinding (部分機器翻譯) 的放置位置。 如果 CommandBinding (部分機器翻譯) 位於命令目標的同層級,或位於不在 RoutedEvent (英文) 路由上的另一個節點上,則系統不會存取 CommandBinding (部分機器翻譯)。
<Window x:Class="WCSamples.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CloseCommand"
Name="RootWindow"
>
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Close"
Executed="CloseCommandHandler"
CanExecute="CanExecuteHandler"
/>
</Window.CommandBindings>
<StackPanel Name="MainStackPanel">
<Button Command="ApplicationCommands.Close"
Content="Close File" />
</StackPanel>
</Window>
// Create ui elements.
StackPanel CloseCmdStackPanel = new StackPanel();
Button CloseCmdButton = new Button();
CloseCmdStackPanel.Children.Add(CloseCmdButton);
// Set Button's properties.
CloseCmdButton.Content = "Close File";
CloseCmdButton.Command = ApplicationCommands.Close;
// Create the CommandBinding.
CommandBinding CloseCommandBinding = new CommandBinding(
ApplicationCommands.Close, CloseCommandHandler, CanExecuteHandler);
// Add the CommandBinding to the root Window.
RootWindow.CommandBindings.Add(CloseCommandBinding);
' Create ui elements.
Dim CloseCmdStackPanel As New StackPanel()
Dim CloseCmdButton As New Button()
CloseCmdStackPanel.Children.Add(CloseCmdButton)
' Set Button's properties.
CloseCmdButton.Content = "Close File"
CloseCmdButton.Command = ApplicationCommands.Close
' Create the CommandBinding.
Dim CloseCommandBinding As New CommandBinding(ApplicationCommands.Close, AddressOf CloseCommandHandler, AddressOf CanExecuteHandler)
' Add the CommandBinding to the root Window.
RootWindow.CommandBindings.Add(CloseCommandBinding)
程式碼的下一個區段會實作 Executed (部分機器翻譯) 和 CanExecute (部分機器翻譯) 事件處理常式。
Executed (部分機器翻譯) 處理常式會呼叫方法來關閉開啟的檔案。
CanExecute (部分機器翻譯) 處理常式會呼叫方法來判斷檔案是否已開啟。 如果檔案已開啟,則 CanExecute (部分機器翻譯) 會設定為 true
,否則會設定為 false
。
// Executed event handler.
private void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
// Calls a method to close the file and release resources.
CloseFile();
}
// CanExecute event handler.
private void CanExecuteHandler(object sender, CanExecuteRoutedEventArgs e)
{
// Call a method to determine if there is a file open.
// If there is a file open, then set CanExecute to true.
if (IsFileOpened())
{
e.CanExecute = true;
}
// if there is not a file open, then set CanExecute to false.
else
{
e.CanExecute = false;
}
}
' Executed event handler.
Private Sub CloseCommandHandler(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
' Calls a method to close the file and release resources.
CloseFile()
End Sub
' CanExecute event handler.
Private Sub CanExecuteHandler(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
' Call a method to determine if there is a file open.
' If there is a file open, then set CanExecute to true.
If IsFileOpened() Then
e.CanExecute = True
' if there is not a file open, then set CanExecute to false.
Else
e.CanExecute = False
End If
End Sub