2013-05-22 28 views
1

我有一個圖像和按鈕的堆疊面板。我想在用戶點擊stackPanel中的一個按鈕時觸發事件。我在XAML代碼是Leftmouseclick stackpanel

<StackPanel x:Uid="TemperatureMonitor" Orientation="Horizontal" HorizontalAlignment="Left" ToolTip="{DynamicResource InstrumentZweiMesswert}" Height="35"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 
      <ei:CallMethodAction TargetObject="{Binding}" MethodName="OnAddUserControl"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

    <Image Width="35" Height="35" x:Uid="Image_15" Source="/Resources\png\TemperatureMonitor.png"/> 
    <Button x:Uid="TemperatureMonitor" Content="Temperatur Monitor" x:Name="TemperatureMonitor" IsEnabled="True" Width="135"/> 
</StackPanel> 

和方法OnAddUserControl在我的ViewModel是

public void OnAddUserControl(object sender, RoutedEventArgs e) 
{ 
    //some code    
} 

,我不進入OnAddUserControl的問題吧。任何想法爲什麼?

我想在用戶讓leftMouse點擊一個按鈕時觸發此事件。所以我不知道爲什麼,但RelayCommand也沒有幫助,並且不會觸發方法OnAddUserControl。當我搬到iteraction代碼到我的按鈕,它看起來像這樣:

<StackPanel Background="Black" x:Uid="TemperatureMonitor" Orientation="Horizontal" HorizontalAlignment="Left" ToolTip="{DynamicResource InstrumentZweiMesswert}" Height="35"> 
    <Image Width="35" Height="35" x:Uid="Image_15" Source="/Resources\png\TemperatureMonitor.PNG"/> 
    <Button x:Uid="TemperatureMonitor" Content="Temperatur Monitor" x:Name="TemperatureMonitor" IsEnabled="True" Width="135" > 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 
       <ei:CallMethodAction TargetObject="{Binding}" MethodName="OnAddUserControl"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers>  
    </Button> 
</StackPanel> 

我已經運行時錯誤,指出「對象類型」 DockSite「找不到方法名‘OnAddUserControl’」中獲得。我將不勝感激任何想法或幫助

+0

考慮使用Command或RelayCommand – David

+1

爲什麼不使用簡單的按鈕單擊事件處理程序? – cvraman

+0

嘗試給你的StackPanel背景'背景=「透明」'。 – LPL

回答

2

您可以使用RelayCommand來達到此目的。 將RelayCommand.cs添加到您的項目中。

class RelayCommand : ICommand 
    { 
     private Action<object> _action; 

     public RelayCommand(Action<object> action) 
     { 
      _action = action; 
     } 

     #region ICommand Members 

     public bool CanExecute(object parameter) 
     { 
      return true; 
     } 

     public event EventHandler CanExecuteChanged; 

     public void Execute(object parameter) 
     { 
      if (parameter != null) 
      { 
       _action(parameter); 
      } 
      else 
      { 
       _action("Hello World"); 
      } 
     } 

     #endregion 
    } 

而這是你的ViewModel。我稱之爲MainWindowViewModel。因此,將MainWindowViewModel.cs類添加到您的解決方案。

class MainWindowViewModel 
{ 
    private ICommand m_ButtonCommand; 
    public ICommand ButtonCommand 
    { 
     get 
     { 
      return m_ButtonCommand; 
     } 
     set 
     { 
      m_ButtonCommand = value; 
     } 
    } 

    public MainWindowViewModel() 
    { 
     ButtonCommand=new RelayCommand(new Action<object>(ShowMessage)); 
    } 

    public void ShowMessage(object obj) 
    { 
     MessageBox.Show(obj.ToString()); 
    } 
} 

這是您的XAML:

<Window.DataContext> 
     <local:MainWindowViewModel/> 
</Window.DataContext> 

<StackPanel> 
    <Button Width="220" Content="Click me" Command={Binding ButtonCommand} CommandParameter="StackOverflow" /> 
</StackPanel> 

它會點擊按鈕後,顯示你的MessageBox。因此,您可以通過這種方式更改您的項目以處理Button Click事件。