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