系统滚动条实现的NUD控件Unusable版

简介:

昨天研究了一下系统滚动条,准备使用它来实现一个NumericUpDown控件,因为它可以带来最正宗的微调按钮外观,并说了一下可以使用viewport里的onScroll事件来获取系统滚动条的上下点击动作。

    同时昨天还说了onScroll事件的一个问题是,在点击了滚动条的上下按钮后,onScroll事件会被连续的触发n次(n取[1,4])。我们发现这些连续事件都在一个很小的timespan里触发的,也就在12ms以内。于是我们在onScroll事件中使用setTimeout来启动一次有意义的数值变化,代码如下,分支false用来判断点击的方向。

if ( NumericUpDown.ScrollBegin == 0 )
{  
    NumericUpDown.ScrollBegin =  new Date().getTime();
    NumericUpDown.ChangeNumeric.Element = elmt;
    window.setTimeout(NumericUpDown.ChangeNumeric, 12);
}
else
{
     var time =  new Date().getTime();
     if ( NumericUpDown.ScrollDirection == 0 )
    {
          var scrollOffset = NumericUpDown.ScrollTopValue - elmt.scrollTop;
         NumericUpDown.ScrollDirection = scrollOffset > 0 ? 1 : -1; 
         NumericUpDown.ScrollTopValue = elmt.scrollTop; 
    }
}

    控件使用一个DIV,一个SPAN和一个INPUT type='hidden'来实现,DIV的overflow-y设为scroll,SPAN用来显示当前的数值,INPUT type='hidden'用来存放控件当前的数值。

     < div  tabindex ="0"  Step ="1"  Precision ="0"  onscroll ="NumericUpDown.DoScroll(this)"
         style
="cursor: default; border: solid 1px red; overflow-y: scroll; width: 50;
         height: expression(this.all.tags('SPAN')[0].offsetHeight);"
>
          < span  style ="display: block; white-space: nowrap; text-indent: 2;" >1 span><input
             
type="hidden" id="Hidden1" value="1" />div>

    初始化控件的时候,再动态添加两个SPAN分别到默认SPAN的两端,这是因为滚动条如果处在任何一个顶端(top或bottom)是不会触发onScroll事件的,也就是说要把默认那个SPAN放到DIV的正中间,前后在分别有一个SPAN。
 elmt.Current = elmt.Input.value;
  var current = parseInt(elmt.Current);
  var step = parseInt(elmt.Step);
  var previousSpan = NumericUpDown.CreateSpan();
 previousSpan.innerText = current - step;
  var nextSpan = NumericUpDown.CreateSpan();
 nextSpan.innerText = current + step;
  var currentSpan = elmt.all.tags('SPAN')[0];
 currentSpan.insertAdjacentElement('beforeBegin', previousSpan);
 currentSpan.insertAdjacentElement('afterEnd', nextSpan);
 NumericUpDown.ScrollTo.CurrentSpan = currentSpan;
 window.setTimeout(NumericUpDown.ScrollTo, 1);        
 elmt.IsInitialized =  true;
    
     控件NumericUpDown代码为: 
< script  language="javascript"> script>
    
    由于在这个页面上注入代码太麻烦了,就把demo放到 这里了。虽然这个NumericUpDown自然的就可以支持键盘Up & Down和PageUp & PageDown,可是最后一个问题却真的没有招了,以至于我最终只能放弃这个尝试了。看看demo,框里的数字有些抖动是吧?这是系统的默认行为,而且点击的越快,抖的也越快,真的没有办法了

    所以完成了也只能叫做Unusable版...


  本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
8月前
|
C# Windows
49.c#:StatusStrip 控件
49.c#:StatusStrip 控件
180 1
49.c#:StatusStrip 控件
|
8月前
|
C# 开发者 Windows
48.c#:toolstrip控件
48.c#:toolstrip控件
136 1
|
8月前
|
C# Windows
47.c#:menustrip控件
47.c#:menustrip控件
90 1
|
8月前
|
C#
38.c#:RithTextBox控件
38.c#:RithTextBox控件
80 1
NSTextField控件应用详解
NSTextField控件应用详解
479 0
NSTextField控件应用详解
|
C#
WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)
原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAutomationPeer lvap = new TreeViewAuto...
2413 0
|
前端开发 容器
控件篇
原文:控件篇   日常使用最多的控件有6类: 1. 布局控件:可以容纳多个控件或嵌套其他布局控件,例如Grid、StackPanel、DockPanel等,有共同的父类Panel 2.
729 0

热门文章

最新文章

下一篇
开通oss服务