【问题标题】:can't get value of trackbar on menu strip无法在菜单条上获取轨迹栏的值
【发布时间】:2011-10-26 08:35:07
【问题描述】:

我已经手动向菜单条添加了一个轨迹栏,因为 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 指令或程序集引用?)

有什么想法吗?

【问题讨论】:

    标签: c# menustrip trackbar


    【解决方案1】:

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

    Value { get { return trackBar.Value; } set { trackBar.Value = value; } }
    

    【讨论】:

      【解决方案2】:

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

      [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。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多