2017-09-06 5 views
1

Betrachten Sie den folgenden einfachen Code.WPF-Tooltip auf Element startet die ursprüngliche Verzögerung nicht erneut

Wenn ich mit der Maus über ein Element fahre, wartet es 1 Sekunde und zeigt dann die QuickInfo wie erwartet an. Wenn ich jedoch die Maus zu einem anderen Objekt bewege, ohne die Liste zu verlassen, wird der Tooltip einfach auf den neuen Objektnamen aktualisiert, ohne dass eine Show-Verzögerung erneut ausgelöst wird. Ist das normales Verhalten?

Ich brauche, damit der Tooltip verschwindet, wenn man die Maus über die Liste bewegt, wenn ein neues Objekt eingegeben und eine Show-Verzögerung erneut ausgelöst wird. Irgendwelche Vorschläge?

MainWindow.xaml

<Window x:Class="WpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:lcl="clr-namespace:WpfApplication" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Items}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate DataType="lcl:Item"> 
        <TextBlock 
         Text="{Binding Name}" 
         HorizontalAlignment="Stretch" 
         ToolTipService.InitialShowDelay="1000" 
         ToolTipService.BetweenShowDelay="1000" 
         ToolTipService.HasDropShadow="True" 
         ToolTipService.HorizontalOffset="5" 
         ToolTipService.VerticalOffset="5"> 
         <TextBlock.ToolTip> 
          <TextBlock Text="{Binding Name}" /> 
         </TextBlock.ToolTip> 
        </TextBlock> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

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

      _Items.Add(new Item() { Name = "First" }); 
      _Items.Add(new Item() { Name = "Second" }); 
      _Items.Add(new Item() { Name = "Third" }); 
     } 

     public Collection<Item> _Items = new Collection<Item>(); 
     public Collection<Item> Items 
     { 
      get { return _Items; } 
     } 
    } 

    public class Item 
    { 
     public string Name 
     { 
      get; 
      set; 
     } 
    } 
} 

Antwort

1

Ich habe Angst, dass Sie falsch verstanden, wie die BetweenShowDelay Eigenschaft funktioniert. Wie Sie here lesen:

Im [...] Beispiel wird die InitialShowDelay Eigenschaft auf eine Sekunde eingestellt (1000 Millisekunden) und die BetweenShowDelay wird für die Tooltips zu zwei Sekunden (2000 Millisekunden) eingestellt der beiden Ellipsen-Steuerelemente. Wenn Sie die QuickInfo für eine der Ellipsen anzeigen und dann den Mauszeiger innerhalb von zwei Sekunden auf eine andere Ellipse bewegen und dort pausieren, wird die QuickInfo der zweiten Ellipse sofort angezeigt.

Werfen Sie einen Blick auf das Beispiel im obigen Link für weitere Details.

Also - wie Sie sehen können - ist das, das Sie beschreiben, das normale Verhalten.

+0

Sill i das Verhalten richtig zu machen kann nicht scheinen. Egal, ob ich BetweenShowDelay auf 0, 1000 oder 5000 setze, wenn ich das erste Element übergebe, das in der QuickInfo angezeigt wird, wird beim Wechsel zum nächsten Element sofort die QuickInfo angezeigt, anstatt die Wartezeit erneut zu triggern. Was ist der Sinn eines initialshowdelay, wenn es nur einmal verwendet wird? auch wenn ich 3 Tooltip-Objekte habe? – user1464603

+0

Tut mir leid, @ user1464603, aber wenn ich 'ToolTipService.BetweenShowDelay =" 0 "', die 'ToolTip' funktioniert wie erwartet (dh wenn ich die Maus über ein anderes' Listbox' Element bewegen, benötigt es 'ToolTipService.InitialShowDelay' vorher Die neue 'ToolTip' erscheint. Es scheint, ich kann dein Problem nicht reproduzieren. –

+0

Ich habe versucht, das Zielframework zu ändern, ohne Erfolg. Ich habe versucht mit toolTipService.BetweenShowDelay = "0" und das ToolTipService.BetweenShowDelay vollständig zu entfernen, und wenn ich die Maus zu einem neuen Element bewege, erscheint die Tooltip sofort. Ich muss die Listbox mit der Maus verlassen und wieder rein, wenn ich den Initialshowdelay erneut auslösen möchte. Das ist komisch. – user1464603

0

Dies scheint wie für mich erwartet zu arbeiten, das heißt Sie die ToolTipService.BetweenShowDelay Eigenschaft nicht festgelegt:

<TextBlock 
    Text="{Binding Name}" 
    HorizontalAlignment="Stretch" 
    ToolTipService.InitialShowDelay="5000" 
    ToolTipService.HasDropShadow="True" 
    ToolTipService.HorizontalOffset="5" 
    ToolTipService.VerticalOffset="5"> 
    <TextBlock.ToolTip> 
     <TextBlock Text="{Binding Name}" /> 
    </TextBlock.ToolTip> 
</TextBlock> 
Verwandte Themen