Windows Phone 8用户控件的VisibleChanged事件在哪里?

时间:2014-04-27 00:20:51

标签: c# events windows-phone-8 visibility

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

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

2 个答案:

答案 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;