【发布时间】:2012-12-22 11:02:35
【问题描述】:
我只是尝试使用 C++/CLI 订阅 WPF 属性更改事件。我没想到这会变得困难。
首先我尝试订阅某个窗口的特定属性(IsMouseDirectlyOver),最后通过以下代码成功:
void MyClass::DependencyPropertyChanged(Object^ sender, DependencyPropertyChangedEventArgs args)
{
Debug::WriteLine("DependencyPropertyChanged: "+sender->ToString()+", "+args.Property->Name);
}
window->IsMouseDirectlyOverChanged += gcnew DependencyPropertyChangedEventHandler(this, &MyClass::DependencyPropertyChanged);
然后我尝试订阅对象的任何属性更改(这对我来说最重要,因为我的最终代码必须能够通过属性名称处理属性更改)。我完全失败了。
我尝试了各种方法,但都没有奏效。我找不到任何 C++/CLI 示例,但根据文档和 C# 示例,以下对我来说似乎是最明智的代码:
window->PropertyChanged += gcnew PropertyChangedEventHandler(this, &MyClass::PropertyChanged);
void MyClass::PropertyChanged(Object^ sender, PropertyChangedEventArgs^ args)
{
...
}
但是编译器通过错误 C2039 告诉我“PropertyChangedEvent”不是“System::Windows::Window”的元素。
我怎样才能实现我想要的?
【问题讨论】:
-
WPF Window 类根本没有实现INotifyPropertyChanged,因此没有 PropertyChanged 事件。
-
您真的想在窗口中收到关于任何属性更改的通知吗?
-
是的。但不仅仅是一个窗口。它也应该适用于任何其他类型的可视化树对象。
-
嗯...不,我并不完全正确。我需要通过 name 订阅属性更改。这实际上并不意味着我需要订阅所有属性。上述机制似乎是唯一允许按名称访问的机制(在事件处理程序方法中使用名称切换/大小写)。如果有一种方法可以通过名称专门订阅一个或多个属性,这也可以解决我的问题。
标签: wpf c++-cli dependency-properties visual-c++-2010 propertychanged