【问题标题】:WPF: How do I use one User control for multiple different Click eventsWPF:如何将一个用户控件用于多个不同的单击事件
【发布时间】:2015-05-11 00:50:20
【问题描述】:

我正在尝试为主页上的所有按钮创建一个用户控件,每个用户控件都应该有不同的 Click 事件。我试图通过向用户控件添加一个属性(适用于标签和图像)来解决这个问题,但我找不到 Click 事件的任何解决方案。

ImageLabelButton.xaml:

<UserControl x:Class="SC.UI.WPF.Controls.ImageLabelButton"
<Grid>
    <Button Name="BtnClick">
        <StackPanel>
                <Image Name="ImageButton"/>
                <Label Name="LabelButton"/>
        </StackPanel>
    </Button>
</Grid>

ImageLabelButton.xaml.cs:

....
  <!-- works -->
  public string Name
  {
      get { return this.LabelButton.Content.ToString(); }
      set { this.LabelButton.Content = value; }
  }
  <!-- works -->
  public ImageSource SetSource
  {
      get { return ImageButton.Source; }
      set { ImageButton.Source = value; }
  }
  <!-- doesn't work -->
  public EventHandler ButtonAction
  {
      get { return BtnClick.Click; }
      set { BtnClick.Click= value; }
  }

Implementation.xaml:

....
<controls:ImageLabelButton Name="first" SetSource="test.png" ButtonAction="Click1"/>
<controls:ImageLabelButton Name="first" SetSource="test.png" ButtonAction="Click2"/>
<controls:ImageLabelButton Name="first" SetSource="test.png" ButtonAction="Click3"/>

【问题讨论】:

    标签: c# wpf xaml events controls


    【解决方案1】:

    您只需要将事件处理程序设置为用户控件的属性并在使用代码中进行设置:

    用户控制 XAML:

    <Grid>
        <Button Name="BtnClick" Click="BtnClick_DoClick">
            <StackPanel>
                <Image Name="ImageButton"/>
                <Label Name="LabelButton"/>
            </StackPanel>
        </Button>
    </Grid>
    

    用户控制代码隐藏:

        public EventHandler<RoutedEventArgs> ButtonAction;
    
        private void BtnClick_DoClick(object sender, RoutedEventArgs e)
        {
            if (ButtonAction != null) ButtonAction(sender, e);
        }
    

    实施 XAML:

    <controls:ImageLabelButton Name="first1" SetSource="test.png" />
    <controls:ImageLabelButton Name="first2" SetSource="test.png" />
    <controls:ImageLabelButton Name="first3" SetSource="test.png" />
    

    后面的实现代码:

        public MainWindow()
        {
            InitializeComponent();
    
            first1.ButtonAction = Button1;
            first2.ButtonAction = Button2;
            first3.ButtonAction = Button3;
        }
    
        private void Button3(object sender, RoutedEventArgs e) { MessageBox.Show("Pressed 3"); }
        private void Button2(object sender, RoutedEventArgs e) { MessageBox.Show("Pressed 2"); }
        private void Button1(object sender, RoutedEventArgs e) { MessageBox.Show("Pressed 1"); }
    

    虽然您不能以这种方式在 XAML 中设置事件处理。

    【讨论】:

      【解决方案2】:

      您的用户控件上需要一个可从 Implementation.xaml 访问的 RoutedEvent

      ImageLabelButton.xaml

      <Button Name="BtnClick" Click="Submit_Click">
          <StackPanel>
                  <Image Name="ImageButton"/>
                  <Label Name="LabelButton"/>
          </StackPanel>
      </Button>
      

      ImageLabelButton.cs

      private void Submit_Click(object sender, RoutedEventArgs e)
          {
              RaiseEvent(new RoutedEventArgs(ClickEvent, this));
          }
      
          public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent(
              "Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
      
          public event RoutedEventHandler Click
          {
              add { AddHandler(ClickEvent, value); }
              remove { RemoveHandler(ClickEvent, value); }
          }
      

      实施.xaml

      <controls:ImageLabelButton Name="first" SetSource="test.png" Click="Click1"/>
      

      实施.xaml.cs

      private void Click1(object sender, RoutedEventArgs e)
      {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 2011-03-31
        • 1970-01-01
        • 2019-08-06
        • 1970-01-01
        相关资源
        最近更新 更多