WinForms Designer:当从表单中删除另一个控件中引用的控件时获取通知

问题描述 投票:0回答:1

我有一个自定义控件,其属性允许在表单上选择特定类型的另一个控件。为简单起见,将其设为 TextBox 控件。我的自定义控件的属性如下所示:

private TextBox _targetControl;

public TextBox TargetControl
{
    get {return _targetControl;}
    set {_targetControl = value;}
}

当在设计时从表单中删除选定的目标控件时,有没有办法在我的自定义控件中获取通知?请注意,目标控件可以位于诸如 Panel 之类的容器中(即它不是表单的 Controls 集合的项目)。

.net winforms controls design-time
1个回答
0
投票

要在设计时添加、删除、重命名或以其他方式更改 Componenet 时接收通知,您可以调用 [Component].GetService() 方法来初始化当前站点上的 IComponentChangeService

此接口允许订阅事件,如 IComponentChangeService.ComponentRemoved,当表单设计器中的组件发生某些事情时引发。

例如,当定位此 UserControl 时,它会订阅

ComponentRemoved
ComponentRemoving
事件,以验证该事件是否与
TargetControl
属性引用的 Control 相关:

public partial class UCComponentsChange : UserControl {
    private IComponentChangeService componentChangeService;

    public UCComponentsChange() =>InitializeComponent();

    private TextBox _targetControl = null;
    public TextBox TargetControl {
        get => _targetControl;
        set => _targetControl = value;
    }

    public override ISite Site {
        get => base.Site;
        set {
            base.Site = value;
            RegisterComponentsChangeNotifications();
        }
    }

    private void RegisterComponentsChangeNotifications() {
        if (componentChangeService != null) {
            componentChangeService.ComponentRemoving -= NotifyComponentRemoving;
            componentChangeService.ComponentRemoved -= NotifyComponentRemoved;
        }

        componentChangeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService;
        if (componentChangeService != null) {
            componentChangeService.ComponentRemoving += NotifyComponentRemoving;
            componentChangeService.ComponentRemoved += NotifyComponentRemoved;
        }
    }

    private void NotifyComponentRemoving(object sender, ComponentEventArgs e) {
        if (IsTargetControlAffected(e.Component)) {
            // Our Control is being removed
        }
    }

    private void NotifyComponentRemoved(object sender, ComponentEventArgs e) {
        if (IsTargetControlAffected(e.Component)) {
            // Our Control has been removed
        }
    }

    private bool IsTargetControlAffected(IComponent component) =>
        _targetControl != null && _targetControl == component;
}
© www.soinside.com 2019 - 2024. All rights reserved.