若要在设计时添加、移除、重命名或以其他方式更改组件时接收通知,可以调用[Component].GetService()方法来初始化当前站点上的IComponentChangeService.
此接口允许订阅事件,如IComponentChangeService.ComponentRemoved,当something happens引发到窗体设计器中的组件时会引发这些事件.
例如,当定位此UserControl时,它订阅ComponentRemoved
和ComponentRemoving
事件,以验证该事件是否与TargetControl
属性引用的控件相关:
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. Set the reference to null
TargetControl = null;
}
}
private bool IsTargetControlAffected(IComponent component) =>
_targetControl != null && _targetControl == component;
}