Mam podpowiedź dotyczącą etykiety i chcę, aby pozostawała otwarta, dopóki użytkownik nie przeniesie myszy do innej kontrolki.
Wypróbowałem następujące właściwości w podpowiedzi:
StaysOpen="True"
i
ToolTipService.ShowDuration = "60000"
Ale w obu przypadkach podpowiedź jest wyświetlana tylko przez dokładnie 5 sekund.
Dlaczego te wartości są ignorowane?
ShowDuration
własność, że to jest coś30,000
. Cokolwiek większego niż to i domyślnie wróci5000
.ToolTipService.ShowDuration="60000"
. Domyślnie nie wracał do5000
.ToolTipService.ShowDuration
właściwość na dowolną wartość> = 0 (do Int32.MaxValue), jednak podpowiedź nie pozostanie otwarta dla tej długości.Odpowiedzi:
Po prostu umieść ten kod w sekcji inicjalizacji.
źródło
new FrameworkPropertyMetadata("Top")
nie działa.TooltipService.ShowDuration
działa, ale musisz ustawić go na obiekcie posiadającym etykietkę, na przykład:Powiedziałbym, że ten projekt został wybrany, ponieważ pozwala na takie same podpowiedzi z różnymi limitami czasu na różnych kontrolkach.
źródło
ToolTip
bezpośrednio, bez jawności<ToolTip>
, co może uprościć wiązanie.To też doprowadzało mnie do szału. Stworzyłem
ToolTip
podklasę do obsługi tego problemu. Dla mnie w .NET 4.0ToolTip.StaysOpen
obiekt nie jest „naprawdę” pozostaje otwarty.W klasie poniżej użyj nowej właściwości
ToolTipEx.IsReallyOpen
zamiast propertyToolTip.IsOpen
. Uzyskasz kontrolę, jaką chcesz. PoprzezDebug.Print()
rozmowy, można oglądać w oknie Output debuggera, jak wiele razythis.IsOpen = false
nazywa! To tyleStaysOpen
, czy powinienem powiedzieć"StaysOpen"
? Cieszyć się.Mały rant: dlaczego firma Microsoft nie uczyniła
DependencyProperty
właściwości (pobierających / ustawiających) wirtualnych, abyśmy mogli akceptować / odrzucać / dostosowywać zmiany w podklasach? Albo zrobićvirtual OnXYZPropertyChanged
dla każdegoDependencyProperty
? Fuj.---Edytować---
Moje rozwiązanie powyżej wygląda dziwnie w edytorze XAML - podpowiedź zawsze się wyświetla, blokując część tekstu w Visual Studio!
Oto lepszy sposób rozwiązania tego problemu:
Niektóre XAML:
Jakiś kod:
Wniosek: Coś jest innego w przypadku klas
ToolTip
iContextMenu
. Obie mają klasy „usług”, takie jakToolTipService
iContextMenuService
, które zarządzają określonymi właściwościami i obie używająPopup
jako „tajnej” kontroli nadrzędnej podczas wyświetlania. Wreszcie zauważyłem, że WSZYSTKIE przykłady etykiet narzędzi XAML w Internecie nie używają klasyToolTip
bezpośrednio. Zamiast tego osadzają aStackPanel
zTextBlock
s. Rzeczy, które sprawiają, że mówisz: „hmmm ...”źródło
Prawdopodobnie chcesz użyć Popup zamiast Tooltip, ponieważ Tooltip zakłada, że używasz go zgodnie z predefiniowanymi standardami interfejsu użytkownika.
Nie jestem pewien, dlaczego StaysOpen nie działa, ale ShowDuration działa zgodnie z dokumentacją w MSDN - jest to czas, przez który podpowiedź jest wyświetlana, GDY jest wyświetlana. Ustaw małą wartość (np. 500 ms), aby zobaczyć różnicę.
Sztuczka w twoim przypadku polega na utrzymaniu stanu „ostatniej aktywowanej kontroli”, ale kiedy już to zrobisz, zmiana miejsca docelowego i zawartości dynamicznie (ręcznie lub przez powiązanie) powinna być dość trywialna, jeśli używasz jednego Popup, lub ukrywanie ostatniego widocznego Popup, jeśli używasz wielu.
Istnieje kilka problemów z wyskakującymi okienkami, jeśli chodzi o zmianę rozmiaru i przesuwanie okna (wyskakujące okienka nie poruszają się w / w kontenerach), więc możesz również mieć to na uwadze podczas dostosowywania zachowania. Zobacz ten link, aby uzyskać więcej informacji.
HTH.
źródło
Jeśli chcesz określić, że tylko niektóre elementy w twoim
Window
mają efektywnie nieokreślony czasToolTip
trwania, możesz zdefiniowaćStyle
w swoimWindow.Resources
dla tych elementów. OtoStyle
for,Button
który ma takiToolTip
:Można również dodać,
Style.Resources
abyStyle
zmienić wyglądToolTip
pokazanych na nim pokazów, na przykład:Uwaga: Kiedy to zrobiłem, użyłem również
BasedOn
w programie,Style
więc wszystko inne zdefiniowane dla wersji mojej kontrolki niestandardowej z normalnymToolTip
zostanie zastosowane.źródło
Zmagałem się z WPF Tooltip dopiero niedawno. Wydaje się, że nie da się powstrzymać tego przed pojawieniem się i zniknięciem, więc w końcu postanowiłem zająć się tym
Opened
wydarzeniem. Na przykład chciałem zatrzymać otwieranie go, chyba że ma jakąś treść, więc obsłużyłemOpened
zdarzenie, a potem zrobiłem to:To hack, ale zadziałał.
Prawdopodobnie mógłbyś w podobny sposób obsłużyć
Closed
zdarzenie i nakazać mu ponowne otwarcie, dzięki czemu jest widoczne.źródło
Gwoli ścisłości: w kodzie wygląda to tak:
źródło
Ponadto, jeśli kiedykolwiek zechcesz umieścić jakąkolwiek inną kontrolę w swojej podpowiedzi, nie będzie można jej skupić, ponieważ sama podpowiedź może uzyskać fokus. Tak jak powiedział Micahtan, najlepszym strzałem jest Popup.
źródło
Naprawiono mój problem za pomocą tego samego kodu.
ToolTipService.ShowDurationProperty.OverrideMetadata (typeof (DependencyObject), nowy FrameworkPropertyMetadata (Int32.MaxValue));
źródło
To działa dla mnie. Skopiuj ten wiersz do konstruktora klasy.
źródło