Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Привязать горячие сочитание


Автор: DenWPF 11.7.2010, 21:47
вот хочу когда нажимается ctr + s - начинала работать определенная  функция.

есть какой то класс для этого?? или надо постояное отлавливать??

Автор: SergeyLoginov 12.7.2010, 08:48
У команд в WPF для этих целей предусмотрены InputGestures. Почитай про команды и используй лучше их, а не обработчики событий (когда надо выполнить какое-то действие, например, по клику на кнопке или при выборе пункта в меню и т.п.).

Автор: DenWPF 12.7.2010, 09:15
InputGestures - спасибо..
а вот команды пока не осилил=((( не понимаю синтаксиса создания.

Автор: SergeyLoginov 12.7.2010, 12:56
Осиливай, читай, пробуй. Без команд, привязок и свойств зависимостей получается не WPF, а почти WinForms какой-то.

Автор: DenWPF 12.7.2010, 19:09
с привязками уже более понятно, да и с командами тоже..но только готовыми, а вот свои создать не могу понять как

Автор: SKrivosein 14.7.2010, 13:08
Создай класс команд, для примера
 
Код

public class MyCommands
    {
        private static RoutedUICommand calcCommand;

        static MyCommands()
        {
            InputGestureCollection inputC = new InputGestureCollection();
            inputC.Add(new KeyGesture(Key.C, ModifierKeys.Alt, "Alt+C"));
            calcCommand = new RoutedUICommand("Калькулатор", "CalcCommand", typeof(MyCommands), inputC);
        }

        public static RoutedUICommand CalcCommand
        {
            get { return calcCommand; }
        }
    }


а в коде потом

Код

        private void CommandBindingInitialize()
        {
            CommandBinding calcBinding = new CommandBinding(MyCommands.CalcCommand);
            calcBinding.Executed += new ExecutedRoutedEventHandler(calcBinding_Executed);
            this.CommandBindings.Add(calcBinding);
        }
 
        void calcBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            try
            {
                string system32 = Environment.GetFolderPath(Environment.SpecialFolder.System);
                Process.Start(system32 + "\\calc.exe");
            }
            catch (Exception ex)
            {
                string err = ex.Message;
                string source = ex.Source;
            }
        }


И всё, можно и иногда нужно обработать CanExecute, или понастроить чего то ещё . Привязать в XAML  кде надо.

Автор: DenWPF 14.7.2010, 21:23
чот твой пример не пашет???
точно не чего не забыл??

Автор: SKrivosein 14.7.2010, 23:28
У меня все работает, я там исправлял позже DataCommands на мифический MyCommands , также проверь код. 
В XAML например кнопка в toolbar:
Код

<Button x:Name="tbCalcul" Margin="0" Command="MyCommands.CalcCommand", ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}">

Метод CommandBindingInitialize() подключил?

Автор: DenWPF 14.7.2010, 23:58
да подключил.

"Ссылка типа не может найти общий тип с именем "MyCommand".  Ошибка в строке 46, позиция 58."

я класс MyCommand назвал.

это происходит при this.InitializeComponent(); после CommandBindingInitialize() 

Автор: SKrivosein 15.7.2010, 01:33
?
Пространства имен...

Автор: DenWPF 15.7.2010, 11:10
одинаковые

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)