2016-02-23 2 views
0

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

У меня есть словарь в кодировке строк и связанных клавиш быстрого доступа. Это не проблема, чтобы вытащить ключ, обратившись к словарю и ключу явно.

Ниже приведен пример:

<Button Content="Picture" 
     Command="{Binding TestCmd}"> 
    <Button.InputBindings> 
     <KeyBinding Key="{Binding Shortcuts[Picture]}" 
        Command="{Binding Command, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"/> 
    </Button.InputBindings> 
</Button> 

То, что я хочу сделать с помощью кнопки содержания в качестве ключа для поиска ярлыка. По существу Key="{Binding Shortcuts[BUTTON.CONTENT]}", но правильный XAML.

ответ

0

Я не думаю, что это можно сделать только с помощью XAML. Одно из возможных решений - написать для этого конвертер.

XAML:

<Button Content="Picture" Command="{Binding TestCmd}"> 
    <Button.InputBindings> 
     <KeyBinding Command="{Binding Command, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"> 
      <KeyBinding.Key> 
       <MultiBinding Converter="{StaticResource DictionaryMultiValueConverter}"> 
        <Binding Path="Shortcuts" /> 
        <Binding Path="Content" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Button}" /> 
       </MultiBinding> 
      </KeyBinding.Key> 
     </KeyBinding> 
    </Button.InputBindings> 
</Button> 

А преобразователь:

public class DictionaryMultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if(values.Length != 2) 
      throw new ArgumentException(@"DictionaryMultiValueConverter needs exactly two values", "values"); 

     var dict = values[0] as IDictionary; 
     var key = values[1]; 

     return dict != null && key != null && dict.Contains(key) 
      ? dict[key] 
      : DependencyProperty.UnsetValue; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

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

+0

Спасибо. Проблема, которую я нашел с помощью всего этого подхода, заключается в том, что кнопка должна быть в фокусе, чтобы слышать нажатия клавиш. Поэтому я собираюсь перейти в совершенно другое направление и использовать пользовательскую клавиатуру, которая уже работает. Но еще раз спасибо! –

Смежные вопросы