Скрытие сетки с помощью клавиши ESC
Я новичок в 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 ответ
Под активным я предполагаю, что имеется в виду тот, который имеет фокус клавиатуры. Если это так, следующее вернет элемент управления, который в настоящее время имеет фокус ввода клавиатуры:
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
}
}
Это избавило бы от необходимости иметь код в коде позади.