Silverlight - 确定屏幕上是否显示UIElement

时间:2014-02-09 10:41:35

标签: c# silverlight

我的应用程序中有一个表单,其中包含一个包含两个选项卡的选项卡控件在其中一个标签中,我有一个UIElement。当鼠标悬停在它上面时,会启动一个计时器,并在一秒钟之后执行一些功能。

问题是当鼠标悬停并立即切换标签时,我需要停止计时器。我无法在标签控件事件中执行此操作(标签控件无法识别计时器)。我希望能够知道屏幕上何时看不到此UIElement(切换选项卡时Visibility属性仍然可见)。

它的外观如下:

private void element_MouseEnter(object sender, MouseEventArgs e) 
    {            
        timer.Start() 
    }

private void dt_Tick(object sender, EventArgs e) 
    {       
       //Some functionality
    }

2 个答案:

答案 0 :(得分:3)

AFAIK,没有可靠的方法来测试元素是否可见。

在Silverlight中,有太多方法可以隐藏元素(屏幕外部,ScrollViewer模糊,另一个元素重叠,完全透明,着色器效果扭曲等)和未隐藏(指定Z -order,指定自定义渲染变换,通过反效果重叠等。)

以下是两种可能符合您要求的解决方法:

  1. 如果您尝试执行类似于工具提示的操作,请为UIElement的MouseLeave事件添加处理程序。在这种情况下,如果计时器处于活动状态,请将其停止。

  2. 或者,在dt_Tick处理程序中,您可以通过检查TabControl.SelectedIndex属性来检查显示哪个选项卡,如果选择了错误的选项,则忽略此事件。

  3. 更新:这里是#2的一些示例代码(未经测试):

    public static IEnumerable<FrameworkElement> visualParents( this FrameworkElement e )
    {
        DependencyObject obj = e;
        while( true )
        {
            obj = VisualTreeHelper.GetParent( obj );
            if( null == obj ) yield break;
            FrameworkElement fwe = obj as FrameworkElement;
            if( null != fwe ) yield return fwe;
        }
    }
    
    public static bool isOnVisibleTab( FrameworkElement elt )
    {
        TabItem item = elt.visualParents().OfType<TabItem>().FirstOrDefault();
        if( null == item )
            return true;         // Did not find the tab, return true
        return item.IsSelected;  // Found the tab, return true if the tab is selected
    }
    

答案 1 :(得分:0)

您可以使用Unloaded事件解决此问题。只要发生VisualTree的更改导致Element成为当前未呈现的VisualTree分支的一部分,就会引发它。

private void element_MouseEnter(object sender, MouseEventArgs e) 
{            
    timer.Start();
    element.Unloaded += OnElementUnloaded;
}

private void OnElementUnloaded(object sender, EventArgs e)
{
    element.Unloaded -= OnElementUnloaded;
    timer.Stop();
}

private void dt_Tick(object sender, EventArgs e) 
{
    element.Unloaded -= OnElementUnloaded;
   //Some functionality
}