4 changed files with 300 additions and 108 deletions
@ -1,22 +1,34 @@ |
|||
<UserControl xmlns="https://github.com/avaloniaui"> |
|||
<StackPanel Orientation="Vertical" Gap="4"> |
|||
<TextBlock Classes="h1">ToolTip</TextBlock> |
|||
<TextBlock Classes="h2">A control which pops up a hint when a control is hovered</TextBlock> |
|||
<StackPanel Orientation="Vertical" |
|||
Gap="4"> |
|||
<TextBlock Classes="h1">ToolTip</TextBlock> |
|||
<TextBlock Classes="h2">A control which pops up a hint when a control is hovered</TextBlock> |
|||
|
|||
<StackPanel Orientation="Horizontal" |
|||
Margin="0,16,0,0" |
|||
HorizontalAlignment="Center" |
|||
Gap="16"> |
|||
<Border Background="{StyleResource ThemeAccentBrush}" |
|||
Padding="48,48,48,48"> |
|||
<ToolTip.Tip> |
|||
<StackPanel> |
|||
<TextBlock Classes="h1">ToolTip</TextBlock> |
|||
<TextBlock Classes="h2">A control which pops up a hint when a control is hovered</TextBlock> |
|||
</StackPanel> |
|||
</ToolTip.Tip> |
|||
<TextBlock>Hover Here</TextBlock> |
|||
</Border> |
|||
<StackPanel Orientation="Horizontal" |
|||
Margin="0,16,0,0" |
|||
HorizontalAlignment="Center" |
|||
Gap="16"> |
|||
<CheckBox IsChecked="{Binding ElementName=Border, Path=(ToolTip.IsOpen)}" |
|||
Content="Show ToolTip" /> |
|||
<Border Name="Border" |
|||
Background="{StyleResource ThemeAccentBrush}" |
|||
Margin="5" |
|||
Padding="50" |
|||
ToolTip.Placement="Bottom"> |
|||
<ToolTip.Tip> |
|||
<StackPanel> |
|||
<TextBlock Classes="h1">ToolTip</TextBlock> |
|||
<TextBlock Classes="h2">A control which pops up a hint when a control is hovered</TextBlock> |
|||
</StackPanel> |
|||
</ToolTip.Tip> |
|||
<TextBlock>Hover Here</TextBlock> |
|||
</Border> |
|||
<Border Background="{StyleResource ThemeAccentBrush}" |
|||
Margin="5" |
|||
Padding="50" |
|||
ToolTip.Tip="Another tip"> |
|||
<TextBlock>And Here</TextBlock> |
|||
</Border> |
|||
</StackPanel> |
|||
</StackPanel> |
|||
</StackPanel> |
|||
</UserControl> |
|||
@ -0,0 +1,98 @@ |
|||
using System; |
|||
using Avalonia.Input; |
|||
using Avalonia.Threading; |
|||
|
|||
namespace Avalonia.Controls |
|||
{ |
|||
/// <summary>
|
|||
/// Handeles <see cref="ToolTip"/> interaction with controls.
|
|||
/// </summary>
|
|||
internal sealed class ToolTipService |
|||
{ |
|||
public static ToolTipService Instance { get; } = new ToolTipService(); |
|||
|
|||
private DispatcherTimer _timer; |
|||
|
|||
private ToolTipService() { } |
|||
|
|||
/// <summary>
|
|||
/// called when the <see cref="ToolTip.TipProperty"/> property changes on a control.
|
|||
/// </summary>
|
|||
/// <param name="e">The event args.</param>
|
|||
internal void TipChanged(AvaloniaPropertyChangedEventArgs e) |
|||
{ |
|||
var control = (Control)e.Sender; |
|||
|
|||
if (e.OldValue != null) |
|||
{ |
|||
control.PointerEnter -= ControlPointerEnter; |
|||
control.PointerLeave -= ControlPointerLeave; |
|||
} |
|||
|
|||
if (e.NewValue != null) |
|||
{ |
|||
control.PointerEnter += ControlPointerEnter; |
|||
control.PointerLeave += ControlPointerLeave; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Called when the pointer enters a control with an attached tooltip.
|
|||
/// </summary>
|
|||
/// <param name="sender">The event sender.</param>
|
|||
/// <param name="e">The event args.</param>
|
|||
private void ControlPointerEnter(object sender, PointerEventArgs e) |
|||
{ |
|||
StopTimer(); |
|||
|
|||
var control = (Control)sender; |
|||
var showDelay = ToolTip.GetShowDelay(control); |
|||
if (showDelay == 0) |
|||
{ |
|||
Open(control); |
|||
} |
|||
else |
|||
{ |
|||
StartShowTimer(showDelay, control); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Called when the pointer leaves a control with an attached tooltip.
|
|||
/// </summary>
|
|||
/// <param name="sender">The event sender.</param>
|
|||
/// <param name="e">The event args.</param>
|
|||
private void ControlPointerLeave(object sender, PointerEventArgs e) |
|||
{ |
|||
var control = (Control)sender; |
|||
Close(control); |
|||
} |
|||
|
|||
private void StartShowTimer(int showDelay, Control control) |
|||
{ |
|||
_timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(showDelay) }; |
|||
_timer.Tick += (o, e) => Open(control); |
|||
_timer.Start(); |
|||
} |
|||
|
|||
private void Open(Control control) |
|||
{ |
|||
StopTimer(); |
|||
|
|||
ToolTip.SetIsOpen(control, true); |
|||
} |
|||
|
|||
private void Close(Control control) |
|||
{ |
|||
StopTimer(); |
|||
|
|||
ToolTip.SetIsOpen(control, false); |
|||
} |
|||
|
|||
private void StopTimer() |
|||
{ |
|||
_timer?.Stop(); |
|||
_timer = null; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue