2014-05-15 13 views
6

Ich habe ein WPF-Beispielprojekt entwickelt.Programmatisch eine QuickInfo anzeigen

Hier ist das Haupt Markup XAML des Fenster:

<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> 

Hier das Hauptfenster des Code-Behind ist ohne die Verwendung von Aussagen:

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; 
     } 
    } 
} 

Ich möchte die Quick-Info programmatisch zeigen, wenn die Taste geklickt.
Ich möchte, dass die QuickInfo über dem übergeordneten TextBlock angezeigt wird.

Die QuickInfo wird automatisch angezeigt, wenn sich der Mauszeiger über dem TextBlock befindet und während einer konstanten Zeitspanne C ungefähr 5 Sekunden entspricht.
Ich möchte, dass die QuickInfo während C angezeigt wird, wenn auf die Schaltfläche geklickt wird.

Meine Ziele werden im aktuellen Projekt nicht erreicht.
Die Quick-Info wird angezeigt, wenn die Schaltfläche geklickt wird:

enter image description here

Aber:

  • Die Quick-Info ist zu weit von seinem TextBlock- Elternteil.
  • Die Quick-Info automatisch
  • nicht

Was versteckt ich meine Ziele zu tun haben, zu erreichen?
Jede Hilfe wird sehr geschätzt.

Antwort

2

Ich habe meine Ziele erreicht.
Sheridans Antwort und Kommentare helfen mir.
Ich habe mein Beispielprojekt aktualisiert.
Der ToolTip wird jetzt direkt über dem TextBlock angezeigt, wenn auf die Schaltfläche geklickt wird.
Und die Rückrufmethode eines Timers schließt die QuickInfo nach einer konstanten Zeit von 2500 ms.

Hier ist das aktualisierte Haupt Markup XAML des Fensters:

<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> 

Hier ist das aktualisierte Hauptfenster der Code-Behind ohne die Verwendung von Aussagen:

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

Sie haben eine Reihe von Problemen. Die erste und einfachste zu beheben ist, dass Sie nur die ToolTip öffnen und nicht schließen. Sie sagte ich die Quick-Info wollen während die gleiche Menge an Zeit gezeigt werden, wenn der Knopf geklickt wird, und diese leicht die PreviewMouseDown und PreviewMouseUp Ereignisse implementiert Handhabung:

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> 

Ihr anderes Problem ist etwas komplizierter zu beheben ... es scheint mir, als ob ein Fehler in der Positionierung Ihres ToolTip enthalten sein könnte. Normalerweise, trotz was @icebat sagte, ist es ist möglich, die Position eines ToolTip unter Verwendung der ToolTip.Placement property zu ändern. Dies kann auf einen der PlacementMode Enumerations eingestellt werden.

Der Standardwert ist Mouse und dies ist die Definition von der verknüpften Seite auf MSDN:

A Postion des Popup-Steuerelement, das mit der Unterkante des Begrenzungskastens der Maus seine Oberkante ausrichtet und richtet seine linke Kante an der linken Kante der Begrenzungsbox der Maus aus. Wenn die untere Bildschirmkante das Popup verdeckt, positioniert es sich neu, um mit der oberen Kante der Bounding Box der Maus übereinzustimmen. Wenn die obere Bildschirmkante das Popup verdeckt, positioniert sich das Steuerelement selbst so, dass es an der oberen Bildschirmkante ausgerichtet ist.

Dies erklärt, warum die ToolTip weit von dem TextBlock Platzierungsziel angezeigt wird ... weil die Button und damit die Maus (beim Klicken) weit von den TextBlock ist. Wenn Sie jedoch die Eigenschaft Placement auf einen anderen Wert setzen, sollte eine große Anzahl von Positionen erreicht werden. Wenn Sie jedoch unterschiedliche Werte für die Eigenschaft Placement festlegen, wird nur ToolTip in der oberen linken Ecke des Bildschirms angezeigt.

Um diese Situation zu beheben, sollten Sie auch die ToolTip.PlacementTarget Property, wie @icebat im Kommentar korrekt angegeben, aber anscheinend nur aus dem Code. Sobald die Eigenschaft PlacementTarget festgelegt wurde, funktioniert der Eigenschaftswert Placement wie erwartet. Aus dieser gelinkten Seite:

können Sie eine Quick-Info Position durch die Placement, PlacementRectangle, Placement, Horizontaleinstellung und VerticalOffsetProperty Eigenschaften.

enter image description here

+1

Große Antwort! Ich habe "Placement" total übersehen, zusammen mit "PlacementTarget" machen sie den Trick in meinem Testprojekt. Aber ich musste 'PlacementTarget' beim Klick setzen, weil es sonst nicht richtig gesetzt wird (ToolTip ist nicht in der Baumstruktur während der Initialisierung, das ist der Grund, denke ich). – icebat

+0

@Sheridan Ich habe den Handler des PreviewMouseDown-Ereignisses der Schaltfläche und des Handlers des PreviewMouseUp-Ereignisses der Schaltfläche implementiert, wie Sie es beschreiben. Die QuickInfo wird jedoch während einiger Sekunden nicht angezeigt, wenn sich der Mauszeiger über dem TextBlock befindet. – user1139666

+0

Fügen Sie einige Haltepunkte hinzu und debuggen Sie Ihr Problem, um zu sehen, was vor sich geht. Mein Beispiel funktioniert gut, also sollte auch dein * funktionieren *. – Sheridan

Verwandte Themen