1

我已经手动向菜单条添加了一个轨迹栏,因为 vs 2008 不允许我这样做。但是,我无法获得 trackbar 的值。

Form1.cs:

[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.MenuStrip |
                                        ToolStripItemDesignerAvailability.ContextMenuStrip)]
     public class TrackBarMenuItem : ToolStripControlHost
     {
         private TrackBar trackBar;

         public TrackBarMenuItem()
             : base(new TrackBar())
         {
             this.trackBar = this.Control as TrackBar;
             trackBar.TickFrequency = 1;
             trackBar.Maximum = 255;
             trackBar.LargeChange = 5;
             trackBar.SmallChange = 2;
         }
     }

Form1.Designer.cs:

private TrackBarMenuItem trackBar1;
// 
// trackBar1
// 
this.trackBar1.Name = "trackBar1";
this.trackBar1.Size = new System.Drawing.Size(104, 25);

这就是我需要使用它的方式:

         private void trackBar1_Scroll(object sender, System.EventArgs e)
     {
         int valueB = trackBar1.Value;
         pictureBox2.Image = Deneme(new Bitmap(pictureBox1.Image),valueB);

     }

但我收到此错误:

错误 1 ​​'goruntuIsleme2.Form1.TrackBarMenuItem' 不包含 'Value' 的定义并且没有扩展方法 'Value' 接受类型为 'goruntuIsleme2.Form1.TrackBarMenuItem' 的第一个参数(您是否缺少 using 指令或装配参考?)

有任何想法吗?

4

3 回答 3

1

将内部 Trackbar 对象的值公开为新 TrackBarMenuItem 类的属性:

Value { get { return trackBar.Value; } set { trackBar.Value = value; } }
于 2011-10-26T08:39:28.007 回答
1

我正在添加我找到的解决方案。有人可能需要它:

[System.ComponentModel.DesignerCategory("code")]
    [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ContextMenuStrip | ToolStripItemDesignerAvailability.MenuStrip)]
    public partial class ToolStripMenuItem : ToolStripControlHost
    {
        public ToolStripMenuItem()
            : base(CreateControlInstance())
        {

        }

        /// <summary>
        /// Create a strongly typed property called TrackBar - handy to prevent casting everywhere.
        /// </summary>
        public TrackBar TrackBar
        {
            get
            {
                return Control as TrackBar;
            }
        }

        /// <summary>
        /// Create the actual control, note this is static so it can be called from the
        /// constructor.
        ///
        /// </summary>
        /// <returns></returns>
        private static Control CreateControlInstance()
        {
            TrackBar t = new TrackBar();
            t.AutoSize = false;
            t.Height = 16;
            t.Maximum = 255;

            // Add other initialization code here.
            return t;
        }

        [DefaultValue(0)]
        public int Value
        {
            get { return TrackBar.Value; }
            set { TrackBar.Value = value; }
        }


        /// <summary>
        /// Attach to events we want to re-wrap
        /// </summary>
        /// <param name="control"></param>
        protected override void OnSubscribeControlEvents(Control control)
        {
            base.OnSubscribeControlEvents(control);
            TrackBar trackBar = control as TrackBar;
            trackBar.ValueChanged += new EventHandler(trackBar_ValueChanged);
        }

        /// <summary>
        /// Detach from events.
        /// </summary>
        /// <param name="control"></param>
        protected override void OnUnsubscribeControlEvents(Control control)
        {
            base.OnUnsubscribeControlEvents(control);
            TrackBar trackBar = control as TrackBar;
            trackBar.ValueChanged -= new EventHandler(trackBar_ValueChanged);

        }


        /// <summary>
        /// Routing for event
        /// TrackBar.ValueChanged -> ToolStripTrackBar.ValueChanged
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void trackBar_ValueChanged(object sender, EventArgs e)
        {
            // when the trackbar value changes, fire an event.
            if (this.ValueChanged != null)
            {
                ValueChanged(sender, e);
            }
        }

        // add an event that is subscribable from the designer.
        public event EventHandler ValueChanged;


        // set other defaults that are interesting
        protected override Size DefaultSize
        {
            get
            {
                return new Size(200, 16);
            }
        }

    }

如果您将此添加到您的代码中,您将能够通过 Designer 将轨迹栏添加为 ToolStripMenuItem。

于 2013-08-04T21:33:41.947 回答
0

您的班级是否TrackBarMenuItem有一个名为 的属性Value?如果没有,您必须添加它。

于 2011-10-26T08:39:17.813 回答