ScrollViewer中元素焦点丢失问题

原文http://www.cnblogs.com/xiaoxueliang/archive/2010/08/08/1795128.html

   Silverlight中的焦点常用设置控件的外观和键盘操作。在做模板控件时,我们常常需要捕获元素焦点状态。根据元素是否具有焦点来呈现不同的视觉状态。最近的项目中碰到一个奇怪现象:我将一个模板控件在ScrollViewer中,在MouseLeftButtonDown调用Focus时,Focus()返回true,控件会得到焦点,然而瞬间又失去焦点,导致控件无法正常获取焦点。如果将该控件放在Canvas、Grid中都能正确的获取焦点,并显示焦点视觉效果。 下面是模板控件中的示意代码:

      

代码

 public TemplatedControl1()
        {
            this.DefaultStyleKey = typeof(TemplatedControl1);
        }

        public bool isFocused = false;
        public bool IsFocused
        {
            get
            {
                return isFocused;

            }
            set
            {
                if (isFocused != value)
                {
                    isFocused = value;
                    UpdateStates(true);
                }
            }
        }

        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);
            Focus();
        }

        protected override void OnGotFocus(RoutedEventArgs e)
        {
            base.OnGotFocus(e);
            isFocused = true;
            UpdateStates(true);
        }

        protected override void OnLostFocus(RoutedEventArgs e)
        {
            base.OnLostFocus(e);
            isFocused = false;
            UpdateStates(true);
        }

        private void UpdateStates(bool useTransitions)
        {
            if (isFocused)
            {
                VisualStateManager.GoToState(this, "Focused", useTransitions);
            }
            else
            {
                VisualStateManager.GoToState(this, "Unfocused", useTransitions);
            }
        }

      这个问题让我觉得Silverlight的焦点不太稳定。进过观察发现,ScrollViewer通过获取MouseLeftButtonDown的路由事件,然后做了一些我们不知道的操作,导致控件失去了焦点。如何解决这个问题,这里提供两种思路:

     第一种:在模板控件的重载方法OnMouseLeftButtonDown中加上e.Handled = true。 这样就阻止了ScrollViewer获取点击事件。这种方法的弊端就是也停止了OnMouseLeftButtonDown的路由。

     第二种:在MouseLeftButtonUp中调用Focus()获取焦点,此方法调用在ScrollViewer发生作用之后,所以能正确的设置焦点状态。缺点是:如果模板控件已经有焦点时,点击控件,就会导致控件先失去焦点,然后在MouseLeftButtonUp事件中再得到焦点,形成无谓的视觉效果跳动。

 

      这样焦点的问题是可以解决,不过ScrollViewer在OnMouseLeftButtonDown事件中为什么会夺取去子元素的焦点,还是不得而知。

 

时间: 2024-10-30 17:09:44

ScrollViewer中元素焦点丢失问题的相关文章

c#焦点丢失

问题描述 当从A画面迁移B画面时,B画面中groupbox中控件出现焦点丢失的现象.我设置了B画面中groupbox的焦点,也设置了groupbox中控件的焦点.可是当点击A画面datagridview中的某一条记录迁移到B画面时,光标没有停在B画面的第一个控件上.(更奇怪的是这种现象只出现在datagridview中一部分的记录上)拜托哪位高手给解答一下!!在线等!!

Win7中快捷方式图标丢失问题的解决方法

有时在我们安装程序后或使用一些优化清理软件后,win7会突然出现软件快捷图标丢失问题,但是,如果你双击此丢失快捷图标仍然可以启动程序,虽然不影响我们的正常操作,但是却大跌我们的眼球,让人感觉很是不爽.- 有人也许会尝试在快捷方式属性里更改图标,但结果也是无济于事,但个别图标在我们重装了程序后能够解决修正过来,但是有些重装后也没用.出现这个问题最多的软件是360安全卫士.QQ等等~~!好吧!下面是小编整理的几种解决方法,需要的同学就试试吧~!Windows7系统中快捷图标丢失问题解决办法: 解决方

解析Jquery取得iframe中元素的几种方法

iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作,需要的朋友可以参考下   DOM方法:父窗口操作IFRAME:window.frames["iframeSon"].document IFRAME操作父窗口: window.parent.documentjquery方法:在父窗口中操作 选中IFRAME中的所有输入框: $(window.frames["iframeSon"].document).find(&q

javascript 获取iframe里页面中元素值的方法

 本篇文章主要是对javascript获取iframe里页面中元素值的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 IE方法: document.frames['myFrame'].document.getElementById('test').value;   火狐方法: document.getElementById('myFrame').contentWindow.document.getElementById('test').value;   IE.火狐方法:   代码如

jQuery判断iframe中元素是否存在的方法

  jQuery判断iframe中元素是否存在的方法比较简单只要判断框架window.frames["iframepage"]指定值是不是存在就可以了,下面整理了一些例子大家可进入参考. 例子  代码如下   if($(window.frames["iframepage"].document).find('.l-grid-row-cell').length > 0){ alert(1); }else{ alert(2); } 以上代码,判断id为iframep

电脑中Office2016提示丢失api-ms-win-crt-stdio-l1-1-0.dll如何解决

  1.从网上搜索并下载api-ms-win-crt-stdio-l1-1-0.dll文件,并放在C盘的system32文件夹中; 2.新建一个文本文档,输入或者粘贴以下内容,并将其另存为bat文件; @echo 开始注册 copy api-ms-win-crt-stdio-l1-1-0.dll %windir%system32 regsvr32 %windir%system32api-ms-win-crt-stdio-l1-1-0.dll /s @echo api-ms-win-crt-std

关于链表中元素的删除

问题描述 关于链表中元素的删除 *data = element->next->data; old_element = element->next; element->next = element->next->next; 该怎么理解这三条语句? 解决方案 第一句和删除没有关系,只是获取了将要删除节点的data值,存入*data 第二句是获得将要删除的节点,最后应该使用free(old__element); 或者其他具体语言的函数来释放内存 第三句就是删除节点了,将ele

thread-怎么在循环中转换焦点并设置延时

问题描述 怎么在循环中转换焦点并设置延时 课程设计...纸牌游戏 但需要可视化显示 想利用按钮改变背景表示纸牌反面 但现在就直接全部显示反面结果 不知如何在循环的过程中增加延时的一个一个变换 package card;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class GridLayoutDemo extends JFrame { static int Flag = -1; // 定义一个全局变量

html-iphone中移动焦点的问题

问题描述 iphone中移动焦点的问题 我开发的应用里面用到移动手机的浏览器,iphone的safari,除非我点击另一个form element 的时候,就不能在form field隐藏焦点. 代码结构主要如下: <!DOCTYPE html> <html> <head> <title>Test</title> </head> <body> <form> <input type="text&q