鼠标左键单击stackpanel

时间:2013-05-22 10:59:24

标签: c# wpf xaml mvvm

我有一个带有图像和按钮的堆叠面板。我想在用户点击stackPanel中的按钮时触发事件。我在xaml中的代码是

<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>

我的viewModel中的方法OnAddUserControl是

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

我没有进入OnAddUserControl的问题。有什么想法吗?

当用户在按钮上创建leftMouseClick时,我想触发此事件。所以我不知道为什么,但是RelayCommand也没有帮助而且没​​有触发方法OnAddUserControl。当我将迭代代码移动到我的按钮时,它看起来像这样:

<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>

我在运行时错误中得到“For object Type”DockSite“找不到methodname”OnAddUserControl“”。我将不胜感激任何想法或帮助

1 个答案:

答案 0 :(得分: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事件的项目。

相关问题