[英]Where is the VisibleChanged event for a Windows Phone 8 user control?
我在MSDN頁面上發現有多個對VisibleChanged事件的引用,指出該事件適用於Windows Phone 8平台。 但是,當我嘗試通過Intellisense訪問正在構建的頂級用戶控件(使用“ this”關鍵字)或LayoutRoot網格時,都看不到它。 我通過對象瀏覽器進行了全面搜索,但也沒有看到任何內容。 它在哪里? 我僅在用戶控件可見時才需要執行某些任務,而在用戶控件不可見時才需要它們停止。
http://msdn.microsoft.com/zh-CN/library/system.windows.forms.control.visiblechanged(v=vs.110).aspx
您的引用是指Windows的Windows窗體應用程序,而不是Windows Phone。 您在Windows Phone上詢問的屬性是Visibility
(不是Visible
),因此您應該在尋找VisibilityChanged
,但該屬性不存在。
但是,可以通過將想要事件的控件子類化,然后使用新控件來創建自己的控件。 例如:
public class MyControl : SomeOtherControl
{
public MyControl()
{
DefaultStyleKey = typeof(MyControl);
}
public static readonly DependencyProperty VisibilityChangedProperty = DependencyProperty.Register(
"VisibilityChanged",
typeof(string),
typeof(MyControl),
new PropertyMetadata("VisibilityChanged event handler"));
public event VisibilityChangedEventHandler VisibilityChanged;
public delegate void VisibilityChangedEventHandler(object sender, EventArgs e);
public new Visibility Visibility
{
get { return base.Visibility; }
set
{
if (base.Visibility == value) return;
base.Visibility = value;
VisibilityChanged(this, new EventArgs());
}
}
}
或者,當然,如果您完全控制了控件的源代碼,請不要理會繼承。
如果要對任意控件使用VisibilityChanged
事件,則有一個稍微復雜的解決方法。 首先,圍繞該控件創建一個包裝類,該包裝類將具有自己的Visibility屬性,並綁定到目標的Visibility屬性。 收到通知后,您可以收聽通知。
一,擴展方法:
public static FrameworkElementExtender Extender(this FrameworkElement element)
{
return new FrameworkElementExtender(element);
}
輔助事件args類:
public class VisibilityChangedEventArgs : EventArgs
{
public Visibility Visibility { get; private set; }
public VisibilityChangedEventArgs(Visibility visibility)
{
this.Visibility = visibility;
}
}
現在是實際的包裝器:
public class FrameworkElementExtender : FrameworkElement
{
public new static readonly DependencyProperty VisibilityProperty = DependencyProperty.Register(
"Visibility", typeof(Visibility), typeof(FrameworkElementExtender), new PropertyMetadata(default(Visibility), PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
((FrameworkElementExtender)o).OnVisibilityChanged((System.Windows.Visibility)e.NewValue);
}
public new Visibility Visibility
{
get { return (Visibility)GetValue(VisibilityProperty); }
set { SetValue(VisibilityProperty, value); }
}
private readonly FrameworkElement _element;
public FrameworkElementExtender(FrameworkElement element)
{
_element = element;
var binding = new Binding("Visibility")
{
Source = element,
};
SetBinding(VisibilityProperty, binding);
}
public event EventHandler<VisibilityChangedEventArgs> VisibilityChanged;
protected virtual void OnVisibilityChanged(Visibility visible)
{
var handler = VisibilityChanged;
if (handler != null)
handler(this, new VisibilityChangedEventArgs(visible));
}
}
如您所見,我們偵聽目標的依賴項屬性中的更改,並在檢測到更改時觸發自己的事件。 使用它非常簡單:
control.Extender().VisibilityChanged += OnVisibilityChanged;
control.Visibility = Visibility.Collapsed;
control.Visibility = Visibility.Visible;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.