Condividi tramite


Procedura: Associare un comando a un controllo con il supporto dei comandi

Nell'esempio seguente viene illustrato come collegare un RoutedCommand a un Control che include il supporto predefinito per il comando. Per un esempio completo che collega i comandi a più origini, vedere l'esempio Creare un esempio di 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 dei comandi sono: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandse EditingCommands.

Gli oggetti statici RoutedCommand che costituiscono queste classi non forniscono logica di comando. La logica per il comando è associata al comando con un CommandBinding. Alcuni controlli sono incorporati in CommandBindings per alcuni comandi. Questo meccanismo consente alla semantica di un comando di rimanere invariata, mentre l'implementazione effettiva può cambiare. Un TextBox, ad esempio, gestisce il comando Paste in modo diverso rispetto a un controllo progettato per supportare le immagini, ma l'idea di base di cosa significa incollare qualcosa rimane invariato. La logica del comando non può essere fornita dal comando, ma deve essere fornita dal controllo o dall'applicazione.

Molti controlli in WPF includono il supporto integrato per alcuni comandi nella libreria comandi. TextBox, ad esempio, supporta molti comandi di modifica dell'applicazione, ad esempio Paste, Copy, Cut, Redoe Undo. Lo sviluppatore di applicazioni non deve eseguire alcuna operazione speciale per ottenere questi comandi per lavorare con questi controlli. Se il TextBox è la destinazione del comando quando viene eseguito il comando, gestirà il comando usando il CommandBinding integrato nel controllo .

Di seguito viene illustrato come usare un MenuItem come origine del comando per il comando Paste, dove un TextBox è la destinazione del comando. Tutta la logica che definisce come il TextBox esegue l'operazione di incolla è integrata nel controllo TextBox.

Viene creata una MenuItem e la proprietà Command è impostata sul comando Paste. Il CommandTarget non è esplicitamente impostato sull'oggetto TextBox. Quando CommandTarget non è impostato, la destinazione per il comando è l'elemento che ha il focus della tastiera. Se l'elemento con focus sulla tastiera non supporta il comando Paste o non è attualmente in grado di eseguire il comando Incolla (gli Appunti sono vuoti, ad esempio), il MenuItem sarà disattivato.

<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

Vedere anche