XAML WPF -为什么控件中没有OnForegroundChanged方法?

2izufjch  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(110)

我正在重写ContentControl,它继承自Control,它具有dep prop Foreground ..我想在前台更改事件上运行一些自定义逻辑,但没有OnForegroundChanged方法可以覆盖。还有许多其他属性已更改事件处理程序,但不是前台。这是设计好的还是我漏掉了什么?

  • P.S.我只需要依赖属性事件处理程序,我不寻找任何其他解决方案 *
kg7wmglp

kg7wmglp1#

没有事件通知任何属性已更改,但事件并不是接收通知的唯一方式。例如,绑定将在任何Dependency Property更改时收到通知。为此,它不需要创建具有附加事件的派生元素。
监听依赖属性更改的最简单方法是使用DependencyPropertyDescriptor:

var descriptor = DependencyPropertyDescriptor.FromProperty(ForegroundProperty, control.GetType());
    descriptor.AddValueChanged(control, OnForegroundChanged);

OnForegroundChanged-值更改侦听器方法。

**P.S.**在添加或删除许多对象时使用此方法时要小心。AddValueChanged方法创建了一个对listener方法的强引用(在本例中是OnForegroundChanged)。如果它是一个示例方法,那么该示例将保存在内存中,直到调用RemoveValueChanged。如果不这样做,就有可能发生内存泄漏。

anhgbhbe

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代码中使用的方法相同。

相关问题