Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#ListView钩子预大小更改事件_C#_Winforms_Events_Hook - Fatal编程技术网

C#ListView钩子预大小更改事件

C#ListView钩子预大小更改事件,c#,winforms,events,hook,C#,Winforms,Events,Hook,我有一个平铺模式的列表视图。我已经创建了一个自定义方法,在触发SizeChanged事件时触发。是否仍有重写此方法的方法,以便在激发SizeChanged事件之前激发该方法 我试着寻找一个规模巨大的活动,但没有。如何执行此操作?为了在触发SizeChanged事件之前添加一些逻辑,您需要对现有的ListView控件进行子类化。在项目中创建一个新类,并将此代码粘贴到其中: public class CustomListView : ListView { protected overrid

我有一个平铺模式的列表视图。我已经创建了一个自定义方法,在触发SizeChanged事件时触发。是否仍有重写此方法的方法,以便在激发SizeChanged事件之前激发该方法


我试着寻找一个规模巨大的活动,但没有。如何执行此操作?

为了在触发
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


或者,如果希望将自定义逻辑与控件本身解耦,可以让自定义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);
    }

}

是什么导致了这种变化?客户端窗口大小;代码等?此处只有表单的ResizeBegin事件是候选项。仅当列表视图固定或锚定时相关。其他任何操作都需要时间机器。挑剔:
Control
源自
System.ComponentModel.Component
,所有控件(和表单)事件都由
Component.events
System.ComponentModel.EventHandlerList
)管理。建议使用此机制,而不是向控件实例添加事件指针@泰吉弗:有意思,我想我在任何地方都没见过。出于好奇,由于您链接到的文档没有这样说,是否有特别的地方建议使用这种模式,也许有一个例子?如果您要求一个比Tergiver更好的推荐使用这种模式的参考,我没有。我鼓励你运用逻辑。一个有20个事件的类有20个指针,即使这些事件中没有订户。使用Component.Events可以消除指针,从而减少类的占用空间。我给出的链接在社区内容部分有一个例子。事件已公开(受保护),因此您不必声明它。我不喜欢在示例中使用字符串键,而更喜欢使用
静态只读对象KeyIdentifier=new object()
。我添加了一个示例作为答案,以显示您的代码被修改为使用Component.Events。@Tergiver:我明白了。我认为您可能在谈论本文中涉及的相同内容:。但我的理解(以及您最后的评论)是,它使您能够更好地控制事件的添加/删除访问器,这在公开大量事件时非常有用,但在≈95%的病例。