2014-05-15 51 views
6

我開發了一個WPF示例項目。以編程方式顯示工具提示

這裏是主窗口的XAML標記:

<Window x:Class="ToolTipSample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     WindowState="Maximized"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <Button Click="OnButtonClick">Show ToolTip</Button> 

     <StatusBar Grid.Row="2"> 
      <StatusBarItem> 
       <TextBlock Text="TextBlock With ToolTip"> 
        <TextBlock.ToolTip> 
         <ToolTip x:Name="m_toolTip"> 
          ToolTip 
         </ToolTip> 
        </TextBlock.ToolTip> 
       </TextBlock> 
      </StatusBarItem> 
     </StatusBar> 
    </Grid> 
</Window> 

這裏是主窗口的代碼隱藏而不使用語句:

namespace ToolTipSample 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void OnButtonClick(object p_sender, RoutedEventArgs p_args) 
     { 
      m_toolTip.IsOpen = true; 
     } 
    } 
} 

我想以編程方式顯示工具提示按鈕時,點擊。
我想要在其TextBlock父級上方顯示工具提示。

當鼠標光標位於TextBlock上並且在持續時間C近似等於5秒時,工具提示會自動顯示。
我希望在單擊按鈕時在C期間顯示工具提示。

我的目標沒有在當前的項目中實現。
單擊該按鈕時,工具提示顯示:

enter image description here

但是:

  • 工具提示是從它的TextBlock父太遠。
  • 工具提示不會自動隱藏

什麼我必須做的,以實現我的目標?
任何幫助將不勝感激。

回答

2

我已經實現了我的目標。
謝里登的回答和評論幫助我。
我已更新我的示例項目。
單擊按鈕時,ToolTip現在顯示在TextBlock的正上方。
而定時器的回調方法會在等待2500毫秒的恆定時間後關閉工具提示。

這裏是更新的主窗口的XAML標記:

<Window x:Class="ToolTipSample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     WindowState="Maximized"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <Button Click="OnButtonClick">Show ToolTip</Button> 

     <StatusBar Grid.Row="2"> 
      <StatusBarItem> 
       <TextBlock Width="900" /> 
      </StatusBarItem> 
      <StatusBarItem> 
       <TextBlock x:Name="m_statusMessage" Text="TextBlock With ToolTip" ToolTipService.ShowDuration="30000"> 
        <TextBlock.ToolTip> 
         <ToolTip x:Name="m_toolTip" Placement="Top"> 
          <TextBlock> 
           ToolTip ToolTipToolTipToolTipToolTipToo lTipToolTipToolTipT oolTipToolTipT 
           <LineBreak /> 
           oolTipToolTi pToolTipToo lTipToolTipToolTipToolTipToolTipTo olTipToolTipToolTipTool 
           <LineBreak /> 
           TipToo lTipToolTipToolTipToo lTipToolTipTo olTipToolTip 
          </TextBlock> 
         </ToolTip> 
        </TextBlock.ToolTip> 
       </TextBlock> 
      </StatusBarItem> 
     </StatusBar> 
    </Grid> 
</Window> 

這裏是更新的主窗口的代碼隱藏而不使用語句:

namespace ToolTipSample 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private Timer m_toolTipClosingTimer; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      m_toolTipClosingTimer = new Timer(ToolTipClosingCallBack, null, Timeout.Infinite, Timeout.Infinite); 
     } 

     private void OnButtonClick(object p_sender, RoutedEventArgs p_args) 
     { 
      m_toolTip.PlacementTarget = m_statusMessage; 
      m_toolTip.IsOpen = true; 
      m_toolTipClosingTimer.Change(2500, Timeout.Infinite); 
     } 

     private void ToolTipClosingCallBack(object p_useless) 
     { 
      Dispatcher.Invoke(() => 
       { 
        m_toolTip.IsOpen = false; 
       }); 
     } 
    } 
} 
7

你有一些問題。第一個也是最簡單的解決方法是您只打開並且不關閉ToolTip。你說我想同樣多的時間內,以顯示工具提示的按鈕被點擊時,這是很容易實現的處理PreviewMouseDownPreviewMouseUp事件:

private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    m_toolTip.PlacementTarget = PlacementTarget; 
    m_toolTip.IsOpen = true; 
} 

private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    m_toolTip.IsOpen = false; 
} 

...

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Button PreviewMouseDown="Button_PreviewMouseDown" 
     PreviewMouseUp="Button_PreviewMouseUp">Show ToolTip</Button> 
    <StatusBar Grid.Row="2"> 
     <StatusBarItem> 
      <TextBlock Name="PlacementTarget" Text="TextBlock With ToolTip"> 
       <TextBlock.ToolTip> 
        <ToolTip x:Name="m_toolTip" Placement="Top" HorizontalOffset="50" 
         VerticalOffset="-5">ToolTip</ToolTip> 
       </TextBlock.ToolTip> 
      </TextBlock> 
     </StatusBarItem> 
    </StatusBar> 
</Grid> 

您的其他問題稍微修復得更加棘手......在我看來,好像您的ToolTip定位中可能存在一些錯誤。通常情況下,儘管@icebat表示,可能使用ToolTip.Placement property來更改ToolTip的位置。這可以設置爲PlacementMode Enumerations之一。

的默認值是Mouse,這是從鏈接的頁面MSDN上的定義:

該對齊其上邊緣與鼠標的邊界框的下邊緣和彈出控制的現在的位置將其左邊緣與鼠標邊框的左邊緣對齊。如果較低的屏幕邊緣遮蓋了Popup,它將自行重新定位以與鼠標邊界框的上邊緣對齊。如果屏幕上邊緣遮擋了Popup,則控件會重新定位以與屏幕上邊緣對齊。

這就解釋了爲什麼ToolTipTextBlock放置目標顯示遠......因爲Button,因此鼠標(點擊時)遠離TextBlock。但是,通過將Placement屬性設置爲另一個值可以實現各種各樣的職位。但是,僅設置Placement屬性的不同值,將只在屏幕的左上角顯示ToolTip

要解決這種情況,您還應該將ToolTip.PlacementTarget Property設置爲註釋中正確指出的@icebat,但顯然只能使用代碼。一旦設置了PlacementTarget屬性,Placement屬性值按預期工作。從此鏈接頁面:

您可以通過設置PlacementTarget,PlacementRectangle,Placement,Horizo​​ntalOffset和VerticalOffsetProperty屬性來定位工具提示。

enter image description here

+1

偉大的答案!我完全忽略了'Placement'和'PlacementTarget',他們在我的測試項目中做了訣竅。但是我必須在點擊時設置PlacementTarget,否則它不會正確設置(在init中,ToolTip不在樹中,這是我猜測的原因)。 – icebat

+0

@Sheridan我已經實現了Button的PreviewMouseDown事件的處理程序和Button的PreviewMouseUp事件的處理程序,就像您describeb一樣。但是,當鼠標光標位於TextBlock上時,工具提示在幾秒鐘內不顯示。 – user1139666

+0

添加一些斷點並調試您的問題以查看正在發生的事情。我的例子工作得很好,所以你的*應該*也能夠正常工作。 – Sheridan

相關問題