【问题标题】:Check the button state for all mouse buttons检查所有鼠标按钮的按钮状态
【发布时间】:2011-02-13 15:57:14
【问题描述】:

有没有比检查任何不同的额外按钮更好的方法来检查所有鼠标按钮的按钮状态?

var mouseEventArgs = (System.Windows.Input.MouseEventArgs)e.StagingItem.Input;

if (mouseEventArgs.LeftButton == MouseButtonState.Released &&
    mouseEventArgs.MiddleButton == MouseButtonState.Released &&
    mouseEventArgs.RightButton == MouseButtonState.Released &&
    mouseEventArgs.XButton1 == MouseButtonState.Released &&
    mouseEventArgs.XButton2 == MouseButtonState.Released)
{
    return;
}

如果不是,我怎么能做得更优雅而不重复自己呢?

提前致谢!

【问题讨论】:

    标签: c# .net wpf events coding-style


    【解决方案1】:

    我认为除了将其重构为一个方法之外,您无能为力,因为没有针对所有按钮的预定义集合。如果你想让它完全看不见,你可以使用这样的扩展方法:

    public static class Extensions
    {
        public static bool CheckUniformButtonState(this MouseButtonEventArgs e, MouseButtonState state)
        {
            switch (state)
            {
                case MouseButtonState.Pressed:
                    return (e.LeftButton == MouseButtonState.Pressed &&
                        e.RightButton == MouseButtonState.Pressed &&
                        e.MiddleButton == MouseButtonState.Pressed &&
                        e.XButton1 == MouseButtonState.Pressed &&
                        e.XButton2 == MouseButtonState.Pressed);
                case MouseButtonState.Released:
                    return (e.LeftButton == MouseButtonState.Released &&
                        e.RightButton == MouseButtonState.Released &&
                        e.MiddleButton == MouseButtonState.Released &&
                        e.XButton1 == MouseButtonState.Released &&
                        e.XButton2 == MouseButtonState.Released);
                default:
                    return false;
            }
        }
    }
    

    (并不是说任何人都会检查是否按下了所有 5 个按钮..)

    然后你可以这样检查:

    if (mouseEventArgs.CheckUniformButtonState(MouseButtonState.Released))
    {
        return;
    }
    

    【讨论】:

    • 更好的代码是:return (e.LeftButton == state && e.RightButton == state && e.MiddleButton == state && e.XButton1 == state && e.XButton2 == state);
    • 也许更短:return (e.LeftButton == e.RightButton == e.MiddleButton == e.XButton1 == e.XButton2 == state);
    【解决方案2】:
    var buttonStates = new [] {
         mouseEventArgs.LeftButton, 
         mouseEventArgs.MiddleButton,
         mouseEventArgs.RightButton,
         mouseEventArgs.XButton1,
         mouseEventArgs.XButton2};
    
    if (buttonStates.All(s => s == MouseButtonState.Released))
    {
         return;
    }
    

    【讨论】:

    • 如果释放任何一个按钮而不是所有按钮,它看起来会返回 true。
    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2013-09-20
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多