我正在重写ContentControl,它继承自Control,它具有dep prop Foreground ..我想在前台更改事件上运行一些自定义逻辑,但没有OnForegroundChanged方法可以覆盖。还有许多其他属性已更改事件处理程序,但不是前台。这是设计好的还是我漏掉了什么?
ContentControl
Control
Foreground
OnForegroundChanged
kg7wmglp1#
没有事件通知任何属性已更改,但事件并不是接收通知的唯一方式。例如,绑定将在任何Dependency Property更改时收到通知。为此,它不需要创建具有附加事件的派生元素。监听依赖属性更改的最简单方法是使用DependencyPropertyDescriptor:
var descriptor = DependencyPropertyDescriptor.FromProperty(ForegroundProperty, control.GetType()); descriptor.AddValueChanged(control, OnForegroundChanged);
OnForegroundChanged-值更改侦听器方法。
**P.S.**在添加或删除许多对象时使用此方法时要小心。AddValueChanged方法创建了一个对listener方法的强引用(在本例中是OnForegroundChanged)。如果它是一个示例方法,那么该示例将保存在内存中,直到调用RemoveValueChanged。如果不这样做,就有可能发生内存泄漏。
AddValueChanged
RemoveValueChanged
anhgbhbe2#
当前台值发生更改时,没有可以订阅以获得通知的事件(请检查前台属性定义)一种解决方案是像这样为自定义控件提供元数据
static MyCustomControl() { ForegroundProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(OnForegroundChanged)); } private static void OnForegroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var myCustomControl = (MyCustomControl)d; // do something }
这与ProgressBar代码中使用的方法相同。
ProgressBar
2条答案
按热度按时间kg7wmglp1#
没有事件通知任何属性已更改,但事件并不是接收通知的唯一方式。例如,绑定将在任何Dependency Property更改时收到通知。为此,它不需要创建具有附加事件的派生元素。
监听依赖属性更改的最简单方法是使用DependencyPropertyDescriptor:
OnForegroundChanged
-值更改侦听器方法。**P.S.**在添加或删除许多对象时使用此方法时要小心。
AddValueChanged
方法创建了一个对listener方法的强引用(在本例中是OnForegroundChanged)。如果它是一个示例方法,那么该示例将保存在内存中,直到调用RemoveValueChanged
。如果不这样做,就有可能发生内存泄漏。anhgbhbe2#
当前台值发生更改时,没有可以订阅以获得通知的事件(请检查前台属性定义)
一种解决方案是像这样为自定义控件提供元数据
这与
ProgressBar
代码中使用的方法相同。