我遇到了Visual Studio 2010的WPF属性网格的一个非常奇怪的行为。我正在开发一个包含大量属性和事件处理程序的组件工具集。 ref 参数导致问题。
在我的一个对象中,我有PositionChanged
事件处理程序, ref 参数定义如下:
public delegate void PositionChangedHandler(LineSeriesCursor sender, double newValue, **ref** bool cancelRendering);
public event PositionChangedHandler PositionChanged = null;
当我创建LineSeriesCursor
的实例并定义事件处理程序
LineSeriesCursor cursor = new LineSeriesCursor();
cursor.PositionChanged += [TAB][TAB]
它正确地创建了处理程序方法存根:
cursor.PositionChanged += new LineSeriesCursor.PositionChangedHandler(cursor_PositionChanged);
void cursor_PositionChanged(LineSeriesCursor sender, double newValue, **ref** bool cancelRendering)
{
//this works and compiles then OK.
}
但是,如果我在WPF属性网格中添加LineSeriesCursor
,然后导航到XAML中的LineSeriesCursor
标记,从属性网格添加PositionChanged
事件处理程序,则创建方法存根参考,如下:
private void LineSeriesCursor_PositionChanged(LineSeriesCursor sender, double newValue, bool cancelRendering)
{
//Does not compile, because of invalid method parameter list. **ref** is missing.
}
对我来说,这听起来像是Visual Studio 2010的错误。关于此事的任何类似经历或建议?
感谢您的帮助。
答案 0 :(得分:0)
为什么不遵循microsoft方式并从EventArgs
派生例如
public class PositionChangedEventArgs : EventArgs
{
public bool Cancel {get;set;}
public int NewValue {get;set;}
}
public event EventHandler<PositionChangedEventArgs> PositionChanged {get;set;}
protected virtual void OnPositionChanged(int newValue)
{
if (this.PositionChanged !=null)
{
var args = new PositionChangedEventArgs(){NewValue = newValue};
this.PositionChanged(this,args);
if (args.Cancel)
{
//Do something to cancel..
}
}
}
然后
cursor.PositionChanged += (sender,e) =>
{
e.Cancel = true;
var x = e.NewValue;
};