Condividi tramite


Procedura: Associare un comando a un controllo con supporto del comando

Nell'esempio seguente viene illustrato come associare una classe RoutedCommand a una classe Control che dispone del supporto incorporato per il comando. Per un esempio completo in cui i comandi sono associati a più origini, vedere l'esempio Create a Custom RoutedCommand Sample (Creare un esempio di oggetto RoutedCommand personalizzato).

Esempio

Windows Presentation Foundation (WPF) fornisce una libreria di comandi comuni che i programmatori di applicazioni riscontrano regolarmente. Le classi che costituiscono la libreria del comando sono: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands e EditingCommands.

Gli oggetti RoutedCommand statici che costituiscono queste classi non forniscono la logica per il comando. La logica per il comando è associata al comando con un CommandBinding. Alcuni controlli dispongono di CommandBinding incorporati per determinati comandi. Questo meccanismo consente di mantenere invariata la semantica di un comando, mentre l'implementazione effettiva può cambiare. Un oggetto TextBox, ad esempio, gestisce il comando Paste in modo diverso rispetto a un controllo progettato per supportare immagini, ma l'idea alla base dell'operazione di incollamento rimane invariata. La logica di comando non può essere fornita dal comando, bensì dal controllo o dall'applicazione.

Molti controlli in WPF includono il supporto incorporato per alcuni dei comandi nella libreria dei comandi. TextBox, ad esempio, supporta molti dei comandi di modifica dell'applicazione, ad esempio Paste, Copy, Cut, Redo e Undo. Lo sviluppatore dell'applicazione non deve eseguire operazioni particolari per garantire il funzionamento di questi comandi con tali controlli. Se la destinazione del comando eseguito è TextBox, il comando verrà gestito utilizzando il CommandBinding incorporato nel controllo.

Nell'esempio seguente viene illustrato come utilizzare un MenuItem come origine del comando Paste in cui TextBox è la destinazione del comando. Tutta la logica che definisce il modo in cui TextBox esegue Incolla è incorporata nel controllo TextBox.

Viene creata una classe MenuItem e la relativa proprietà Command è impostata sul comando Paste. La proprietà CommandTarget non è impostata esplicitamente sull'oggetto TextBox. Quando l'oggetto CommandTarget non è impostato, la destinazione per il comando è l'elemento con lo stato attivo della tastiera. Se l'elemento con lo stato attivo della tastiera non supporta il comando Paste oppure non è attualmente in grado di eseguire il comando Incolla, ad esempio gli Appunti sono vuoti, MenuItem viene visualizzato in grigio.

<Window x:Class="SDKSamples.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MenuItemCommandTask"
    >
    <DockPanel>
      <Menu DockPanel.Dock="Top">
        <MenuItem Command="ApplicationCommands.Paste" Width="75" />
      </Menu>
      <TextBox BorderBrush="Black" BorderThickness="2" Margin="25"
               TextWrapping="Wrap">
        The MenuItem will not be enabled until
        this TextBox gets keyboard focus  
      </TextBox>
    </DockPanel>
</Window>
// Window1 constructor
public Window1()
{
    InitializeComponent();

    // Instantiating UIElements.
    DockPanel mainPanel = new DockPanel();
    Menu mainMenu = new Menu();
    MenuItem pasteMenuItem = new MenuItem();
    TextBox mainTextBox = new TextBox();

    // Associating the MenuItem with the Paste command.
    pasteMenuItem.Command = ApplicationCommands.Paste;

    // Setting properties on the TextBox.
    mainTextBox.Text =
        "The MenuItem will not be enabled until this TextBox receives keyboard focus.";
    mainTextBox.Margin = new Thickness(25);
    mainTextBox.BorderBrush = Brushes.Black;
    mainTextBox.BorderThickness = new Thickness(2);
    mainTextBox.TextWrapping = TextWrapping.Wrap;

    // Attaching UIElements to the Window.
    this.AddChild(mainPanel);
    mainMenu.Items.Add(pasteMenuItem);
    mainPanel.Children.Add(mainMenu);
    mainPanel.Children.Add(mainTextBox);

    // Defining DockPanel layout.
    DockPanel.SetDock(mainMenu, Dock.Top);
    DockPanel.SetDock(mainTextBox, Dock.Bottom);
}
' Window1 constructor
Public Sub New()
    InitializeComponent()

    ' Instantiating UIElements.
    Dim mainPanel As New DockPanel()
    Dim mainMenu As New Menu()
    Dim pasteMenuItem As New MenuItem()
    Dim mainTextBox As New TextBox()

    ' Associating the MenuItem with the Paste command.
    pasteMenuItem.Command = ApplicationCommands.Paste

    ' Setting properties on the TextBox.
    mainTextBox.Text = "The MenuItem will not be enabled until this TextBox receives keyboard focus."
    mainTextBox.Margin = New Thickness(25)
    mainTextBox.BorderBrush = Brushes.Black
    mainTextBox.BorderThickness = New Thickness(2)
    mainTextBox.TextWrapping = TextWrapping.Wrap

    ' Attaching UIElements to the Window.
    Me.AddChild(mainPanel)
    mainMenu.Items.Add(pasteMenuItem)
    mainPanel.Children.Add(mainMenu)
    mainPanel.Children.Add(mainTextBox)

    ' Defining DockPanel layout.
    DockPanel.SetDock(mainMenu, Dock.Top)
    DockPanel.SetDock(mainTextBox, Dock.Bottom)
End Sub

Vedi anche