【问题标题】:Where is the VisibleChanged event for a Windows Phone 8 user control?Windows Phone 8 用户控件的 VisibleChanged 事件在哪里?
【发布时间】: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

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多