Автоскрытие меню (WPF) - PullRequest
       2

Автоскрытие меню (WPF)

0 голосов
/ 10 декабря 2010

Существует ли простое свойство, которое позволяет классу меню автоматически скрываться через заданное количество секунд? Я искал MSDN, но не могу найти подходящую недвижимость.

1 Ответ

2 голосов
/ 10 декабря 2010

По умолчанию меню не поддерживают это, но с небольшими изменениями вы можете легко реализовать это поведение.

Например:

public class AutoHideMenuItem : MenuItem
{
    DispatcherTimer timer;

    private Int32 _autoHideDelay;
    public Int32 AutoHideDelay
    {
        get
        {
            return _autoHideDelay;
        }
        set
        {
            _autoHideDelay = value;
            timer.Interval = TimeSpan.FromSeconds(AutoHideDelay);
        }
    }

    public AutoHideMenuItem()
    {
        MouseMove += new MouseEventHandler(AutoHideMenuItem_MouseMove);
        ContextMenuOpening += new ContextMenuEventHandler(AutoHideMenuItem_ContextMenuOpening);
        SubmenuClosed += new RoutedEventHandler(AutoHideMenuItem_SubmenuClosed);

        timer = new DispatcherTimer(DispatcherPriority.Normal, Dispatcher);
        timer.Interval = TimeSpan.FromSeconds(AutoHideDelay);
        timer.Stop();

        timer.Tick += new EventHandler(timer_Tick);
    }

    void timer_Tick(object sender, EventArgs e)
    {
        if (IsSubmenuOpen && !IsMouseOver)
        {
            IsSubmenuOpen = false;
        }
    }

    void AutoHideMenuItem_MouseMove(object sender, MouseEventArgs e)
    {
        timer.Stop();
        timer.Start();
    }

    void AutoHideMenuItem_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        timer.Start();
    }

    void AutoHideMenuItem_SubmenuClosed(object sender, RoutedEventArgs e)
    {
        timer.Stop();
    }
}

Может использоваться как:

            <local:AutoHideMenuItem Header="File" AutoHideDelay="3">
                <MenuItem Header="New"></MenuItem>
                <MenuItem Header="Open"></MenuItem>
                <MenuItem Header="Close"></MenuItem>
                <MenuItem Header="Exit"></MenuItem>
            </local:AutoHideMenuItem>

Который закроет это меню через 3 секунды. Конечно, это грубый код, и вам нужно будет внести в него изменения в соответствии с вашим сценарием.

...