如果您想让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;