我在MSDN页面上找到了多个VisibleChanged事件的引用,该事件表明它是针对Windows Phone 8平台的。但是,当我尝试通过Intellisense访问它时,无论是我正在构建的顶级用户控件(使用“this”关键字),还是LayoutRoot网格,我都看不到它。我通过对象浏览器进行了全面搜索,但我也没有看到任何内容。它在哪里?当用户控件可见时,我需要执行某些任务 ,并且我需要它们在不可用时停止。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.visiblechanged(v=vs.110).aspx
答案 0 :(得分:2)
您的参考是指适用于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());
}
}
}
或者,当然,如果您完全控制了控件的源代码,请不要为继承而烦恼。
答案 1 :(得分:1)
如果您希望将VisibilityChanged
事件用于任意控件,则会有一个稍微复杂的解决方法。首先,围绕该控件创建一个包装类,该类具有自己的Visibility属性,并绑定到目标的Visibility属性。如果有,您可以收听通知。
首先,扩展方法:
public static FrameworkElementExtender Extender(this FrameworkElement element)
{
return new FrameworkElementExtender(element);
}
Helper event args class:
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;