首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在下拉菜单中显示ToolStripControlHost图像

在下拉菜单中显示ToolStripControlHost图像
EN

Stack Overflow用户
提问于 2017-04-01 13:22:32
回答 1查看 963关注 0票数 2

我有一个包含下拉列表中各种元素的ToolStripSplitButton。其中一个是包含在ToolStripControlHost中的Trackbar,称为ToolStripTrackbarItem。这是代码(我从堆栈溢出中获得):

代码语言:javascript
复制
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace Application
{
    [System.ComponentModel.DesignerCategory("code")]
    [System.Windows.Forms.Design.ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip | ToolStripItemDesignerAvailability.MenuStrip)]

    public class ToolStripTrackbarItem : ToolStripControlHost
    {
        public ToolStripTrackbarItem()
            : base(CreateControlInstance())
        {
            this.Size = Control.Size;
        }
        public TrackBar TrackBar
        {
            get { return Control as TrackBar; }
        }
        private static Control CreateControlInstance()
        {
            TrackBar t = new TrackBar();
            t.AutoSize = false;
            return t;
        }
        [DefaultValue(0)]
        public int Value
        {
            get { return TrackBar.Value; }
            set { TrackBar.Value = value; }
        }
        protected override void OnSubscribeControlEvents(Control control)
        {
            base.OnSubscribeControlEvents(control);
            TrackBar trackBar = control as TrackBar;
            trackBar.ValueChanged += new EventHandler(trackBar_ValueChanged);
        }
        protected override void OnUnsubscribeControlEvents(Control control)
        {
            base.OnUnsubscribeControlEvents(control);
            TrackBar trackBar = control as TrackBar;
            trackBar.ValueChanged -= new EventHandler(trackBar_ValueChanged);
        }
        void trackBar_ValueChanged(object sender, EventArgs e)
        {
            if (this.ValueChanged != null)
                ValueChanged(sender, e);
        }
        public event EventHandler ValueChanged;
        protected override Size DefaultSize
        {
            get { return new Size(300, 16); }
        }
    }

它可以工作,但我需要在下拉项目的左侧显示图像:

通过设置图像属性,我成功地使用了一个简单的ToolStripMenuItem。但是,设置我的ToolStripTrackbarItem的Image (这是从ToolStripControlHost继承的,参见上面的代码)是无效的。根据MSDN,图像属性与ToolStripControlHost无关。

什么意思?难道不可能包括一个留给ToolStripControlHost的图像吗?

如果有可能的话,怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-02 02:51:02

您应该在这里解决两个问题:

  • ToolStripControlHost不显示Image属性,也不会在保存表单时序列化图像。
  • ToolStripProfessionalRendered不为ToolStripControlHost绘制图像。

您需要覆盖ToolStripControlHostToolStripControlHost属性,并使其可浏览和可序列化。此外,您还需要创建一个自定义渲染器,以在正确的位置和大小绘制图像。然后,如果您使用下面的代码简单地设置ToolStrip的呈现器,您将得到预期的结果:

代码语言:javascript
复制
this.toolStrip1.Renderer = new MyCustomRenderer();

ToolStripTrackBar

该项使Image属性能够在属性网格中显示,并允许它在保存窗体时序列化。

代码语言:javascript
复制
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.Design;
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.All)]
public class ToolStripTrackBar : ToolStripControlHost
{
    public TrackBar TrackBar { get { return (TrackBar)Control; } }
    public ToolStripTrackBar() : base(CreateControl()) { }
    private static TrackBar CreateControl()
    {
        var t = new TrackBar()
        { TickStyle = TickStyle.None, AutoSize = false, Height = 28 };
        return t;
    }
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override Image Image
    {
        get { return base.Image; }
        set { base.Image = value; }
    }
    /*Expose properties and events which you need.*/
    public int Value
    {
        get { return TrackBar.Value; }
        set { TrackBar.Value = value; }
    }
}

MyCustomRenderer

此渲染器为ToolStripTrackBar绘制图像。

代码语言:javascript
复制
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
public class MyCustomRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderImageMargin(ToolStripRenderEventArgs e)
    {
        base.OnRenderImageMargin(e);
        e.ToolStrip.Items.OfType<ToolStripTrackBar>()
         .ToList().ForEach(item =>
         {
             if (item.Image != null)
             {
                 var size = item.GetCurrentParent().ImageScalingSize;
                 var location = item.Bounds.Location;
                 location = new Point(5, location.Y + 1);
                 var imageRectangle = new Rectangle(location, size);
                 e.Graphics.DrawImage(item.Image, imageRectangle,
                     new Rectangle(Point.Empty, item.Image.Size),
                     GraphicsUnit.Pixel);
             }
         });
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43157426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档