如何在WPF中更改图标行为?

时间:2013-06-21 17:23:29

标签: wpf icons

我想更改WPF主窗口中图标的行为。我已经知道如何改变它看起来 - 将图标设置为我想要的ImageSource。我希望实现的是,当点击图标时,我自己的自定义菜单将打开,而不是标准的打开/关闭/最小化选项。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

将此代码放在WPF窗口中。您可能需要稍微调整一下代码,但这很符合您的要求。它仅适用于右键单击图标。如果您需要左键单击,请使用WM_NCLBUTTONDOWN作为消息。

它通过拦截当前窗口上的本机窗口消息来工作。 WM_NC *消息负责传递窗口chrome事件。截取事件后,您只需要在正确的位置显示上下文菜单。

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
        source.AddHook(WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == 0xA4) //WM_NCRBUTTONDOWN  
        {
            //Screen position of clicked point
            var pos = new Point(lParam.ToInt32() & 0xffff, lParam.ToInt32() >> 16);

            //Check if we clicked an icon these values are not precise
            // and could be adjusted
            if ((pos.X - Left < 20) && (pos.Y - Top < 20))
            {
                //Open up context menu, should be replaced with reference to your
                // own ContextMenu object
                var context = new ContextMenu();
                var item = new MenuItem { Header = "Test" };
                context.Items.Add(item);
                item.Click += (o,e) => MessageBox.Show("Hello World!");

                //Those are important properties to set
                context.Placement = PlacementMode.AbsolutePoint;
                context.VerticalOffset = pos.Y;
                context.HorizontalOffset = pos.X;
                context.IsOpen = true;

                handled = true;
            }
        }

        return IntPtr.Zero;
    }