65.9K
CodeProject 正在变化。 阅读更多。
Home

可点击的分隔符

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (5投票s)

2002年11月6日

3分钟阅读

viewsIcon

76787

downloadIcon

2529

一个基于标准分割器的 C# 自定义控件,显示嵌入资源。

Sample Image - clickable_splitter.jpg

引言

本文展示了一个基于标准分割器的自定义控件。 该扩展添加了点击行为以及基于位置和方向的光标。 点击行为实现了标准的最小化/最大化/恢复行为。 我拖动标准分割器时手腕受伤了......所以就有了这个。 本文没有告诉你如何编写自定义控件,有很多其他的文章专门介绍这个,本文只展示了这个过程的结果(看看源码,卢克!)。

背景

减少实现目标所需的用户交互总是好的。 标准分割条需要拖动才能将其位置设置为其极端位置之一。 拖动后,之前的位置会丢失。 可以通过点击来达到极端位置,代替拖动到极端位置,并且在此过程中可以保留上一个位置以便以后点击恢复。 这是一件有趣的事情,并且是一种在使用嵌入资源时四处摸索的好方法,它导致了基于位置和方向的光标,这些光标指示了简单的点击可以带来的效果。

使用代码和控件

ClickableSplitter 可以像任何其他自定义控件一样添加到工具箱中。 它有一个名为 UseCursors 的新自定义属性,位于 Behavior 类别中。 它的默认值为 false,因此,要看到新的光标生效,您必须将此属性设置为 true。 显示的光标和点击的结果(直接相关,即光标显示点击将产生的效果)遵循逆时针模式。

接下来,将一些代码定位到一些关键片段

构造函数使用 Assembly 类的 GetManifestResourceStream 成员来加载嵌入的光标。 可以通过使用静态数据和属性来加载光标来改进此过程,但是,正如在大量注释的代码中指出的那样,这留给读者作为练习,尽管我可能会在以后时间允许时发布一个更新来展示这一点。
public ClickableSplitter()
{
        Assembly assembly = GetType().Assembly;
        AssemblyName assemblyName = assembly.GetName();

        for(cursorStyles cursorStyle = cursorStyles.down; 
            cursorStyle <= cursorStyles.upRestore; cursorStyle++)
        {
                cursors[(int)cursorStyle] = new Cursor(
                        assembly.GetManifestResourceStream(assemblyName.Name + 
                        ".Cursors." + cursorNames[(int)cursorStyle] + ".cur"));
        }
}

自定义 UseCursors 属性安装和卸载鼠标移动处理程序,以展示一种执行此操作的方法。

[
    Bindable(true),
    Category("Behavior"),
    DefaultValue(false),
    Description("Determines whether to use orientation and position based cursors.")
]
public bool UseCursors
{
    get {return useCursors;}
    set
    {
        if(!value)
        {
            if(useCursors)
                MouseMove -= new MouseEventHandler(OnMouseMove);
        }
        else
        {
            if(!useCursors)
                MouseMove += new MouseEventHandler(OnMouseMove);
        }
        useCursors = value;
    }
}

...最后,使用 OnSplitterMoved 事件引发器在各处移动分割器...

private void OnHorizontalSplitterMoved(int newSize, int extremeSize)
{
   if(SplitPosition != extremeSize)
      lastPosition = SplitPosition;
   OnSplitterMoved(new SplitterEventArgs(0, newSize, 0, newSize));
}

关注点

世界花费了大量时间才得到看起来像 UNCOL 的东西,而现在正是时候! 我从来没有走 DCOM、CORBA 或类似的方式,因为在我看来,它需要在开发人员和最终用户端进行太多的管道连接。 有一天,几年前,在出售我曾经工作的公司之后,我新任 CORBA 上瘾的 CEO 对我提出的“为什么要使用 CORBA?”问题的回答是“它不是来自......”你知道是谁。 使用最能帮助您完成工作的工具,无论它来自 X 公司还是 Y 公司都不重要。 我越来越喜欢 .NET 的东西了,每次我摆弄它! 希望你也喜欢!

© . All rights reserved.