2010-12-16 50 views
1

我有一个ListView在平铺模式。我创建了一个自定义方法来触发SizeChanged事件时触发。有没有办法覆盖这个,所以方法在SizeChanged事件被触发之前触发?C#列表视图钩预先SizeChanged事件

我试图寻找一个SizeChanging事件,但没有一个。我怎样才能做到这一点?

+0

什么是将此更改设置关闭?客户端窗口大小;代码等? – curtisk 2010-12-16 18:32:02

+0

只有表单的ResizeBegin事件是这里的候选人。仅当列表视图停靠或锚定时才相关。其他任何事情都需要时间机器。 – 2010-12-16 20:24:40

回答

3

为了在触发SizeChanged事件之前添加一些逻辑,您需要继承现有的ListView控件。在项目中创建一个新的类,并将此代码粘贴到它:

public class CustomListView : ListView 
{ 

    protected override void OnSizeChanged(System.EventArgs e) 
    { 
     //Fire my custom method before the ListView's size is changed 
     MyCustomMethod(); 

     base.OnSizeChanged(e); 
    } 

    private void MyCustomMethod() 
    { 
     //Insert your custom logic here 
     //... 
    }  

} 

然后建立您的项目,并使用此CustomListView控制(或任何你决定将它命名),而不是标准ListView


另外,如果你想从控制本身分离自定义逻辑,你可以让你的自定义列表视图引发一个事件。然后,您可以处理这个新事件(为了保持一致性,我们将其称为SizeChanging),无论您在代码中需要什么地方。例如,修改上面的示例:

public class CustomListView : ListView 
{ 

    public event EventHandler SizeChanging; 

    protected override void OnSizeChanged(System.EventArgs e) 
    { 
     //Raise the SizeChanging event before the ListView's size is changed 
     if (SizeChanging != null) { 
      SizeChanging(this, e); 
     } 

     base.OnSizeChanged(e); 
    } 

} 
+0

nitpicky:'Control'派生自'System.ComponentModel.Component',所有控件(和Form)事件都由'Component.Events'('System.ComponentModel.EventHandlerList')管理。建议使用这种机制,而不是将事件指针添加到Control实例。 http://msdn.microsoft.com/en-us/library/system.componentmodel.eventhandlerlist.aspx – Tergiver 2010-12-16 19:00:12

+1

@Tergiver:有趣的是,我认为我从未见过这种地方。出于好奇,因为你链接到的文档没有这样说,有没有特别推荐的地方,或许有一个例子? – 2010-12-16 19:06:40

+0

如果您要求比Tergiver推荐使用该模式更好的参考,我没有。我会鼓励你运用逻辑。具有20个事件的类有20个指针,即使没有任何这些事件的订阅者。使用Component.Events通过消除指针来减少类的足迹。我给出的链接在社区内容部分有一个例子。 Control.Events已经暴露(保护),所以你不必声明它。我不喜欢在示例中使用字符串键,而宁愿使用静态只读对象KeyIdentifier = new Object()。 – Tergiver 2010-12-16 20:05:03