gpt4 book ai didi

c# - Silverlight - 确定 UIElement 是否在屏幕上可见

转载 作者:行者123 更新时间:2023-11-30 16:13:25 26 4
gpt4 key购买 nike

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

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

这是它的样子:

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

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

最佳答案

据我所知,没有可靠的方法来测试元素是否可见。

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

这里有两种解决方法,可能符合也可能不符合您的要求:

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

  2. 或者,在 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
}

关于c# - Silverlight - 确定 UIElement 是否在屏幕上可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com