1

我有一个带有图像和按钮的堆栈面板。我想在用户单击 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>

我在运行时出现错误,提示“对于对象类型“DockSite”找不到方法名“OnAddUserControl”。我将不胜感激任何想法或帮助

4

1 回答 1

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>

单击按钮后,它将显示消息框。所以你改变你的项目以这种方式处理 Button Click 事件。

于 2013-05-22T11:24:49.160 回答