레이블에 대한 도구 설명이 있고 사용자가 마우스를 다른 컨트롤로 이동할 때까지 열려 있기를 원합니다.
툴팁에서 다음 속성을 시도했습니다.
StaysOpen="True"
과
ToolTipService.ShowDuration = "60000"
그러나 두 경우 모두 툴팁은 정확히 5 초 동안 만 표시됩니다.
이 값이 무시되는 이유는 무엇입니까?
답변
이 코드를 초기화 섹션에 넣으십시오.
ToolTipService.ShowDurationProperty.OverrideMetadata(
typeof(DependencyObject), new FrameworkPropertyMetadata(Int32.MaxValue));
답변
TooltipService.ShowDuration
작동하지만 다음과 같이 도구 설명이있는 개체에 설정해야합니다.
<Label ToolTipService.ShowDuration="12000" Name="lblShowTooltip" Content="Shows tooltip">
<Label.ToolTip>
<ToolTip>
<TextBlock>Hello world!</TextBlock>
</ToolTip>
</Label.ToolTip>
</Label>
이 디자인은 다른 컨트롤에서 다른 시간 제한이있는 동일한 도구 설명을 허용하기 때문에 선택되었다고 말하고 싶습니다.
답변
이것은 또한 오늘 밤 나를 미치게 만들었다. ToolTip
문제를 처리하기 위해 하위 클래스를 만들었습니다 . 나를 위해 .NET 4.0에서ToolTip.StaysOpen
속성은 “정말”이 열려 있지 않습니다.
아래 클래스 ToolTipEx.IsReallyOpen
에서 property 대신 new property를 사용하십시오 ToolTip.IsOpen
. 원하는 컨트롤을 얻을 수 있습니다. Debug.Print()
호출을 통해 디버거 출력 창에서 this.IsOpen = false
호출 횟수를 확인할 수 있습니다 ! 너무 많이 StaysOpen
, 아니면 내가 말해야 "StaysOpen"
합니까? 즐겨.
public class ToolTipEx : ToolTip
{
static ToolTipEx()
{
IsReallyOpenProperty =
DependencyProperty.Register(
"IsReallyOpen",
typeof(bool),
typeof(ToolTipEx),
new FrameworkPropertyMetadata(
defaultValue: false,
flags: FrameworkPropertyMetadataOptions.None,
propertyChangedCallback: StaticOnIsReallyOpenedChanged));
}
public static readonly DependencyProperty IsReallyOpenProperty;
protected static void StaticOnIsReallyOpenedChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e)
{
ToolTipEx self = (ToolTipEx)o;
self.OnIsReallyOpenedChanged((bool)e.OldValue, (bool)e.NewValue);
}
protected void OnIsReallyOpenedChanged(bool oldValue, bool newValue)
{
this.IsOpen = newValue;
}
public bool IsReallyOpen
{
get
{
bool b = (bool)this.GetValue(IsReallyOpenProperty);
return b;
}
set { this.SetValue(IsReallyOpenProperty, value); }
}
protected override void OnClosed(RoutedEventArgs e)
{
System.Diagnostics.Debug.Print(String.Format(
"OnClosed: IsReallyOpen: {0}, StaysOpen: {1}", this.IsReallyOpen, this.StaysOpen));
if (this.IsReallyOpen && this.StaysOpen)
{
e.Handled = true;
// We cannot set this.IsOpen directly here. Instead, send an event asynchronously.
// DispatcherPriority.Send is the highest priority possible.
Dispatcher.CurrentDispatcher.BeginInvoke(
(Action)(() => this.IsOpen = true),
DispatcherPriority.Send);
}
else
{
base.OnClosed(e);
}
}
}
작은 폭언 : Microsoft는 왜 DependencyProperty
속성 (getters / setters)을 가상으로 만들어서 하위 클래스의 변경 사항을 수락 / 거부 / 조정할 수 없었 습니까? 아니면을 virtual OnXYZPropertyChanged
각각의 모든에 대해DependencyProperty
? 으.
—편집하다—
위의 솔루션은 XAML 편집기에서 이상하게 보입니다. 도구 설명이 항상 표시되어 Visual Studio에서 일부 텍스트를 차단합니다!
이 문제를 해결하는 더 좋은 방법은 다음과 같습니다.
일부 XAML :
<!-- Need to add this at top of your XAML file:
xmlns:System="clr-namespace:System;assembly=mscorlib"
-->
<ToolTip StaysOpen="True" Placement="Bottom" HorizontalOffset="10"
ToolTipService.InitialShowDelay="0" ToolTipService.BetweenShowDelay="0"
ToolTipService.ShowDuration="{x:Static Member=System:Int32.MaxValue}"
>This is my tooltip text.</ToolTip>
일부 코드 :
// Alternatively, you can attach an event listener to FrameworkElement.Loaded
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
// Be gentle here: If someone creates a (future) subclass or changes your control template,
// you might not have tooltip anymore.
ToolTip toolTip = this.ToolTip as ToolTip;
if (null != toolTip)
{
// If I don't set this explicitly, placement is strange.
toolTip.PlacementTarget = this;
toolTip.Closed += new RoutedEventHandler(OnToolTipClosed);
}
}
protected void OnToolTipClosed(object sender, RoutedEventArgs e)
{
// You may want to add additional focus-related tests here.
if (this.IsKeyboardFocusWithin)
{
// We cannot set this.IsOpen directly here. Instead, send an event asynchronously.
// DispatcherPriority.Send is the highest priority possible.
Dispatcher.CurrentDispatcher.BeginInvoke(
(Action)delegate
{
// Again: Be gentle when using this.ToolTip.
ToolTip toolTip = this.ToolTip as ToolTip;
if (null != toolTip)
{
toolTip.IsOpen = true;
}
},
DispatcherPriority.Send);
}
}
결론 : 클래스 ToolTip
와 ContextMenu
. 모두 “서비스”와 같은 클래스가 ToolTipService
와 ContextMenuService
, 특정 속성을 관리하고, 모두 사용하는 Popup
디스플레이 중 “비밀”부모 컨트롤로합니다. 마지막으로 웹의 모든 XAML 도구 설명 예제는 클래스를 ToolTip
직접 사용하지 않습니다 . 대신 StackPanel
with TextBlock
s 를 포함합니다 . 당신이 말하는 것 : “흠 …”
답변
Tooltip은 미리 정의 된 UI 표준 방식으로 사용하고 있다고 가정하므로 Tooltip 대신 Popup을 사용하고 싶을 것입니다.
StaysOpen이 작동하지 않는 이유는 모르겠지만 ShowDuration은 MSDN에 문서화 된대로 작동합니다. 도구 설명이 표시 될 때 표시되는 시간입니다. 차이를 확인하려면 소량 (예 : 500msec)으로 설정하십시오.
귀하의 경우 트릭은 “마지막 호 버드 컨트롤”상태를 유지하는 것입니다.하지만 일단 Popup을 사용하는 경우 배치 대상과 콘텐츠를 동적으로 (수동으로 또는 바인딩을 통해) 변경하는 것은 매우 간단해야합니다. 여러 개를 사용하는 경우 마지막으로 보이는 팝업을 숨 깁니다.
창 크기 조정 및 이동 (팝업은 컨테이너와 함께 이동하지 않음)과 관련하여 팝업과 관련된 몇 가지 문제가 있으므로 동작을 조정하는 동안이를 염두에 둘 수도 있습니다. 이 링크 보기 를 참조하십시오.
HTH.
답변
의 특정 요소 만 Window
유효 ToolTip
기간을 무기한 으로 지정하려면 해당 요소에 대해 Style
in을 정의 할 수 있습니다 Window.Resources
. 여기에 있습니다 Style
에 대한 Button
그 같은있다 ToolTip
:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
...>
...
<Window.Resources>
<Style x:Key="ButtonToolTipIndefinate" TargetType="{x:Type Button}">
<Setter Property="ToolTipService.ShowDuration"
Value="{x:Static Member=sys:Int32.MaxValue}"/>
</Style>
...
</Window.Resources>
...
<Button Style="{DynamicResource ButtonToolTipIndefinate}"
ToolTip="This should stay open"/>
<Button ToolTip="This Should disappear after the default time.">
...
에 추가 Style.Resources
하여 표시 Style
되는 모양을 변경할 수도 있습니다 ToolTip
. 예를 들면 다음과 같습니다.
<Style x:Key="ButtonToolTipTransparentIndefinate" TargetType="{x:Type Button}">
<Style.Resources>
<Style x:Key="{x:Type ToolTip}" TargetType="{x:Type ToolTip}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="HasDropShadow" Value="False"/>
</Style>
</Style.Resources>
<Setter Property="ToolTipService.ShowDuration"
Value="{x:Static Member=sys:Int32.MaxValue}"/>
</Style>
참고 :이 작업을 수행 할 때 BasedOn
에 Style
다른 정상적인 내 사용자 지정 컨트롤의 버전에 대해 정의 그래서 모든 것을 ToolTip
적용 할 수있다.
답변
전날 WPF 툴팁과 씨름하고있었습니다. 저절로 나타나고 사라지는 것을 막을 수없는 것 같아서 결국 Opened
이벤트 를 처리했습니다 . 예를 들어, 콘텐츠가없는 경우 열리지 않도록하고 싶었으므로 Opened
이벤트를 처리 한 다음 이렇게했습니다.
tooltip.IsOpen = (tooltip.Content != null);
해킹이지만 작동했습니다.
아마도 유사하게 Closed
이벤트를 처리하고 다시 열도록 지시하여 계속 표시 할 수 있습니다.
답변
완전성을 위해 : 코드에서 다음과 같이 보입니다.
ToolTipService.SetShowDuration(element, 60000);