2011-11-11 21 views
4

我的控制,其中,每個可編輯控制(複選框,組合框等)具有相關聯的標籤的網格。我想分享標籤與其控件之間的工具提示。我該如何給一組控件提供一個工具提示,並讓它看起來順利?

現在這是我通過使用BindableToolTips完成的事情:我只是在我的XAML資源中定義工具提示,然後在標籤和控件上單獨設置相同的工具提示對象。

代碼:

<TextBlock Grid.Row="0" 
      Grid.Column="0" 
      ToolTipService.PlacementTarget="{Binding ElementName=ExampleControl}" 
      Utilities:ToolTipServiceExtended.BindableToolTip="{StaticResource ExampleControlTT}" 
      Text="Example label:" /> 
<CheckBox Grid.Row="0" 
      Grid.Column="1" 
      x:Name="ExampleControl" 
      Utilities:ToolTipServiceExtended.BindableToolTip="{StaticResource ExampleControlTT}" 
      Content="Example" /> 

不幸的是,這並不能使它看起來順暢......當鼠標從標籤移動到控件,或者從控制到標籤,工具提示消失,重新開放,看起來閃爍。即使標籤和控件之間沒有間隙,也會發生這種情況,並且看起來不太好。這顯然是因爲它們是兩個獨立的工具提示。

我想以某種組的標籤及其相關的控制,並有提示出現在該單組;這樣,當鼠標在兩者之間移動時,它可以流暢地出現並且不閃爍。不幸的是,我正在努力做到這一點。這裏有一些事情我已經試過......應用

與提示空的TextBlock和ColumnSpan = 2。

不幸的是,這樣可以防止接收來自鼠標點擊控制,將TextBlock覆蓋起來看不見。我試圖將IsHitTestVisible設置爲false,但是這樣可以防止鼠標接收事件,從而停止顯示工具提示。如果我可以讓鼠標點擊空白的TextBlock,但TextBlock仍然會獲得鼠標懸停的事件,那麼它就是完美的。

代碼:針對所述一個標籤

<TextBlock Grid.Row="0" 
      Grid.Column="0" 
      Text="Example label:" /> 
<CheckBox Grid.Row="0" 
      Grid.Column="1" 
      x:Name="ExampleControl" 
      Content="Example" /> 
<TextBlock Grid.Row="0" 
      Grid.Column="0" 
      Grid.ColumnSpan="2" 
      ToolTipService.PlacementTarget="{Binding ElementName=ExampleControl}" 
      Utilities:ToolTipServiceExtended.BindableToolTip="{StaticResource ExampleControlTT}" /> 

嵌套格子具體地和一個控制。

此方法似乎工作:只要鼠標位於內部網格上的任何位置,鼠標事件仍會成功傳遞給控件,​​就會出現工具提示。不幸的是,這有三個問題:

  1. 這是非常混亂的,因爲我需要的嵌套網格爲每一個標籤/控制組合。
  2. 的「自動」列寬不再考慮其他控件的寬度在所述外網格,因爲這當然是一個單獨的網格。
  3. 它似乎忽略提示佈局設置,這是安置=權,並與PlacementTarget作爲具體的控制。相反,工具提示出現在內部網格下方。

如果最後兩個問題可以解決,那麼這將是一個可接受的解決方案。

代碼:

<Grid Grid.Row="0" 
      Grid.Column="0" 
      Grid.ColumnSpan="2" 
      ToolTipService.PlacementTarget="{Binding ElementName=ExampleControl}" 
      Utilities:ToolTipServiceExtended.BindableToolTip="{StaticResource ExampleControlTT}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <TextBlock Grid.Row="0" 
       Grid.Column="0" 
       Text="Example label:" /> 
    <CheckBox Grid.Row="0" 
       Grid.Column="1" 
       x:Name="ExampleControl" 
       Content="Example" /> 

</Grid> 

沒有任何人有一個很好的解決這個問題的任何想法?我只想讓我的工具提示出現在標籤和相關控件上,就好像它們是一個元素一樣,而鼠標在它們之間移動時不會閃爍。就這樣。

+0

我通常不喜歡嵌套網格,並發現佈局更平滑與DockPanels和StackPanels的組合。 –

回答

1

只需將控件包裝在內容展示器中,然後將工具提示附加到該內容。

<Window x:Class="StackOverflowWPF.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"> 
    <ContentPresenter ToolTip="Blah"> 
     <ContentPresenter.Content> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="Example label:"/> 
       <CheckBox Grid.Column="1" x:Name="ExampleControl" Content="Example" /> 
      </Grid> 
     </ContentPresenter.Content> 
    </ContentPresenter> 
</Window> 
+0

非常感謝您的回答!但我不確定這與我的問題提到的「嵌套網格專門用於一個標籤和一個控件」解決方案有何不同。對於每個標籤/控件組合,這仍然需要一個網格(用於我的佈局),那麼添加的ContentPresenter會實現什麼功能?它仍然會有相同的問題(自動列寬不在網格之間共享等),不是嗎?感謝您的回覆。 :) –

+0

@Chris - 這是我的理解,網格綁定無法正常工作。爲了清晰/連續性,我將網格留在原地,但您可以使用任何需要的替換網格,例如堆疊面板或停靠面板。我不確定我可以在沒有更多上下文的情況下解決您的佈局問題。 –

相關問題