скрытие сетки с помощью клавиши ESC - PullRequest
0 голосов
/ 28 января 2009

Я новичок в WPF. У меня 15 окон в моем окне, и у меня есть маленькое меню, в котором я могу щелкнуть и выбрать, какую сетку отображать или скрывать. Только по одной сетке за раз. Я бы хотел, чтобы эта сетка затухала (исчезала), когда я нажимал Esc . У меня уже есть все анимации, мне просто нужно знать, какая сетка видна (активна) на данный момент.

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

Мое решение состоит в том, когда KeyDown событие запускается в моем окне на:

private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == System.Windows.Input.Key.Escape)
        {
            //check all grids for IsVisible and on the one that is true make 
            BeginStoryboard((Storyboard)this.FindResource("theVisibleOne_Hide"));
        }

    }

1 Ответ

1 голос
/ 28 января 2009

Под активным я предполагаю, что это означает тот, который имеет фокус клавиатуры. Если это так, следующее вернет элемент управления, который в настоящее время имеет фокус ввода клавиатуры:

System.Windows.Input.Keyboard.FocusedElement

Вы можете использовать это так:

if (e.Key == System.Windows.Input.Key.Escape)
{
    //check all grids for IsVisible and on the one that is true make 
    var selected = Keyboard.FocusedElement as Grid;
    if (selected == null) return; 

    selected.BeginStoryboard((Storyboard)this.FindResource("HideGrid"));
}

Подход, который был бы более разъединенным, состоял бы в создании статического свойства зависимой привязки. Это можно использовать так (не проверено):

<Grid local:Extensions.HideOnEscape="True" .... />

Очень грубая реализация будет выглядеть так:

public class Extensions
{
    public static readonly DependencyProperty HideOnEscapeProperty = 
       DependencyProperty.RegisterAttached(
           "HideOnEscape", 
           typeof(bool), 
           typeof(Extensions), 
           new UIPropertyMetadata(false, HideOnExtensions_Set));

    public static void SetHideOnEscape(DependencyObject obj, bool value)
    {
        obj.SetValue(HideOnEscapeProperty, value);
    }

    public static bool GetHideOnEscape(DependencyObject obj)
    {
        return (bool)obj.GetValue(HideOnEscapeProperty);
    }

    private static void HideOnExtensions_Set(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var grid = d as Grid;
        if (grid != null)
        {
            grid.KeyUp += Grid_KeyUp;
        }
    }

    private static void Grid_KeyUp(object sender, KeyEventArgs e)
    {
        // Check for escape key...
        var grid = sender as Grid;
        // Build animation in code, or assume a resource exists (grid.FindResource())
        // Apply animation to grid
    }
}

Это избавит от необходимости иметь код в коде позади.

...