2014-04-27 45 views
0

我发现多个MSDN页面上的VisibleChanged事件引用声明它是针对Windows Phone 8平台的。但是,当我尝试通过Intellisense访问它时,我正在构建的顶级用户控件(使用“this”关键字)或LayoutRoot网格,我没有看到它。我通过对象浏览器进行了全面搜索,并且我也没有看到任何内容。它在哪里?当用户控件可见时,我需要执行某些任务,只有,并且当它不是时,我需要它们停止。Windows Phone 8用户控件的VisibleChanged事件在哪里?

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.visiblechanged(v=vs.110).aspx

回答

2

你的参考是指Windows窗体应用程式的Windows,而不是Windows手机。您在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()); 
     } 
    } 
} 

或者,当然,如果您完全控制了控件的源代码,请不要打扰继承。

+0

这不适用于现有控件。但是,有一种解决方法可以使其适用于任意控制:) –

1

如果您希望对任意控件有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; 
相关问题