如何取消 TextBox 的焦点而不将焦点放在其他地方

4
我认为在我的应用程序启动时没有任何东西被聚焦。至少看起来是这样的。我想添加事件处理程序到 "GotFocus" 事件,以便控件显示弹出窗口并失去焦点,这样弹出窗口就可以在不手动删除焦点并将其设置回来的情况下再次显示。此外,我的文本框不需要处于聚焦的视觉状态,因为它对用户没有用(虽然可以通过模板更改,但是对这个问题的回答解决了两个问题)。
如果我的初始观察结果有误,并且silverlight中总是有焦点,我想知道要关注什么,以便它看起来没有焦点(就像应用程序启动时的情况)。如果有一种方法完全去除可见聚焦状态-这种方法会更好。
编辑:实际上,在我的情况下,一个没有视觉差异的控件在应用程序启动时已经聚焦了。我没有找到比将其聚焦在我的Unfocus()相关方法中更聪明的做法...稍微深入一点,我建议按 [enter] 键,看看会发生什么,在我的情况下,它还改变了聚焦控件的状态,看起来好像没有聚焦。
注意:在Silverlight中没有“未聚焦状态”。
1个回答

5

Silverlight中的焦点管理很难处理。

有许多控件可以获得焦点,但在它们获得焦点时没有任何视觉差异,这与WinForms非常不同。

我发现在一些Silverlight应用程序中使用以下类来尝试解决焦点问题很有用:

public static class WatchWhatsGotFocus
{
    private static DispatcherTimer t;

    public static void StartWatching()
    {
        t = new DispatcherTimer();
        t.Interval = TimeSpan.FromMilliseconds(500);
        t.Tick += t_Tick;
        t.Start();
    }

    public static void StopWatching()
    {
        if (t != null)
        {
            t.Stop();
            t = null;
        }
    }

    static void t_Tick(object sender, EventArgs e)
    {
        var element = FocusManager.GetFocusedElement();            
        if (element != null)
            Debug.WriteLine("Focused element: {0}", element.ToString());
        else
        {
            Debug.WriteLine("No focused element");
        }
    }
}

所以,在你的应用程序中的某个地方,只需调用WatchWhatsGotFocus.StartWatching(),你就可以看到发生了什么。


我认为这是一个不错的课程。 - Valentin Kuzub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接