2013-01-02 29 views
2

我遇到了一個我無法想象的問題。設置和刪除WPF中的工具提示

我有一個WPF窗口,是POS應用程序中使用的物理鍵盤的表示形式。每個物理按鈕都由一個WPF按鈕表示。用戶將點擊一個按鈕,打開另一個帶有控件的窗口來更改分配給它的功能。當用戶懸停在按鈕上時,會顯示一個工具提示,顯示當前分配的功能。

設置新的設置後,我需要刷新工具提示。新的工具提示顯示正確,但舊的提示不會刪除。如果我使用Button.ToolTip = null,則所有工具提示消失。如果我使用Button.ToolTip = String.Empty,我會得到一個空白的提示。如果沒有分配給按鈕的功能,我不希望顯示任何工具提示。

如何在沒有任何內容顯示時簡單地刪除/停用工具提示?

loadToolTips()在父窗口中的Window_Activated事件期間觸發。

代碼:

private void loadToolTips() 
     { 
      JPOSDB db = new JPOSDB(); 
      SqlDataReader dr = default(SqlDataReader); 
      StringBuilder tt = new StringBuilder(); 

      dr = db.getDR("SELECT KeyName, FunctionName, Parameter1, Parameter2 FROM KeyboardSettings JOIN KeyboardFunctions ON KeySetting = FunctionID WHERE KeyboardID = " + runTime.keyboardID); 

      while (dr.Read()) 
      { 
       foreach (Control ctrl in grdButtons.Children) 
       { 
        if (ctrl.GetType() == typeof(Button)) 
        { 
         Button button = new Button(); 
         button = (Button)ctrl; 
         button.ToolTip = null; <--- Causes all tool tips to disappear 

         if (button.Name.ToString() == dr[0].ToString()) 
         { 
          tt.Clear(); 
          tt.Append("Function: " + dr[1].ToString()); 

          if (dr[2].ToString().Length > 0) 
          { 
           tt.Append(Environment.NewLine); 
           tt.Append("Value: " + dr[2].ToString()); 
          } 

          if (dr[3].ToString().Length > 0) 
          { 
           tt.Append(Environment.NewLine); 
           tt.Append("Name: " + dr[3].ToString()); 
          } 

          button.ToolTip = tt.ToString();      
         } 
        } 
       } 
      } 

      dr.Close(); 
     } 
+0

你是什麼意思「*如果我使用Button.ToolTip = null,所有的工具提示消失*」?對我來說,將它設置爲null不會影響其他的。這不是你尋求的效果嗎?我可以發佈我正在使用的示例代碼。 – Mir

+0

如果將按鈕分配給數據庫中的某個功能,則工具提示會列出該功能,否則應該沒有工具提示。如果我使用Tooltip = null,那麼即使按鈕已分配,也沒有工具提示。單步執行代碼顯示button.ToolTip = tt.ToString()被執行,但工具提示不顯示。 – Kerberos42

回答

2

您可以使用ClearValue清除Depencency ToolTipProperty。看看這是否有幫助。

Button button = (Button)ctrl; 
button.ClearValue(Button.ToolTipProperty); 
+0

這與使用'Button.ToolTip = null;'具有相同的效果 - 沒有工具提示出現。謝謝你的建議,它是一個很好的知道。 – Kerberos42

+0

@ Kerberos42必須有我丟失的東西,你是否說它正在清除每個按鈕的所有工具提示?如果是這樣,問題出現在你的foreach循環中,因爲ClearValue只會清除該特定按鈕的工具提示。 –

+0

是的,它清除它的特定按鈕,但它遍歷所有按鈕並清除它們。但是,在.ClearValue方法之後,如果按鈕名稱與數據庫中的某個字段匹配,則會設置.ToolTip屬性。在發生這種情況後,toolTip屬性仍然爲空。 – Kerberos42

0

我不知道我理解的問題,但你可以用這條線:

var s = tt.ToString(); 
button.ToolTip = string.IsNullOrEmpty(s) ? null : s; 

如果這不回答你的問題,請留下評論,我會刪除它。