我的应用程序中有一个表单,其中包含一个包含两个选项卡的选项卡控件在其中一个标签中,我有一个UIElement。当鼠标悬停在它上面时,会启动一个计时器,并在一秒钟之后执行一些功能。
问题是当鼠标悬停并立即切换标签时,我需要停止计时器。我无法在标签控件事件中执行此操作(标签控件无法识别计时器)。我希望能够知道屏幕上何时看不到此UIElement(切换选项卡时Visibility属性仍然可见)。
它的外观如下:
private void element_MouseEnter(object sender, MouseEventArgs e)
{
timer.Start()
}
private void dt_Tick(object sender, EventArgs e)
{
//Some functionality
}
答案 0 :(得分:3)
AFAIK,没有可靠的方法来测试元素是否可见。
在Silverlight中,有太多方法可以隐藏元素(屏幕外部,ScrollViewer模糊,另一个元素重叠,完全透明,着色器效果扭曲等)和未隐藏(指定Z -order,指定自定义渲染变换,通过反效果重叠等。)
以下是两种可能符合您要求的解决方法:
如果您尝试执行类似于工具提示的操作,请为UIElement的MouseLeave事件添加处理程序。在这种情况下,如果计时器处于活动状态,请将其停止。
或者,在dt_Tick处理程序中,您可以通过检查TabControl.SelectedIndex
属性来检查显示哪个选项卡,如果选择了错误的选项,则忽略此事件。
更新:这里是#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
}