Silverlight 3.0 RTW新特性汇总(二)

作者:互联网   出处:控件中国网   2014-11-05 19:18:29   阅读:1

如果控件已经创建了自动化接口,我们首先来研究一下它,如果接口不存在,我们需要先创建,AutomationPeer作为一个成员属性保存,使用MouseWheel事件时会使用到它,下面是滚动目标对象的示例代码:

      1: /// < summary>
  2: /// Handles the MouseWheel event of the AssociatedObject control.

  3: /// < /summary>

  4: /// < param name="sender">The source of the event.< /param>

  5: /// < param name="e">The < see cref="System.Windows.Input.MouseWheelEventArgs"/> instance containing the event data.< /param>

  6: void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e)

  7: {

  8: this.AssociatedObject.Focus();

  9:

  10: int direction = Math.Sign(e.Delta);

  11:

  12: ScrollAmount scrollAmount =

  13: (direction < 0) ? ScrollAmount.SmallIncrement : ScrollAmount.SmallDecrement;

  14:

  15: if (this.Peer != null)

  16: {

  17: IScrollProvider scrollProvider =

  18: this.Peer.GetPattern(PatternInterface.Scroll) as IScrollProvider;

  19:

  20: bool shiftKey = (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift;

  21:

  22: if (scrollProvider != null && scrollProvider.VerticallyScrollable && !shiftKey)

  23: scrollProvider.Scroll(ScrollAmount.NoAmount, scrollAmount);

  24: else if (scrollProvider != null && scrollProvider.VerticallyScrollable && shiftKey)

  25: scrollProvider.Scroll(scrollAmount, ScrollAmount.NoAmount);

  26: }

  27: }
 
  我们获取了Delta后需要提取出滚动的方向,否则我们就不能指定目标滚动的像素数量,但ScrollAmount可能是SmallIncrement或SmallDecrement(或LargeIncrement,LargeDecrement),因此使用方向我们可以确定是递增还是递减。

  由于控件既可以横向滚动也可以纵向滚动,我决定检查换档键是否被按下,如果按下就实现横向滚动,最后在IScrollProvider中使用Scroll方法,不需要检查边界。

  使用行为

  使用Blend应用行为的操作非常简单,Blend资产库会扫描项目中所有的类,并显示出来,因此只需要拖动行为到滚动组件上就可以应用行为了,我们需要学习的是通过编码应用行为,下面是一个例子:

      1: < UserControl
  2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  4: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

  5: xmlns:local="clr-namespace:Elite.Silverlight3.MouseWheelSample.Silverlight.Classes"

  6: xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"

  7: x:Class="Elite.Silverlight3.MouseWheelSample.Silverlight.MainPage"

  8: Width="Auto" Height="Auto">

  9:

  10: ... omissis ...

  11:

  12: < data:DataGrid Grid.Column="1" Grid.Row="0" ItemsSource="{Binding DataItems}" Margin="20">

  13: < i:Interaction.Behaviors>

  14: < local:MouseWheelScrollBehavior />

  15: < /i:Interaction.Behaviors>

  16: < /data:DataGrid>
 
  在UserControl中,我们声明了要使用的命名空间,在这个例子中,"i"代表交互,"local"指的是融入了新行为的本地类,在第二部分中我们将行为连接到DataGrid了,将行为连接到ScrollViewer或ListBox的代码非常类似,运行这个项目,我们在DataGrid上就可以使用鼠标滚轮了。

  小结

  本文介绍的技术非常有实用价值,几乎适用于所有的可滚动控件,但ComboBox是个例外,因为它没有直接实现IScrollProvider接口,缺点是只能工作在Windows上,这是一个较大的问题,但目前并没有解决办法,因为它是目前通过编程实现滚动的唯一方法,此外我还注意到MouseWheel事件只能在Windows下IE和Firefox (非Windows模式)中工作,这是由Safari和Firefox 的架构决定的,唯一变通的方法是使用DOM事件。

Copyright© 2006-2015 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 渝ICP备12000264号 法律顾问:元炳律师事务所
客服软件
live chat