我可以扩展 Button 以添加右键单击事件,同时也保留图形副作用吗?

2024-01-15

我正在尝试扩展 Button 以添加右键单击事件。

我的客户想要一个按钮来执行不同的操作,具体取决于您是左键单击还是右键单击。我预计会有一个简单的右键单击事件,但事实证明没有。

我希望 Button 的视觉行为与预先存在的 Click 事件相同,但事实证明这很困难。按钮具有许多图形行为,当您单击并拖动按钮时会发生这些行为。

  • 当您按下时,按钮会降低。如果您将降低的按钮拖开,它就会升起(例如取消降低)。您拖过的任何其他按钮都会忽略它。
  • 当您向后拖动原始按钮时,它会再次降低。
  • 如果您拖开然后释放,原始按钮的状态应该重置(即您不能重新单击并再次拖动)。

如果左键单击的视觉效果与右键单击的视觉效果不匹配,这些图形上的小怪癖会看起来很粗糙。

目前我被困在这个问题上:如果右键单击并按住按钮,然后将按钮拖出,如何检测用户是否取消单击?我需要知道这一点,这样我才能知道在重新进入时不要重新按下按钮。

一个更广泛的问题:我是否走在正确的轨道上?我找不到以前做过这件事的人。我的代码如下。

public class RightClickButton : Button
{
    public event RoutedEventHandler RightClick;

    public RightClickButton()
    {
        this.MouseRightButtonDown += new System.Windows.Input.MouseButtonEventHandler(RightClickButton_MouseRightButtonDown);
        this.MouseRightButtonUp += new System.Windows.Input.MouseButtonEventHandler(RightClickButton_MouseRightButtonUp);
        this.MouseEnter += new System.Windows.Input.MouseEventHandler(RightClickButton_MouseEnter);
        this.MouseLeave += new System.Windows.Input.MouseEventHandler(RightClickButton_MouseLeave);
    }

    void RightClickButton_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        this.IsPressed = true;
    }

    void RightClickButton_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        this.IsPressed = false;
        if (RightClick != null)
            RightClick.Invoke(this, e);
    }

    void RightClickButton_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
        if (this.IsPressed)
            this.IsPressed = false;
    }

    void RightClickButton_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        if (this.IsFocused && Mouse.RightButton == MouseButtonState.Pressed)
            this.IsPressed = true;
    }
}

感谢给的答复我的另一个问题 https://stackoverflow.com/questions/9961050/can-i-get-a-mouseleave-event-while-mouse-capture-is-active/9966984,这就是我想出来的。

XP 和 Win7 的行为似乎可能存在一些差异。我需要在 Win7 上进一步测试。

public class RightClickButton : Button
{
    public event RoutedEventHandler RightClick;

    private bool _clicked = false;

    public RightClickButton()
    {
        this.MouseRightButtonDown += new System.Windows.Input.MouseButtonEventHandler(RightClickButton_MouseRightButtonDown);
        this.MouseRightButtonUp += new System.Windows.Input.MouseButtonEventHandler(RightClickButton_MouseRightButtonUp);
    }

    // Subclasses can't invoke this event directly, so supply this method
    protected void TriggerRightClickEvent(System.Windows.Input.MouseButtonEventArgs e)
    {
        if (RightClick != null)
            RightClick(this, e);
    }

    void RightClickButton_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        this.IsPressed = true;
        CaptureMouse();
        _clicked = true;
    }

    void RightClickButton_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        ReleaseMouseCapture();

        if(this.IsMouseOver && _clicked)
        {
            if (RightClick != null)
                RightClick.Invoke(this, e);
        }

        _clicked = false;
        this.IsPressed = false;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        if (this.IsMouseCaptured)
        {
            bool isInside = false;

            VisualTreeHelper.HitTest(
                this,
                d =>
                {
                    if (d == this)
                    {
                        isInside = true;
                    }

                    return HitTestFilterBehavior.Stop;
                },
                ht => HitTestResultBehavior.Stop,
                new PointHitTestParameters(e.GetPosition(this)));

            if (isInside)
                this.IsPressed = true;
            else
                this.IsPressed = false;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以扩展 Button 以添加右键单击事件,同时也保留图形副作用吗? 的相关文章

  • 简单的C问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 无法在表适配器配置属性中找到对象“Web.config”的连接“MyConnName”

    I want to change the query in table adapter but it s not opening throwing an error Configure table Adapter Failed in pro
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • 使用 Process.Start() 打开文件夹时访问被拒绝异常

    我有一个 C 中的 winforms 应用程序 我必须在其中打开某个文件夹 我用 System Diagnostics Process Start pathToFolder 这会导致以下异常 System ComponentModel Wi
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • WPF 缩放变换和 ScrollViewer - 缩放时无法滚动超出原始大小

    我在 ScrollViewer 中有一个 StackPanel 我有一个滑块 可以在堆栈面板上进行缩放变换 以允许放大和缩小功能 问题是 当我放大时 滚动查看器不会将内容视为 更大 因此 如果我滚动一点并尽可能向右滚动 它会在我到达内容末尾
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont
  • 清理 TPL 中的 CallContext

    根据我使用的是基于 async await 的代码还是基于 TPL 的代码 我在逻辑清理方面得到了两种不同的行为CallContext 我可以设置和清除逻辑CallContext如果我使用以下异步 等待代码 正如我所期望的 class Pr

随机推荐

  • 如何从 RabbitMQ 获取旧消息?

    我使用 Bunny Ruby 发布 RabbitMQ 消息 如下所示 x publish Message n to s routing key gt mychannel 并像这样订阅 ch conn create channel x ch
  • Autofac - 构建前解决

    使用 Unity 可以在构建容器之前解决依赖关系 Autofac 也可以吗 下面的代码演示了我的场景 我需要解决ICacheRepository为了 更新 单例CacheHelper 在 Unity 中 这可以简单地完成container
  • 4 个浮动 DIV 在使用 CSS 的缩小屏幕上对称响应

    1 2 3 4 我有四个向左浮动的 DIV 上图 使用简单的 CSS float left 宽度 128 像素 高度 128 像素 当我缩小屏幕时 最后一个 DIV 正确跳到下一行 1 2 3 4 但我真正想要的是最后两个块跳到下一行 以保
  • 将数据集导出到 Excel 2007 EPPlus

    我正在尝试将数据集导出到 excel 2007 我无法使用用于在内容类型中使用 mime 类型导出的正常代码 如下所示 Response ContentType application ms excel 如果我对 xls 使用 mime 类
  • 将时间分成间隔

    我有三个输入 开始时间 End time 间隔时间 Example start time 01 00 end time 01 30 intervel time 10 min 我需要像 01 00 01 10 01 20 01 30 这样的输
  • 如何在单个查询中更改所有表前缀

    我对 mysql 非常业余 你能告诉我如何在单个查询中更改整个数据库的表前缀 我可以手动执行此操作 但更改所有表前缀非常耗时 请帮帮我 就像 isc administrator log 到 cus administrator log 意味着
  • 发出局部变量并为其赋值

    我正在初始化一个整数变量 如下所示 LocalBuilder a ilGen DeclareLocal typeof Int32 我如何访问它并为其赋值 我想做这样的事情 int a b a 5 b 6 return a b Use the
  • 在 Python 中进行自动属性分配的最佳方法是什么?这是一个好主意吗?

    而不是每次定义类时都编写这样的代码 class Foo object def init self a b c d e f g self a a self b b self c c self d d self e e self f f sel
  • php刷新当前页面?

    我有一个页面 如果设置了变量 在会话中 它会执行一个动作 然后它会取消会话 现在它必须自我更新 这就是我被困住的地方 有没有办法获取当前页面的确切 url 或者有一个函数可以做到这一点吗 so header location header
  • 使用 SVG 仅填充半颗星

    对于我正在构建的评级系统 有没有办法向这个 svg 示例添加一个 css 类 以便它只显示填充的一半星号 参见jsbin http jsbin com cifip 2 http jsbin com cifip 2 在此示例中 当前填充为黄色
  • TinyMCE 增加字体系列下拉字体大小

    有谁知道如何增加 TinyMCE 中 字体系列下拉 列表项的字体大小 Thanks 您需要创建一个自己的 css 文件并使用 tinymce 配置参数 content css your css file css 您的 css 文件必须包含以
  • gradle 存储库指向具有多个库的本地目录

    我对本地存储库的 build gradle 中的构建依赖项有疑问 即使用本地目录 dependencies compile fileTree include jar dir libs 它只解决libs目录中的依赖关系还是解决lib目录中所有
  • 获取经过身份验证的 Facebook 用户的年龄,无需进一步的权限提示

    使用 Facebook Graph API 是否可以在不首先提示用户年龄 或年龄范围 的情况下获取用户的年龄 或年龄范围 user birthday or friends birthday允许 你不能 年龄要求user birthday o
  • 我需要帮助使用 Knockout 格式化数据绑定

    我对 Knockout 相当陌生 我正在寻找格式化输出的方法 我看到了一个类似这样的例子 但我的尝试当然是行不通的 这是 jsfiddle 的链接 http jsfiddle net cezmp http jsfiddle net cezm
  • Django的URL字段测试问题

    有人可以解释一下为什么这个网址吗http www nacolmeia com br do Home oferta EnERURLField 的 Django 生成的表单不被接受 Thanks 您是否在尝试验证该网站的同一台服务器上托管该网站
  • Faye 和 Nodejs:如何运行 Faye 服务器端客户端?

    我正在尝试开发一个 Faye 服务器端客户端以根据需要自动运行 在Faye的官方网站上 我只找到了关于服务器端客户端的文档 没有关于如何运行它的信息 请告诉我该怎么做 谢谢 文档中缺少一个关键部分 看来你需要打电话client connec
  • 为什么 PHP 4.4.9 抛出“解析错误:语法错误,意外的 T_STATIC”? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我刚刚意识
  • Spring:@Component 与 @Bean

    我明白那个 Component注解是在 spring 2 5 中引入的 目的是通过使用类路径扫描来摆脱 xml bean 定义 Bean于 spring 3 0 中引入 可与 Configuration为了完全摆脱 xml 文件并使用 ja
  • 线程状态阻塞和等待之间的区别[重复]

    这个问题在这里已经有答案了 我已通过以下帖子阅读了答案 WAIT 和 BLOCKED 线程状态之间的区别 https stackoverflow com questions 15680422 difference between wait
  • 我可以扩展 Button 以添加右键单击事件,同时也保留图形副作用吗?

    我正在尝试扩展 Button 以添加右键单击事件 我的客户想要一个按钮来执行不同的操作 具体取决于您是左键单击还是右键单击 我预计会有一个简单的右键单击事件 但事实证明没有 我希望 Button 的视觉行为与预先存在的 Click 事件相同