簡體   English   中英

Silverlight - 確定屏幕上是否顯示UIElement

[英]Silverlight - Determine if a UIElement is visible on screen

我的應用程序中有一個表單,其中包含兩個選項卡的選項卡控件。 在其中一個標簽中,我有一個UIElement。 當鼠標懸停在其上時,啟動計時器,並在一秒鍾后執行某些功能。

問題是當鼠標懸停並立即切換標簽時,我需要停止計時器。 我無法在標簽控件事件中執行此操作(標簽控件無法識別計時器)。 我希望能夠知道何時在屏幕上看不到此UIElement(切換選項卡時Visibility屬性仍然可見)。

這就是它的樣子:

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

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

AFAIK,沒有可靠的方法來測試元素是否可見。

在Silverlight中,有太多方法可以隱藏元素(在屏幕之外,ScrollViewer模糊,由另一個元素重疊,完全透明,由着色器效果扭曲等)和unhidden(指定Z順序,指定自定義渲染變換,按反效果重疊等)

以下是兩種可能符合您要求的解決方法:

  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
}

您可以使用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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM