0

カスタム コントロールを作成する演習に取り組んでいます。カスタム コントロールは、 を継承した単純なラベルControlです。

以下のツール ヒント コードを使用します。

m_toolTip = new ToolTip();

protected override void OnMouseMove(MouseEventArgs e) {
    m_toolTip.SetToolTip(this, Text);
    base.OnMouseMove(e);
}

protected override void OnMouseLeave(EventArgs e) {
    m_toolTip.RemoveAll();
    base.OnMouseLeave(e);
}

ツール ヒントには構成は使用されません。

ラベルの上にマウスを置くと (マウスは見えませんが): ここに画像の説明を入力

ここで、コントロールを離れて 2 番目のラベルにマウスを合わせた後: ここに画像の説明を入力

マウスを の上に置くMS Labelと、ツール ヒントが表示され、すぐに消えます。標準の MS ラベルが示す動作をより適切に再現するにはどうすればよいですか?

4

3 に答える 3

0

MouseEnterの代わりにイベントを使用しMouseMoveます。を使用して、Timerすぐに表示するのではなく、しばらくしてから表示することができます。

例えば:

// Member Variables
ToolTip toolTip = new ToolTip();
string toolTipText = "Your tool tip goes here.";
Timer toolTipTimer = new Timer();

public TimeSpan ToolTipDelay
{
  get { return TimeSpan.FromMilliseconds(toolTipTimer.Interval); }
  set { toolTipTimer.Interval = (int)value.TotalMilliseconds; }
}

// Call this in your CustomControl constructor!
void InitializeToolTipTimer()
{
  this.ToolTipDelay = TimeSpan.FromSeconds(1);

  toolTipTimer.Tick += (sender, e) =>
  {
    toolTipTimer.Stop(); // Tick only once per MouseEnter
    toolTip.SetToolTip(this, toolTipText);
  };
}

void OnToolTipMouseEnter(object sender, EventArgs e)
{
  toolTipTimer.Start(); // Start the ToolTip display Timer
}

void OnToolTipMouseLeave(object sender, EventArgs e)
{
  toolTipTimer.Stop(); // Cancel any pending ToolTip display
  toolTip.RemoveAll();      
}
于 2013-01-12T22:15:48.260 に答える
0

次の変更で問題を解決しました。

protected override void OnMouseHover(EventArgs e) {
    var m_position = PointToClient(Control.MousePosition);
    m_toolTip.Show(Text, this, m_position.X + 10, m_position.Y, 20000);
    base.OnMouseHover(e);
}

OnMouseMove以前のオーバーライド を削除しました。

さらに、私にとってはうまくいくと思われるいくつかの設定も微調整しました。

于 2013-01-12T22:27:34.000 に答える
0

ツールチップを表示するたびに設定する必要はありません。

コントロール コンストラクターで設定する必要があります。

m_toolTip.SetToolTip(this, Text);

ツールチップの表示と非表示は、追加のコードを記述することなく自動的に行われます。

于 2013-01-12T22:35:36.700 に答える