簡體   English   中英

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

[英]Where is the VisibleChanged event for a Windows Phone 8 user control?

我在MSDN頁面上發現有多個對VisibleChanged事件的引用,指出該事件適用於Windows Phone 8平台。 但是,當我嘗試通過Intellisense訪問正在構建的頂級用戶控件(使用“ this”關鍵字)或LayoutRoot網格時,都看不到它。 我通過對象瀏覽器進行了全面搜索,但也沒有看到任何內容。 它在哪里? 在用戶控件可見時才需要執行某些任務,而在用戶控件不可見時才需要它們停止。

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

您的引用是指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());
        }
    }
}

或者,當然,如果您完全控制了控件的源代碼,請不要理會繼承。

如果要對任意控件使用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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM