[英]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順序,指定自定義渲染變換,按反效果重疊等)
以下是兩種可能符合您要求的解決方法:
如果您嘗試執行類似於工具提示的操作,請為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
}
您可以使用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.