我有一个包含下拉列表中各种元素的ToolStripSplitButton。其中一个是包含在ToolStripControlHost中的Trackbar,称为ToolStripTrackbarItem。这是代码(我从堆栈溢出中获得):
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的图像吗?
如果有可能的话,怎么做呢?
发布于 2017-04-02 02:51:02
您应该在这里解决两个问题:
ToolStripControlHost不显示Image属性,也不会在保存表单时序列化图像。ToolStripProfessionalRendered不为ToolStripControlHost绘制图像。您需要覆盖ToolStripControlHost的ToolStripControlHost属性,并使其可浏览和可序列化。此外,您还需要创建一个自定义渲染器,以在正确的位置和大小绘制图像。然后,如果您使用下面的代码简单地设置ToolStrip的呈现器,您将得到预期的结果:
this.toolStrip1.Renderer = new MyCustomRenderer();

ToolStripTrackBar
该项使Image属性能够在属性网格中显示,并允许它在保存窗体时序列化。
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绘制图像。
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);
}
});
}
}https://stackoverflow.com/questions/43157426
复制相似问题