2012-12-04 103 views
0

我在WPF窗口中有一個按鈕。我想通過按下鼠標左鍵並單擊Ctrl + F來顯示消息。我想要XAML中的大部分代碼。代碼如下。 我的問題是,鼠標點擊正在爲我工​​作,但不是按鍵。任何人都可以幫助我。提前致謝。WPF CommandBinding不工作

MyWindow.xaml 

<Window x:Class="Commands_Xaml.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="164,88,0,0" Name="button1" VerticalAlignment="Top" Width="75"> 
      <Button.CommandBindings> 
       <CommandBinding Command="ApplicationCommands.Find" Executed="CommandBinding_Executed"/> 
      </Button.CommandBindings> 
      <Button.InputBindings> 
       <KeyBinding Key="F" Modifiers="Control" Command="ApplicationCommands.Find"/> 
       <MouseBinding MouseAction="LeftClick" Command="ApplicationCommands.Find"/> 
      </Button.InputBindings> 
     </Button> 
    </Grid> 
</Window> 


MainWindow.xaml.cs 

namespace Commands_Xaml 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent();    
      //ApplicationCommands.Find.InputGestures.Add(new KeyGesture(Key.F,ModifierKeys.Control)); 
      //ApplicationCommands.Find.InputGestures.Add(new MouseGesture(MouseAction.LeftClick)); 

      //CommandBinding bindingObject = new CommandBinding(); 
      //bindingObject.Command = ApplicationCommands.Find; 
      //bindingObject.Executed += new ExecutedRoutedEventHandler(CommandBinding_Executed); 
      //this.CommandBindings.Add(bindingObject); 
     } 

     private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
     { 
      MessageBox.Show("Button clicked"); 
     } 
    } 
} 
+0

您是否在命令中使用了正確的Mouse Command事件方法? –

+0

是鮑勃,只是爲了理解目的,我寫了我的代碼。它適用於鼠標點擊,但不適用於鍵盤輸入。 – WpfBee

回答

2

將命令綁定/輸入綁定移動到窗口級別並使用按鈕的Command屬性而不是嘗試使用MouseBinding。

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.Find" Executed="CommandBinding_Executed" /> 
    </Window.CommandBindings> 
    <Window.InputBindings> 
     <KeyBinding Command="ApplicationCommands.Find" Key="F" Modifiers="Control" /> 
    </Window.InputBindings> 

    <Grid> 
     <Button Command="ApplicationCommands.Find" Content="Button" HorizontalAlignment="Left" Margin="206,152,0,0" VerticalAlignment="Top" Width="75"/> 
    </Grid> 
</Window> 

UPDATE

根據不同的按鈕點擊有不同的行爲,這是可以實現的幾種方法。這裏有兩個:

<Button Command="ApplicationCommands.Find" Content="Button1" /> 
<Button Command="ApplicationCommands.Print" Content="Button2" /> 

使用CommandParameter

每個按鈕使用不同的命令

<Button Command="ApplicationCommands.Find" CommandParameter="Find1" Content="Button1" /> 
<Button Command="ApplicationCommands.Find" CommandParameter="Find2" Content="Button2" /> 

而對於按鍵綁定:

<KeyBinding Command="ApplicationCommands.Find" CommandParameter="Find3" /> 

您可以訪問此屬性在CommandBinding.Executed處理程序中:

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    if (e.Parameter as string == "Find1") 
    { 
     //Find1 
    } 
    else if (e.Parameter as string == "Find2") 
    { 
     //Find2 
    }  
    else if (e.Parameter as string == "Find3") 
    { 
     //Find3 
    } 
} 
+0

感謝RQDQ,你的建議爲我工作。但我有幾個查詢:1.對於鼠標點擊,我們不需要做MouseBinding。如果是這樣,那麼爲什麼。因爲我的鼠標點擊也在工作,沒有做任何特定的事情呢? 2.假設我想有一個按鈕,我想爲這兩個按鈕設置一個公共的事件處理程序。在這個事件處理程序中,我想根據不同的按鈕點擊執行一些任務。怎麼做?提出這個問題的理由是當我在CommandBinding_Executed()中看到發件人時,我發現它是Window,並且我想在此獲取按鈕信息而不是窗口信息。 – WpfBee

+0

@WpfBee - 根據不同的命令調用,有幾種方法可以具有不同的行爲。我已經加了兩個。 – RQDQ

+0

@ RQDQ-我的查詢#1,請您回答。查詢#2,我想在命令處理程序中接收按鈕對象作爲發件人,但我仍然沒有收到。當使用鼠標點擊時,接收命令參數(Find1/Find2)有效,但如果嘗試Qtrl + F,則命令處理程序內收到的命令參數爲空。 – WpfBee