2

首先,让我声明一下我是 .NET 的新手,所以如果我的问题太天真或答案太简单,我提前道歉。我做了一些研究并测试了不同的东西,但我无法让它发挥作用。我正在尝试做的事情:

我的表单中有很多不同的工具提示,我希望它们具有相同的属性。例如:

mySampleTooltip.ShowAlways = true;
mySampleTooltip.IsBalloon = true;
mySampleTooltip.AutomaticDelay = 750;
mySampleTooltip.AutoPopDelay = 32767;

我认为可能有一个更优雅的解决方案,而不是对每个工具提示都这样做并粘贴代码 100 次。我的想法是创建一个名为 PermaToolTip 的类 ToolTip 的子类,并从这个特定的类创建对象(顺便说一句,这是正确的方法还是有更好的方法?)。

我的代码如下所示:

public class PermaToolTip : ToolTip
{
    private bool _ShowAlways;
    private bool _IsBalloon;
    private int _AutomaticDelay;
    private int _AutoPopDelay;

    // SET ShowAlways Property for subclass
    public bool ShowAlways
    {
        get
        {
            return _ShowAlways;
        }
        set
        {
            _ShowAlways = true;
        }
    }
    // SET IsBalloon Property for subclass
    public bool IsBalloon
    {
        get
        {
            return _IsBalloon;
        }
        set
        {
            _IsBalloon = true;
        }
    }
    // SET AutomaticDelay Property for subclass
    public int AutomaticDelay
    {
        get
        {
            return _AutomaticDelay;
        }
        set
        {
            _AutomaticDelay = 750;
        }
    }
    // SET AutoPopDelay Property for subclass
    public int AutoPopDelay
    {
        get
        {
            return _AutoPopDelay;
        }
        set
        {
            _AutoPopDelay = 32767;
        }
    }
}

但它不起作用。具体来说:

1) 我在属性名称下方看到一条绿线和一条警告:警告:“ResellerRatingsGUI.PermaToolTip.ShowAlways”隐藏了继承的成员“System.Windows.Forms.ToolTip.ShowAlways”。如果打算隐藏,请使用 new 关键字。

2) 我实例化了 PermaToolTip 类的一个对象,但它没有我想要的属性。

回复评论:它不是用户定义的控件。它是 .NET 控件。

知道我做错了什么吗?

4

3 回答 3

8

基类已经具有这些属性。做你正在做的事情应该会导致编译器抱怨(因为你隐藏了基类成员而不使用new来表示你想要隐藏它)。

您不需要创建新属性 - 只需在构造函数中设置基类默认值即可:

public class PermaToolTip : ToolTip
{
     public PermaToolTip()
     {
        // Define defaults differently now
        this.ShowAlways = true;
        this.IsBalloon = true;
        this.AutomaticDelay = 750;
        this.AutoPopDelay = 32767;
     }
}

这将导致您的类使用ToolTip属性,但具有不同的默认值。

于 2012-07-06T17:13:10.367 回答
3

首先,正如另一个答案中所述,您的子类不应具有与基类中的成员同名的成员,除非您的意图是覆盖他们的行为。在这种情况下,您应该只覆盖虚拟抽象成员。

从设计的角度来看,我会建议一种不同的方法。看来子类的唯一目的是创建一个填充有默认值的 ToolTip 实例。不必使用继承来完成此操作。相反,您应该考虑某种帮助器,它会为您提供一个填充有默认值的 ToolTip 实例。这样你就不会被你不一定想要或不需要的具体类型所困。

示例类:

public static class DefaultToolTip 
{
  public static void Create()
  {
    ToolTip tip = new ToolTip();
    tip.ShowAlways = true;
    tip.IsBalloon = true;
    tip.AutomaticDelay = 750;
    tip.AutoPopDelay = 32767;
    return tip;
  }
}

用法:

ToolTip toolTip = DefaultToolTip.Create();
于 2012-07-06T17:28:56.727 回答
1

创建您的工具提示,然后使用 SetToolTip,这样您就不需要 100 个,只需要少数甚至一个。

直接来自 MSDN

  private void Form1_Load(object sender, System.EventArgs e)
  {
     // Create the ToolTip and associate with the Form container.
     ToolTip toolTip1 = new ToolTip();

     // Set up the delays for the ToolTip.
     toolTip1.AutoPopDelay = 5000;
     toolTip1.InitialDelay = 1000;
     toolTip1.ReshowDelay = 500;
     // Force the ToolTip text to be displayed whether or not the form is active.
     toolTip1.ShowAlways = true;

     // Set up the ToolTip text for the Button and Checkbox.
     toolTip1.SetToolTip(this.button1, "My button1");
     toolTip1.SetToolTip(this.checkBox1, "My checkBox1");
  }
于 2012-07-06T17:17:29.397 回答