使用键盘快捷键C#WPF更改按钮颜色

时间:2015-06-04 13:17:39

标签: wpf colors controls inputbinding

我正在进入一些C#WPF,我正在创建一个简单的文字处理器来将普通文本转换为wiki标记。我是WPF的新手,我遇到了一些看似微不足道的问题,希望能够轻松解决。

我的主表单上有一个粗体按钮。当按下时,它会按照我的需要执行操作,即将所选文本转换为粗体,反之亦然。 粗体按钮在按下时也会变为浅蓝色,再次按下时会变为灰色。太好用了......

//Make Bold MAIN method
    static bool isBold = false;
    public static void boldText()
    {
        if (isBold == false)
        {

            TextSelection ts = MainWindow.thisForm.rtbMain.Selection;
           MainWindow.thisForm.btnBold.Background = Brushes.LightBlue;
            if (!ts.IsEmpty)
            {

                ts.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
            }
            isBold = !isBold;

        }
        else
        {

            MainWindow.thisForm.btnBold.Background = Brushes.LightGray;
            TextSelection ts = MainWindow.thisForm.rtbMain.Selection;
            ts.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Normal);
            isBold = !isBold;

        }

    }

我现在的问题是出于某种原因,当我使用 InputBinding 调用上面的代码时,所选文本变为粗体但按钮颜色不会改变... whaaaaA?我在下面创建了一个自定义命令执行 CanExecute 命令:

  public class ToolBar
   {
     //Custom Command
           public static RoutedCommand boldShortCut = new RoutedCommand();

        //For use with Keybindings for BOLD command
            static bool canExecute = true;
            public static void myCommandExecute(object sender, ExecutedRoutedEventArgs e)
            {
                boldText();
                canExecute = !canExecute;
            }
            public static void myCommandCanExecute(object sender, CanExecuteRoutedEventArgs e)
            {
                e.CanExecute = true;
            }

然后我在主窗体的构造函数中创建 KeyGesture InputBindings

public MainWindow()
        {
            InitializeComponent();
            thisForm = this;
            initializeFeatures();

            KeyGesture kg = new KeyGesture(Key.B, ModifierKeys.Control);
            InputBinding ib = new InputBinding(ToolBar.boldShortCut, kg);
            this.InputBindings.Add(ib);
        }

所以这一切都有效,但出于某种原因,当我使用按键手势( CTRL + B )时,粗体按钮不会改变颜色。我在XAML中需要做些什么吗?任何帮助将不胜感激,如果有任何不清楚或需要其他信息,请告诉我。谢谢你们!

2 个答案:

答案 0 :(得分:1)

您正在创建的命令(boldShortCut)永远不会被设置为执行任何操作。 RoutedCommand仅在激活时触发事件。需要在树的某处绑定一个命令,用于侦听事件并执行某些逻辑。

请查看此页面,了解路由命令的工作原理:
How to: Create a RoutedCommand

此外,当您按Ctrl + B时​​文本变为粗体的唯一原因是因为这是RichTextBox的内置功能。实际上,RichTextBox具有很多功能,您可以轻松地将工具栏按钮挂起。在尝试重新实现其现有功能之前,您可以通过学习如何使用RichTextBox来节省大量时间。

这是一个很好的页面,可以帮助您入门:RichTextBox Overview

(有关可以连接的现有命令的完整列表,请参阅EditingCommands Class文档。)

答案 1 :(得分:0)

Hey Xavier你完全正确,我没有在构造函数中将Command添加到CommandBindings

请参阅下面更正的代码,该代码在构造函数中调用boldShortcut命令:

//Constructor
public MainWindow()
    {
        InitializeComponent();
        thisForm = this;
        initializeFeatures();

        ToolBar.boldShortCut.InputGestures.Add(new KeyGesture(Key.M, ModifierKeys.Control));
        CommandBindings.Add(new CommandBinding(ToolBar.boldShortCut, ToolBar.myCommand, ToolBar.myCommandCanExecute));

    }