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

Posted

技术标签:

【中文标题】Windows Phone 8 用户控件的 VisibleChanged 事件在哪里?【英文标题】:Where is the VisibleChanged event for a Windows Phone 8 user control? 【发布时间】:2014-06-12 15:17:34 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

您的参考是指适用于 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());
        
    

或者,当然,如果您对控件的源代码拥有完全的控制权,则不必为继承而烦恼。

【讨论】:

这不适用于现有控件。但是,有一种解决方法可以使其适用于任意控件:)【参考方案2】:

如果您想让VisibilityChanged 事件用于任意控件,有一个稍微复杂的解决方法。首先,围绕该控件创建一个包装类,该类将具有自己的 Visibility 属性并绑定到目标的 Visibility 属性。当你拥有它时,你可以收听通知。

一、扩展方法:

public static FrameworkElementExtender Extender(this FrameworkElement element)

    return new FrameworkElementExtender(element);

Helper 事件参数类:

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;

【讨论】:

以上是关于Windows Phone 8 用户控件的 VisibleChanged 事件在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

具有多个页面的 Windows Phone 8.1 自定义控件

xml 适用于Windows 8.1和Windows Phone 8.1应用程序的扩展器控件演示。

Windows Phone 8.1向导控件

xml 适用于Windows 8.1和Windows Phone 8.1应用程序的扩展器控件的模板。

csharp 在Windows 8.1和Windows Phone 8.1应用程序中运行的Expander控件的代码隐藏。

Windows Phone 8中缺少ButtonBase.Click