如何从外部为UserControl内部的控件分配事件处理程序

本文关键字:控件 分配 事件处理 程序 内部 从外部 UserControl | 更新日期: 2023-09-27 18:19:15

如果我有一个UserControl

<UserControl
    x:Class="UserInterface.AControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Button
            Content="Set"
            Name="setButton" />
    </Grid>
</UserControl>

如何在外部分配一个事件处理程序为setButton时使用此控件?

<UserControl
    xmlns:my="clr-namespace:UserInterface"
    x:Class="UserInterface.AnotherControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <my:AControl />
    </Grid>
</UserControl>

我可以用这样的东西吗?

        <my:AControl
              setButton.Click="setButton_Click" />

如何从外部为UserControl内部的控件分配事件处理程序

你不能真正做到这一点,但你可以做的是在你的自定义UserControl(控件)中,从它"SetButtonClicked"中暴露一个公共事件,然后订阅它。假设网管上存在SetButton。

例如,控件的c#代码将变成

public class AControl : UserControl
{ 
    public event EventHandler<EventArgs> SetButtonClicked;
    public AControl ()
    {
        InitializeComponent();
        this.setButton.Click += (s,e) => OnSetButtonClicked;
    }
    protected virtual void OnSetButtonClicked()
    {
        var handler = SetButtonClicked;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

,在Xaml中,您将订阅如下

<my:AControl SetButtonClick="setbutton_Clicked"/>

编辑:我会问你在这里想要实现什么。如果你想处理一些额外的行为之外的控件,那么也许调用事件别的东西?例如,您只是想通知某人单击了按钮,或者操作完成了吗?通过在控件中封装您的自定义点击行为,您可以公开控件的消费者真正关心的行为。致以最诚挚的问候