0

我遇到了 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. 
}

但是,如果我LineSeriesCursor在 WPF 属性网格中添加,然后导航到LineSeriesCursorXAML 中的标记,PositionChanged从属性网格添加事件处理程序,则在没有ref的情况下创建方法存根,如下所示:

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 的错误。有没有类似的经验或建议?

谢谢你的帮助。

4

1 回答 1

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;
};
于 2013-01-31T11:43:39.923 回答