信息
您所需的主题如下所示。但此主题未包含在此库中。

UIElement.GotFocus 事件

UIElement 收到焦点时发生。

命名空间:  System.Windows
程序集:  System.Windows(在 System.Windows.dll 中)

public event RoutedEventHandler GotFocus
<uiElement GotFocus="eventhandler"/>

GotFocus 事件是一种冒泡事件。 这意味着,如果为由对象树中的父-子关系所连接的一系列对象注册了多个 GotFocus 事件处理程序,则该事件将由该关系中的每个对象接收。 由直接接收发起事件的输入条件的对象引发事件,然后冒泡到每个后续父对象。 冒泡比喻表示事件在直接接收输入条件的对象上启动,然后沿对象树向上传递。 对于冒泡事件,可用于事件处理程序的 sender 标识处理该事件时所用的对象,而不必标识实际接收发起该事件的输入条件的对象。 若要获取发起该事件的对象,请使用事件的 RoutedEventArgs 事件数据的 OriginalSource 值。

处理 GotFocusLostFocus 事件时,在事件数据类中没有可用的 Handled 属性,事件将通过对象树继续向上路由并调用所有处理程序。 如果您想处理对象树中各个级别上的焦点,这有时可能对于您应用程序的焦点事件处理策略并不合适。 您可能考虑使用下列方法之一:

  • 使用布尔型标志来记录聚焦状态。 从特定的处理程序调用将您自己的"Handled"变量设置为 true,您的设计认为该调用已正确处理事件。 在后续处理程序中查看此"Handled"变量,判断其他处理程序是否也处理了事件,如果处理了,则不执行任何操作。 在对象树的根部,至少出于将"Handled"重新设置为 false 以重置下一个焦点事件的状态的目的来处理该焦点事件。

  • 特别强调查看或使用由事件数据中的 senderOriginalSource 传输到处理程序的对象值。 只有满足以下条件时才能选择进行处理:sender 等于 OriginalSource,或 sender 是特殊的命名对象(此时将同一焦点事件处理程序附加到多个对象或类似的逻辑运算)。

请注意,了解焦点在对象的组合树中的位置对于正确设置总体控件的可视状态可能很重要。 在尝试取消焦点事件的后续路由时,一般应相当谨慎。

如果对对象调用 Focus 而对象已具有焦点,将不引发 GotFocus

由于 Silverlight 焦点系统的设计,异步引发 GotFocus 是为了应对实际焦点变动。 若要获取同步焦点值,请使用 FocusManager

注意说明:

有时会为从 UI 角度看似乎是一个焦点事件的事件引发两次 GotFocus 如果焦点尚未在 Silverlight 内容区域内,但用户通过单击(或通过制表符)移到内容区域内的特定控件,则可能会发生这种情况。 在这种情况下,特定控件通常会引发 GotFocus(并将其自身报告为 OriginalSource)。 初次聚焦到整个内容区域也会引发 GotFocus,它进入对象树进行查找,直到发现可获得焦点的对象并将其报告为该事件的 OriginalSource 如果在特意依赖冒泡行为时处理 GotFocus,这可能会是一个问题。 请检查 OriginalSource;这通常可以帮助您在处理程序中识别此情况。

GotFocus 和 OnGotFocus

继承 GotFocus 的控件可以通过重写 OnGotFocus 方法来处理充当所有实例的处理程序的事件。 因为是直接处理事件,没有可用的 Handled 属性,因此不能这样实现 OnGotFocus 以使它通过 Handled 方法取消事件。 但是,OnGotFocus 对于设置可视状态或公共或内部状态属性很有用。 例如,ComboBox 实现 OnGotFocus 以便根据基于焦点的用户输入设置所选项。 有关更多信息,请参见 OnGotFocus

Silverlight

受以下版本支持:5、4、3

Silverlight for Windows Phone

受以下版本支持:Windows Phone OS 7.1、Windows Phone OS 7.0

有关 Silverlight 支持的操作系统和浏览器的列表,请参见 支持的操作系统和浏览器

社区附加资源

显示:
© 2014 Microsoft