Silverlight命中测试和输入事件
2010-08-10 15:13 撞破南墙 阅读(1863) 评论(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以禁用命中测试。
3 UIElement 的Background 属性设置为 NULL的。此时他的背景是透明的,如果想要这种 果之下还可以执行命中测试,,则将 Transparent值用于 SolidColorBrush)。
(ARGB 值为 #00FFFFFF )
4 .IsEnabled 属性
在可视化树子集内,您可能能够通过使用 VisualTreeHelper 中的 API(具体来说是 VisualTreeHelper.FindElementsInHostCoordinates),来查找
应用的转换可以更改坐标系。您通常可以通过调用 RenderTransform 解析这些差异。
Glyphs 是低级机制,用于呈现已由文本布局和写入系统引擎预设格式的文本,如 XPS 文档
http://www.cnblogs.com/skyd/archive/2010/05/17/1737106.html
3命中测试和输入事件
命中测试主要与以下核心输入事件相关:
MouseEnter、MouseLeave、MouseMove、
MouseLeftButtonDown、MouseLeftButtonUp、
MouseRightButtonDown、MouseRightButtonUp、
(当输入系统为 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的,多有笔记性质。看官多多包涵。如果你是那种喜欢看博客的。不喜欢看文档,
看看也无妨,开卷有益。
作者:撞破南墙
出处:http://www.cnblogs.com/facingwaller/
关于作者:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。