左键单击stackpanel

本文关键字:stackpanel 单击 | 更新日期: 2023-09-27 18:14:53

我有一个带有图像和按钮的stackpanel。我想当用户单击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>

方法OnAddUserControl在我的viewModel是

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

问题是我没有进入OnAddUserControl。知道为什么吗?

我想在用户左键点击按钮时触发此事件。我不知道为什么,但是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"。如有任何建议或帮助,我将不胜感激

左键单击stackpanel

您可以使用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事件的项目。