代码改变世界

Silverlight命中测试和输入事件

2010-08-10 15:13  撞破南墙  阅读(1861)  评论(4编辑  收藏  举报

1焦点概述 

 焦点是一个输入系统概念,与 Silverlight 中的控件有关。

1 当前具有焦点的控件可以接收键盘输入事件 KeyUp 和KeyDown,因此能够使用键盘输入。焦点还与自动化系统有关。(#w?)

在基于 Silverlight 的应用程序内,用户可以通过使用 Tab 键序列遍历 UI 中的控件。遍历 Tab 键序列为控件设置了焦点。可以通过设置在 Control 类上定义的一些属性来影响 Tab 键序列和导航行为。 

 

1.1控件和焦点:

只有属于 Control 类的元素才能接收焦点。

但有些是不可以的

 

1)  面板,如 StackPanel 或 Grid

2)  TextBlock

3)   内联文本对象

 

为了使控件能够接收焦点,以下属性必须为 true

1) IsEnabled 为 true

2) Visibility 为 Visible

3) 焦点不能完全超出 Silverlight 内容区域。

4) IsTabStop 必须为 true

(获取或设置一个值,该值指示是否将某个控件包含在 Tab 导航中。

因为所有能够获取焦点的也都能通过 TAB 遍历 可能是方便

键盘流吧 )

 

只有具有焦点的元素才能引发 KeyUp 和 KeyDown 事件。 

Eg 演练:使用 ControlTemplate 自定义按钮的外观。 

 

 

1.2 GotFocus 和 LostFocus 

得到和丢失焦点

@1 冒泡的路由事件

@2 可以重写 OnGotFocus  方法

@3 默认具有一个异步实现,也可以通过

 FocusManager.GetFocusedElement  同步检查

(查询 Silverlight 焦点系统以确定具有焦点的对象 )

 

1.3 Focus 方法
为控件调用将自己设为获得焦点

  如果是失败返回false

 

1.4 Tab 键序列

控件具有 TabIndex 属性和 TabNavigation 属性。这些属性使您可以更改默认 Tab 键序列和行为。 TabIndex 声明该序列,TabNavigation 声明控件内任何 Tab 序列的行为。 

 

1.5 自动化
AutomationProperties 

Silverlight 辅助功能概述

从而满足了辅助技术产品和自动化测试框架的需求。

此外,控件和应用程序开发人员通过应用 UI 自动化,

能够使其产品具有可访问性。 

类似一个外挂自动填值测试的功能?暂时对我似乎没什么用。

 找到这个博客文章讲自动化的

http://www.cnblogs.com/lixiong/archive/2010/05/20/1740335.html 

 

1.5.1在 UI 中设置自动化属性的情形

 将以代码为中心的名称替换为有用的 UI 名称

 报告所需的格式元素

 帮助文本

 快捷键和访问键 等等。。。
  我测试了

    <TextBox Name="tb_PhoneNumber" AutomationProperties.IsRequiredForForm="true" 

                 Margin="12,205,282,53" AutomationProperties.HelpText="帮助文字"

                 AutomationProperties.AccessKey="A"                

                 />

发现完全不起作用 不知道是什么原因

 

 

2命中测试和输入事件 

2.1命中测试和宿主

对于在浏览器中承载的应用程序,您还可以通过 HTML DOM 处理输入。 

可能用于Silverlight中的html  

貌似现在不怎么用得着

 

2.2命中测试和 API

 1将 Visibility 状态设置为 Visibility.Collapsed 将禁用命中测试。 

2 即使 UIElement 不透明,也可以显式将 IsHitTestVisible 属性    设置为 false以禁用命中测试。 

UIElement 的Background  属性设置为 NULL的。此时他的背景是透明的,如果想要这种 果之下还可以执行命中测试,,则将 Transparent值用于 SolidColorBrush)。 

(ARGB 值为 #00FFFFFF )

.IsEnabled 属性

 

在可视化树子集内,您可能能够通过使用 VisualTreeHelper 中的 API(具体来说是 VisualTreeHelper.FindElementsInHostCoordinates),来查找

 

应用的转换可以更改坐标系。您通常可以通过调用 RenderTransform 解析这些差异。 

InkPresenter 

Glyphs 是低级机制,用于呈现已由文本布局和写入系统引擎预设格式的文本,如 XPS 文档 

http://www.cnblogs.com/skyd/archive/2010/05/17/1737106.html 

 

 

3命中测试和输入事件
命中测试主要与以下核心输入事件相关:

MouseEnterMouseLeaveMouseMove

MouseLeftButtonDownMouseLeftButtonUp

MouseRightButtonDownMouseRightButtonUp

MouseWheelFrameReported。 

(当输入系统为 Silverlight 提升 Windows 7 多点触控消息时发生 )

在SL4 

命中测试还与诸如 DragEnter 的拖放事件相关。有关更多信息,请参见 DragEnter 或相关的 UIElement 事件 

 

下面是我的测试的图,把XAP弄到博客里老提示是flash。。不懂怎么弄

半路还发生了件小事。

我想知道 到底是怎么找元素的。

 

VisualTreeHelper.FindElementsInHostCoordinates

一路尾随代码进去

 

#1
[SecuritySafeCritical]
internal static IEnumerable<UIElement> UIElement_HitTestPoint(UIElement element, Point ptHit)
{
int num;
IntPtr ptr;
CheckThread();
PointF tf
= new PointF();
tf.x
= (float) ptHit.X;
tf.y
= (float) ptHit.Y;
CheckHResult(UIElement_HitTestPointNative(element.NativeObject, tf,
out num, out ptr));

GC.KeepAlive(element);
return UIElement_MakeList(ptr, num);
}
#
2
[DllImport(
"agcore", EntryPoint="UIElement_HitTestPoint")]
private static extern uint UIElement_HitTestPointNative(IntPtr nativePtr, PointF ptHit, out int count, out IntPtr ppvElements);


#
3
[SecurityCritical]
private static unsafe IEnumerable<UIElement> UIElement_MakeList(IntPtr pResult, int cResult)
{
List
<UIElement> list = new List<UIElement>();
IntPtr
* ptrPtr = (IntPtr*) pResult.ToPointer();
int num = 0;
while (num < cResult)
{
object managedPeer = null;
IntPtr nativeObject
= ptrPtr[0];
ManagedPeerTable.TryGetManagedPeer(nativeObject,
out managedPeer);
list.Add(managedPeer
as UIElement);
num
++;
ptrPtr
++;
}
CheckHResult(UIElement_DeleteHitTestResultsNative(pResult, cResult));
return list;
}

 

#1 是一段真正起作用的代码。。进去几层才到那里。

 

红色高亮那一段 是 #2 居然给我导了个包来解决。。我汗。

看到那里我到想放弃了。果然我找到那个dll 应该是C++不能用 REFLECTOR .NET 的打开。

算了。在看看#3直接在那里开始取值了。

 

基本都是在copyMSDN的,多有笔记性质。看官多多包涵。如果你是那种喜欢看博客的。不喜欢看文档,

看看也无妨,开卷有益。