Skip to content

Forum

Please or Register to create posts and topics.

WPF ApplicationCommands.Paste

ciao a tutti,

Sto provando ad usare i commands in WPF direttamente nello XAML lo scopo è copiare dagli appunti un immagine dentro un controllo <Image> il codice XAML è il seguente:

<Image Height="450" Width="450" Name="immagine" />
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="Seleziona" Margin="10,10,10,0" />
<Button Content="Incolla" Margin="10,10,10,0" Command="ApplicationCommands.Paste" CommandTarget="{Binding ElementName=immagine}"/>
</StackPanel>

l'unico effetto che ottengo è che il button si disattiva come se non avesse niente negli appunti da copiare anche se so che c'è un immagine..

ho fatto una prova anche con un testo

<TextBox Width="335" IsEnabled="False" Name="testoprova"/>
<Button Content="Incolla" Margin="20" Command="ApplicationCommands.Paste" CommandTarget="{Binding ElementName=testoprova}"/>
Stessa cosa ottengo solo che il bottone si disattiva.. sicuramente mi son perso qualcosa.. ma non so cosa 🙂

Hai implementato il Command Binding per i command?

<Window.CommandBindings>
<CommandBinding
CanExecute="Test_CanExecute"
Command="{x:Static lcmd:NsAppCommands.ServiceActions}"
Executed="Test_Executed" />
<Window.CommandBindings>

E ovviamente i due event handler conseguenti

lcmd è un namespace della mia applicazione in cui si trova la classe che contiene i routed command:

xmlns:lcmd="clr-namespace:IOME.Applicazione.Commands"

 

Non ricordo esattamente come va agganciato il command di ApplicationCommands perché mi piace definirmeli da me. ma solitamente i command poi si chiamano così nel Button o ribbon o quel che vuoi:

 Command="{x:Static lcmd:NsAppCommands.ServiceActions}"
 CommandParameter="Start"

Eventualmente passando un parametro per usare lo stesso command per più cose.

private void ServiceActions_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
	string para = null;
	if (e.Parameter != null)
	{
		para = e.Parameter.ToString();
	}
	switch (para)
	{
		case "Start":
			e.CanExecute = WModel.ServiceStatus != Base.Services.NsServiceStates.Running;
			break;
		case "Stop":
			e.CanExecute = WModel.ServiceStatus == Base.Services.NsServiceStates.Running;
			break;

		default:
			e.CanExecute = false;
			break;
	}
}
 
/// <summary>
/// Evento di gestione command permette lo start e stop del servizio.
/// </summary>
/// <param name="sender">Command</param>
/// <param name="e">Parametri del command</param>
private void ServiceActions_Executed(object sender, ExecutedRoutedEventArgs e)
{
	WModel.SwitchService();
}

Questa è l'implementazione degli eventi, CanExecute attiva o disattiva i Button (o qualsiasi controllo) che chiama il command, se vuoi che sia sempre attivo metti solo e.CanExecute = true;

public static class NsAppCommands
{
	
	/// <summary>
	/// Command per il controllo del servizio
	/// </summary>
	public static readonly RoutedCommand ServiceActions = new RoutedCommand();
}        

E questa è la classe che implementa i command.

In questo caso è un command che permette di fare lo start o lo stop di un servizio windows.

Spero di averti dato una mano.