【问题标题】:How can I remove accelerator characters from a string?如何从字符串中删除加速器字符?
【发布时间】:2011-04-11 15:58:49
【问题描述】:

我有一个 GUI 控件的标题,我想将它转换为一个简单的文本字符串。具体来说,我想删除加速键元字符。

例如(示例假定 WinForms):

  • 删除单个出现的元字符:&Yes 变为 Yes
  • 将两次出现转换为单次出现:Income && Expense 变为 Income & Expense

我的代码将知道它是在处理 Windows 窗体语法(加速元字符是 &)还是 WPF(它是 _)。但是,这是在后端代码中,所以我不想依赖任何 WinForms 或 WPF 库函数——我需要使用核心(非 GUI)BCL 程序集来执行此操作。 (在这一点上,我认为任何适用于 WinForms 的东西对于 WPF 的修改都是微不足道的。)

我可以想到几种方法来做到这一点,但不清楚哪种方法最简单。

什么是最简单的方法来实现这个“如果单字删除元字符,如果加倍则去双”?

更新:我曾假设 WinForms 和 WPF 都处理这些基本相同,但事实证明他们没有。 WinForms 将在字符串末尾删除一个单独的元字符(Foo& 变为 Foo),但 WPF 不会(Foo_ 仍为 Foo_)。解决这两个问题的答案可获得奖励积分。

【问题讨论】:

    标签: .net wpf winforms string accelerator


    【解决方案1】:

    我已编辑(删除)我之前的答案。我认为最简单的方法是这个正则表达式:

    string input = "s&trings && stuf&f &";
    input = Regex.Replace(input, "&(.)", "$1");
    

    正确处理重复的&符号以及&符号是最后一个字符的情况。

    根据提供的其他信息进行编辑:

    因此 WinForms 表达式将是 "&(.?)",而 WPF 表达式将是 "_(.)"。您要求解决这两种情况的解决方案,但我不确定您在问什么。您最初的问题说代码知道它是在处理 WPF 格式还是 WinForms 格式。所以我会设想一种方法:

    string StripAccelerators(string s, bool isWinForms)
    {
        string pat = (isWinForms) ? "&(.?)" : "_(.)";
        return Regex.Replace(s, pat, "$1");
    }
    

    而且,是的,我意识到在界面中使用Boolean 标志并不理想。理想情况下,您应该使用枚举类型,或者可能有两个单独的方法。

    我认为您不希望有一个可以同时执行这两种操作的正则表达式。这是可能的,但您最终会从 WinForms 字符串中删除下划线,或从 WPF 字符串中删除与号。

    【讨论】:

    • 查看更新。这是不正确的书面形式(WinForms 将去除单个尾随&),但如果您(1)将每个& 更改为_(在这种情况下它与WPF 行为匹配),则变为正确;或 (2) 将 "&(.)" 更改为 "&(.?)"(在这种情况下,它与 WinForms 行为匹配)。
    • 是的,考虑到行为的差异,最好使用两种不同的方法。但看起来这非常有效。
    猜你喜欢
    • 2015-11-27
    • 2019-12-04
    • 1970-01-01
    • 2021-10-26
    • 2015-12-01
    • 2010-10-13
    相关资源
    最近更新 更多