2013-07-02 14 views
6

Le descrizioni dei comandi su TabItem di TabControl non sono solo generate nell'intestazione di TabItem, ma anche su qualsiasi contenuto di TabItem che non imposta esplicitamente la propria descrizione.ToolTip su TabItem: Mostra sull'intestazione, ma non sul contenuto

Ecco un esempio, che riproduce il problema:

<Window x:Class="TestToolTipsOnTabControl.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow"> 
    <Grid> 
     <TabControl> 
      <TabItem Header="Tab1" 
        ToolTip="Tooltip of tab1"> 
       <StackPanel> 
        <TextBlock Text="Content of tab1 with its own tooltip" 
           ToolTip="Tooltip on content of tab1"/> 
        <TextBlock Text="more content of tab1" /> 
       </StackPanel> 
      </TabItem> 
      <TabItem Header="Tab2" 
        ToolTipService.ToolTip="Tooltip of tab2"> 
       <StackPanel> 
        <TextBlock Text="Content of tab2 with its own tooltip" 
           ToolTipService.ToolTip="Tooltip on content of tab2"/> 
        <TextBlock Text="more content of tab2" /> 
       </StackPanel> 
      </TabItem> 
      <TabItem Header="Tab3"> 
       <StackPanel> 
        <TextBlock Text="Content of tab3" /> 
        <TextBlock Text="more content of tab3" /> 
       </StackPanel> 
      </TabItem> 
     </TabControl> 
    </Grid> 
</Window> 

Spostando il puntatore del mouse sul "più contenuti di tab1" testo visualizzerà la descrizione comandi, che mi piacerebbe solo visualizzati sul l'intestazione TabItem.

Esiste un modo per che la descrizione comandi venga visualizzata solo nell'intestazione TabItem, ma da nessun'altra parte?

risposta

7

Esiste un modo per che la descrizione comandi venga visualizzata solo nell'intestazione TabItem, ma da nessun'altra parte?

Si dovrebbe applicare solo Tooltip alla non Header tutta TabItem quindi modificarla in:

  <TabItem> 
       <TabItem.Header> 
        <TextBlock Text="Tab1" 
        ToolTip="Tooltip of tab1"/> 
       </TabItem.Header> 
       <StackPanel> 
        <TextBlock Text="Content of tab1 with its own tooltip" 
           ToolTip="Tooltip on content of tab1"/> 
        <TextBlock Text="more content of tab1" /> 
       </StackPanel> 
      </TabItem> 
+0

Grazie mille. Questa è sicuramente la strada da percorrere. La mia applicazione effettiva è molto più complessa dell'esempio che ho postato qui: sto impostando la descrizione per mezzo di uno stile, che produce diverse descrizioni a seconda se TabItem è abilitato o disabilitato, per cui ho dovuto includere un 'ToolTipService.ShowOnDisabled = "True" nel Propietary ControlTemplate per i TabItems, ecc ... Sono così confuso riguardo il pasticcio nel mio codice, che mi è sfuggito l'ovvio.Ora sto applicando lo stile su TextBlock usato come intestazione e tutto funziona correttamente. – axeloide

1

Aggiungere il pezzo di sotto di codice per le TextBlocks

ToolTip = "", ToolTipSevice. ShowDuration = "0"

+1

Bel tentativo, ma c'è una descrizione utensile vuota alla volta. –

+0

Grazie. Ma l'applicazione reale ha un sacco di contenuti sul TabItems, la maggior parte dei quali sono UserControls distribuiti anche altrove. Quindi questo sarebbe molto complicato da applicare a tutti loro. – axeloide

0

In alternativa, posso offrire è questo: creato uno Style per ToolTip con zero Width e Height:

<Style x:Key="NullToolTip" TargetType="{x:Type ToolTip}"> 
    <Setter Property="Width" Value="0" /> 
    <Setter Property="Height" Value="0" /> 
    <Setter Property="Content" Value="{x:Null}" /> 
</Style> 

Quando creato ToolTip con questo Style e collocato nella Resources:

<ToolTip x:Key="NoToolTip" Style="{StaticResource NullToolTip}" /> 

e assegnare per controllare che vogliono spegnere la ToolTip:

<TabItem Header="Tab1" ToolTip="Tooltip of tab1"> 
    <StackPanel> 
     <TextBlock Text="Content of tab1 with its own tooltip" ToolTip="Tooltip on content of tab1"/> 

     <TextBlock Text="more content of tab1" ToolTipService.ToolTip="{StaticResource NoToolTip}" /> 
    </StackPanel> 
</TabItem> 

Note : Il problema simile si verifica quando si utilizza il ToolTip per TreeViewItem. I suoi figli ereditano il genitore ToolTip.

+0

Grazie. Ma l'applicazione reale ha un sacco di contenuti sul TabItems, la maggior parte dei quali sono UserControls distribuiti anche altrove. Quindi questo sarebbe molto complicato da applicare a tutti loro. – axeloide

0

Solo nel caso qualcuno è in esecuzione in questo problema quando si creano le schede in modo dinamico, il seguente codice ha fatto la magia:

 TabItem tabItem = new TabItem(); 
     var stackPanel = new StackPanel(); 

     var stackPanelToolTip = new System.Windows.Controls.ToolTip(); 
     stackPanelToolTip.Content = "ToolTip content"; 
     stackPanel.ToolTip = (stackPanelToolTip); 

     tabItem.Header = stackPanel; 

Quindi la chiave qui è stato quello di aggiungere il tooltip all'intestazione scheda, ma non per l'elemento tab (aggiungendolo all'intestazione significa che il tooltip sarà visibile solo quando il mouse passa con il mouse sulla scheda).

0

questo funziona per me quando si aggiungono TabItems dinamicamente:

TabItem nt = new TabItem 
string _newTabItemText = "xxxx" // Dynamic header text 
string _newTabItemTooltip = "xxxx Tooltip" // Dynamic tooltip text 
string _newTabItemName = "xxxx" // tabItem name to reference the tab item in code ie XAML x:name = "xxxx" 
{ 
    Header = new TextBlock() { Text = _newTabItemText, ToolTip = _newTabItemTooltip }, 
    Name = _newTabItemName, 
    Width = 108 
}; 
Problemi correlati