Browse Source

Make focus adorner styleable.

pull/39/head
Steven Kirk 11 years ago
parent
commit
c1b1339286
  1. 27
      Perspex.Controls/AdornerTemplate.cs
  2. 27
      Perspex.Controls/Control.cs
  3. 1
      Perspex.Controls/Perspex.Controls.csproj
  4. 11
      Perspex.Styling/Selectors.cs
  5. 1
      Perspex.Themes.Default/DefaultTheme.cs
  6. 42
      Perspex.Themes.Default/FocusAdornerStyle.cs
  7. 1
      Perspex.Themes.Default/Perspex.Themes.Default.csproj

27
Perspex.Controls/AdornerTemplate.cs

@ -0,0 +1,27 @@
// -----------------------------------------------------------------------
// <copyright file="AdornerTemplate.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
using System;
public class AdornerTemplate
{
private Func<Control> build;
public AdornerTemplate(Func<Control> build)
{
Contract.Requires<NullReferenceException>(build != null);
this.build = build;
}
public Control Build()
{
return this.build();
}
}
}

27
Perspex.Controls/Control.cs

@ -25,6 +25,9 @@ namespace Perspex.Controls
public static readonly PerspexProperty<object> DataContextProperty =
PerspexProperty.Register<Control, object>("DataContext", inherits: true);
public static readonly PerspexProperty<AdornerTemplate> FocusAdornerProperty =
PerspexProperty.Register<Control, AdornerTemplate>("FocusAdorner");
public static readonly PerspexProperty<Control> ParentProperty =
PerspexProperty.Register<Control, Control>("Parent");
@ -43,7 +46,7 @@ namespace Perspex.Controls
private DataTemplates dataTemplates;
private Rectangle focusAdorner;
private Control focusAdorner;
private string id;
@ -199,15 +202,21 @@ namespace Perspex.Controls
if (adornerLayer != null)
{
this.focusAdorner = new Rectangle
if (this.focusAdorner == null)
{
var template = this.GetValue(FocusAdornerProperty);
if (template != null)
{
this.focusAdorner = template.Build();
}
}
if (this.focusAdorner != null)
{
Stroke = Brushes.Black,
StrokeThickness = 1,
StrokeDashArray = new PerspexList<double>(1, 2),
Margin = new Thickness(3),
};
AdornerLayer.SetAdornedElement(this.focusAdorner, this);
adornerLayer.Children.Add(this.focusAdorner);
AdornerLayer.SetAdornedElement(this.focusAdorner, this);
adornerLayer.Children.Add(this.focusAdorner);
}
}
}
}

1
Perspex.Controls/Perspex.Controls.csproj

@ -36,6 +36,7 @@
<ItemGroup>
<Compile Include="Border.cs" />
<Compile Include="Button.cs" />
<Compile Include="AdornerTemplate.cs" />
<Compile Include="DropDown.cs" />
<Compile Include="IContentControl.cs" />
<Compile Include="IItemsPanel.cs" />

11
Perspex.Styling/Selectors.cs

@ -75,6 +75,17 @@ namespace Perspex.Styling
};
}
public static Selector Is<T>(this Selector previous) where T : IStyleable
{
Contract.Requires<ArgumentNullException>(previous != null);
return new Selector(previous)
{
GetObservable = control => Observable.Return(control is T),
SelectorString = ":is(" + typeof(T).Name + ")",
};
}
public static Selector OfType(this Selector previous, Type type)
{
Contract.Requires<ArgumentNullException>(previous != null);

1
Perspex.Themes.Default/DefaultTheme.cs

@ -16,6 +16,7 @@ namespace Perspex.Themes.Default
this.Add(new CheckBoxStyle());
this.Add(new ContentControlStyle());
this.Add(new DropDownStyle());
this.Add(new FocusAdornerStyle());
this.Add(new GridSplitterStyle());
this.Add(new ItemsControlStyle());
this.Add(new ListBoxStyle());

42
Perspex.Themes.Default/FocusAdornerStyle.cs

@ -0,0 +1,42 @@
// -----------------------------------------------------------------------
// <copyright file="FocusAdornerStyle.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Themes.Default
{
using Perspex.Collections;
using Perspex.Controls;
using Perspex.Controls.Shapes;
using Perspex.Media;
using Perspex.Styling;
public class FocusAdornerStyle : Styles
{
public FocusAdornerStyle()
{
this.AddRange(new[]
{
new Style(x => x.Is<Control>())
{
Setters = new[]
{
new Setter(Control.FocusAdornerProperty, new AdornerTemplate(this.Template)),
},
},
});
}
private Control Template()
{
return new Rectangle
{
Stroke = Brushes.Black,
StrokeThickness = 1,
StrokeDashArray = new PerspexList<double>(1, 2),
Margin = new Thickness(3),
};
}
}
}

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

@ -70,6 +70,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="FocusAdornerStyle.cs" />
<Compile Include="DropDownStyle.cs" />
<Compile Include="RadioButtonStyle.cs" />
<Compile Include="ToggleButtonStyle.cs" />

Loading…
Cancel
Save