2010-05-27 4 views
0

У меня есть пользовательский холст, полученный от Canvas. Он содержит несколько ApplicationCommands как New/Open/Save и т.д. добавил, как это -Использование команд WPF с Canvas не работает

this.CommandBindings.Add(new CommandBinding(ApplicationCommands.New, New_Executed, 
New_Enabled)); 

New_Enabled всегда возвращает истину.

Этот элемент управления используется в проекте wpf, имеющем строку меню; присутствует в этом меню с их Command набором к соответствующим ApplicationCommand, как эта кнопке меню New/Open/Save в -

<syncfusion:SimpleMenuButton 
    x:Name="NewMenu" 
    Icon="Images\New_Large.png" 
    Label="New" 
    IsEnabled="True" 
    Command="{x:Static ApplicationCommands.New}" 
    syncfusion:Ribbon.KeyTip="N"> 
</syncfusion:SimpleMenuButton> 

Команда работает правильно, когда фокус присутствует на Canvas, но как только фокус смещается на другой элемент управления, Новый кнопка отключена. Я попытался установить CommandTarget в главное окно, но это тоже не работает.

Почему это происходит и как можно убедиться, что кнопка «Новый» всегда будет включена?

ответ

0

@repka - Спасибо за ваш ответ; Я уже пробовал использовать имя холста как CommandTarget, но он не работает; Кнопки становятся доступными только тогда, когда фокус находится на холсте, как только я нажимаю на какой-либо другой элемент управления в окне, который отключается. Я также попытался использовать IsFocusScope, но тот же результат. Спасибо за подсказку имени команды.

я должен был согласиться с этим обходным путем, хотя я не слишком доволен этим -

public WindowMain() 
    { 
     InitializeComponent(); 

     //Add commnad bindings 
     //Need to do this to keep New/Open/Save/Run buttons always enabled 
     //ToDo:[AJ] Look for better solution then this 
     this.CommandBindings.Add(new CommandBinding(ApplicationCommands.New, this.TheCanvas.New_Executed, this.TheCanvas.New_Enabled)); 
     this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Open, this.TheCanvas.Open_Executed, this.TheCanvas.Open_Enabled)); 
     this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Save, this.TheCanvas.Save_Executed, this.TheCanvas.Save_Enabled)); 
     this.CommandBindings.Add(new CommandBinding(RTDesignerCanvas.Run, this.TheCanvas.Run_Executed)); 
    } 
0

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

Если у вас есть только один холст, который вы хотите получить все ваши команды, просто привязать CommandTarget из кнопок на холсте:

... 
Command="New" 
CommandTarget="{Binding ElementName=TheCanvas}" 
... 

Обратите внимание, что ICommand отмечен TypeConverterAttribute, который преобразует строки, как «New» в ApplicationCommands.New, поэтому вам не нужно использовать расширение разметки x:Static.

Вы можете сделать это в одном месте с помощью Style для всех кнопок на уровне вашего меню/панели инструментов.

Однако, если у вас есть несколько холстов и хотите, чтобы ваша команда должна быть направлена ​​на в настоящее время сосредоточены один, вы должны сделать две вещи:

  1. убедитесь, ваш холст (или контроль над этим) имеет Focusable="True"
  2. ограничьте область логического фокуса вашей панели инструментов (или любого другого контейнера, который вы используете для своих кнопок), установив на нем FocusManager.IsFocusScope="True". В некоторых контейнерах, таких как Menu, или ToolBar, есть по умолчанию. Таким образом, как только алгоритм маршрутизации команды достигнет области действия, он перенаправит ее на элемент, который в настоящее время имеет фокус клавиатуры.

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

  • Нет связанных вопросов^_^