Browse Source

Added basic tooltip control.

Can be attached to any control using an attached property.
pull/58/head
Steven Kirk 12 years ago
parent
commit
1d8f4714ff
  1. 1
      Perspex.Controls/Perspex.Controls.csproj
  2. 102
      Perspex.Controls/ToolTip.cs
  3. 4
      Perspex.Input/MouseDevice.cs
  4. 1
      Perspex.Themes.Default/DefaultTheme.cs
  5. 1
      Perspex.Themes.Default/Perspex.Themes.Default.csproj
  6. 51
      Perspex.Themes.Default/ToolTipStyle.cs
  7. 1
      TestApplication/Program.cs
  8. 14
      Windows/Perspex.Win32/Input/WindowsMouseDevice.cs

1
Perspex.Controls/Perspex.Controls.csproj

@ -95,6 +95,7 @@
<Compile Include="Primitives\Thumb.cs" />
<Compile Include="RequestBringIntoViewEventArgs.cs" />
<Compile Include="Shapes\Ellipse.cs" />
<Compile Include="ToolTip.cs" />
<Compile Include="UserControl.cs" />
<Compile Include="Templates\TemplateExtensions.cs" />
<Compile Include="TextWrapping.cs" />

102
Perspex.Controls/ToolTip.cs

@ -0,0 +1,102 @@
// -----------------------------------------------------------------------
// <copyright file="ToolTip.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
using System;
using System.Reactive;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using Perspex.Input;
using Perspex.Threading;
using Perspex.VisualTree;
public class ToolTip : ContentControl
{
public static readonly PerspexProperty<object> TipProperty =
PerspexProperty.RegisterAttached<ToolTip, Control, object>("Tip");
private static PopupRoot popup;
private static Control current;
private static Subject<Control> show = new Subject<Control>();
static ToolTip()
{
TipProperty.Changed.Subscribe(TipChanged);
show.Throttle(TimeSpan.FromSeconds(0.5), PerspexScheduler.Instance).Subscribe(ShowToolTip);
}
public static object GetTip(Control element)
{
return element.GetValue(TipProperty);
}
public static void SetTip(Control element, object value)
{
element.SetValue(TipProperty, value);
}
private static void TipChanged(PerspexPropertyChangedEventArgs 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;
}
}
private static void ShowToolTip(Control control)
{
if (control != null)
{
if (popup == null)
{
popup = new PopupRoot
{
Content = new ToolTip(),
};
}
var cp = MouseDevice.Instance.GetPosition(control);
var position = control.PointToScreen(cp) + new Vector(0, 22);
popup.Parent = control;
((ToolTip)popup.Content).Content = GetTip(control);
popup.SetPosition(position);
popup.Show();
current = control;
}
}
private static void ControlPointerEnter(object sender, PointerEventArgs e)
{
var control = (Control)sender;
show.OnNext(control);
}
private static void ControlPointerLeave(object sender, PointerEventArgs e)
{
var control = (Control)sender;
if (control == current)
{
popup.Hide();
show.OnNext(null);
}
}
}
}

4
Perspex.Input/MouseDevice.cs

@ -63,7 +63,7 @@ namespace Perspex.Input
public Point GetPosition(IVisual relativeTo)
{
Point p = this.GetClientPosition();
Point p = this.Position;
IVisual v = relativeTo;
while (v != null)
@ -75,8 +75,6 @@ namespace Perspex.Input
return p;
}
protected abstract Point GetClientPosition();
private void ProcessRawEvent(RawMouseEventArgs e)
{
var mouse = (IMouseDevice)e.Device;

1
Perspex.Themes.Default/DefaultTheme.cs

@ -32,6 +32,7 @@ namespace Perspex.Themes.Default
this.Add(new TabStripStyle());
this.Add(new TextBoxStyle());
this.Add(new ToggleButtonStyle());
this.Add(new ToolTipStyle());
this.Add(new TreeViewStyle());
this.Add(new TreeViewItemStyle());
this.Add(new WindowStyle());

1
Perspex.Themes.Default/Perspex.Themes.Default.csproj

@ -71,6 +71,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="ToolTipStyle.cs" />
<Compile Include="FocusAdornerStyle.cs" />
<Compile Include="DropDownStyle.cs" />
<Compile Include="DeckStyle.cs" />

51
Perspex.Themes.Default/ToolTipStyle.cs

@ -0,0 +1,51 @@
// -----------------------------------------------------------------------
// <copyright file="ToolTipStyle.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Themes.Default
{
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Media;
using Perspex.Styling;
using System.Linq;
public class ToolTipStyle : Styles
{
public ToolTipStyle()
{
this.AddRange(new[]
{
new Style(x => x.OfType<ToolTip>())
{
Setters = new[]
{
new Setter(ToolTip.TemplateProperty, ControlTemplate.Create<ToolTip>(this.Template)),
new Setter(ToolTip.BackgroundProperty, new SolidColorBrush(0xffffffe1)),
new Setter(ToolTip.BorderBrushProperty, Brushes.Gray),
new Setter(ToolTip.BorderThicknessProperty, 1.0),
new Setter(ToolTip.PaddingProperty, new Thickness(4, 2)),
},
},
});
}
private Control Template(ToolTip control)
{
return new Border
{
[~Border.BackgroundProperty] = control[~ToolTip.BackgroundProperty],
[~Border.BorderBrushProperty] = control[~ToolTip.BorderBrushProperty],
[~Border.BorderThicknessProperty] = control[~ToolTip.BorderThicknessProperty],
[~Border.PaddingProperty] = control[~ToolTip.PaddingProperty],
Content = new ContentPresenter
{
Name = "contentPresenter",
[~ContentPresenter.ContentProperty] = control[~ToolTip.ContentProperty],
}
};
}
}
}

1
TestApplication/Program.cs

@ -214,6 +214,7 @@ namespace TestApplication
{
Content = "Button",
Command = showDialog,
[ToolTip.TipProperty] = "Hello World!",
}),
new Button
{

14
Windows/Perspex.Win32/Input/WindowsMouseDevice.cs

@ -26,12 +26,6 @@ namespace Perspex.Win32.Input
set;
}
public new Point Position
{
get { return base.Position; }
internal set { base.Position = value; }
}
public override void Capture(IInputElement control)
{
base.Capture(control);
@ -45,13 +39,5 @@ namespace Perspex.Win32.Input
UnmanagedMethods.ReleaseCapture();
}
}
protected override Point GetClientPosition()
{
UnmanagedMethods.POINT p;
UnmanagedMethods.GetCursorPos(out p);
UnmanagedMethods.ScreenToClient(this.CurrentWindow.Handle.Handle, ref p);
return new Point(p.X, p.Y);
}
}
}
Loading…
Cancel
Save