如果您希望对任意控件有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;
这不适用于现有控件。但是,有一种解决方法可以使其适用于任意控制:) –