Browse Source

Implemented more control styles in XAML.

Now removed DefaultTheme so only XAML styles are taking affect.
pull/297/head
Steven Kirk 11 years ago
parent
commit
afb5e169de
  1. 15
      samples/XamlTestApplicationPcl/TabControl.paml
  2. 14
      samples/XamlTestApplicationPcl/TabItem.paml
  3. 14
      samples/XamlTestApplicationPcl/TabStrip.paml
  4. 13
      samples/XamlTestApplicationPcl/Window.paml
  5. 2
      samples/XamlTestApplicationPcl/XamlTestApp.cs
  6. 4
      samples/XamlTestApplicationPcl/XamlTestApp.paml
  7. 12
      samples/XamlTestApplicationPcl/XamlTestApplicationPcl.csproj
  8. 1
      src/Markup/Perspex.Markup.Xaml/Binding/XamlTemplateBinding.cs
  9. 2
      src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs
  10. 36
      src/Markup/Perspex.Markup.Xaml/Converters/MemberSelectorTypeConverter.cs
  11. 4
      src/Markup/Perspex.Markup.Xaml/Converters/PerspexPropertyTypeConverter.cs
  12. 2
      src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj
  13. 28
      src/Markup/Perspex.Markup.Xaml/Templates/MemberSelector.cs
  14. 11
      src/Perspex.Controls/Control.cs
  15. 2
      src/Perspex.Diagnostics/DevTools.cs
  16. 4
      src/Perspex.Diagnostics/Perspex.Diagnostics.csproj

15
samples/XamlTestApplicationPcl/TabControl.paml

@ -0,0 +1,15 @@
<Style xmlns="https://github.com/perspex" Selector="TabControl">
<Setter Property="Template">
<ControlTemplate>
<Grid RowDefinitions="Auto,*">
<TabStrip Items="{TemplateBinding Items}"
SelectedIndex="{TemplateBinding Path=SelectedIndex, Mode=TwoWay}"/>
<Carousel Items="{TemplateBinding Items}"
MemberSelector="Content"
SelectedIndex="{TemplateBinding Path=SelectedIndex}"
Transition="{TemplateBinding Transition}"
Grid.Row="1"/>
</Grid>
</ControlTemplate>
</Setter>
</Style>

14
samples/XamlTestApplicationPcl/TabItem.paml

@ -0,0 +1,14 @@
<Styles xmlns="https://github.com/perspex">
<Style Selector="TabItem">
<Setter Property="FontSize" Value="16"/>
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="Template">
<ControlTemplate>
<ContentPresenter Name="PART_HeaderPresenter" Content="{TemplateBinding Header}"/>
</ControlTemplate>
</Setter>
</Style>
<Style Selector="TabItem:selected">
<Setter Property="Foreground" Value="Black"/>
</Style>
</Styles>

14
samples/XamlTestApplicationPcl/TabStrip.paml

@ -0,0 +1,14 @@
<Styles xmlns="https://github.com/perspex">
<Style Selector="TabStrip">
<Setter Property="Template">
<ControlTemplate>
<ItemsPresenter Items="{TemplateBinding Items}"
ItemsPanel="{TemplateBinding ItemsPanel}"/>
</ControlTemplate>
</Setter>
</Style>
<Style Selector="TabStrip /template/ StackPanel">
<Setter Property="Gap" Value="16"/>
<Setter Property="Orientation" Value="Horizontal"/>
</Style>
</Styles>

13
samples/XamlTestApplicationPcl/Window.paml

@ -0,0 +1,13 @@
<Style xmlns="https://github.com/perspex" Selector="Window">
<Setter Property="FontFamily" Value="Segoe UI"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Template">
<ControlTemplate>
<Border Background="{TemplateBinding Background}">
<AdornerDecorator>
<ContentPresenter Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"/>
</AdornerDecorator>
</Border>
</ControlTemplate>
</Setter>
</Style>

2
samples/XamlTestApplicationPcl/XamlTestApp.cs

@ -12,7 +12,7 @@ namespace XamlTestApplication
{
RegisterServices();
RegisterPlatform();
Styles = new DefaultTheme();
Styles = new Perspex.Styling.Styles();
InitializeComponent();
}

4
samples/XamlTestApplicationPcl/XamlTestApp.paml

@ -5,5 +5,9 @@
<StyleInclude Source="resource://application/XamlTestApplicationPcl/XamlTestApplication.Button.paml"/>
<StyleInclude Source="resource://application/XamlTestApplicationPcl/XamlTestApplication.Carousel.paml"/>
<StyleInclude Source="resource://application/XamlTestApplicationPcl/XamlTestApplication.CheckBox.paml"/>
<StyleInclude Source="resource://application/XamlTestApplicationPcl/XamlTestApplication.TabControl.paml"/>
<StyleInclude Source="resource://application/XamlTestApplicationPcl/XamlTestApplication.TabItem.paml"/>
<StyleInclude Source="resource://application/XamlTestApplicationPcl/XamlTestApplication.TabStrip.paml"/>
<StyleInclude Source="resource://application/XamlTestApplicationPcl/XamlTestApplication.Window.paml"/>
</Application.Styles>
</Application>

12
samples/XamlTestApplicationPcl/XamlTestApplicationPcl.csproj

@ -129,10 +129,22 @@
<EmbeddedResource Include="CheckBox.paml">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Window.paml">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="TabStrip.paml">
<SubType>Designer</SubType>
</EmbeddedResource>
<None Include="packages.config" />
<EmbeddedResource Include="Button.paml">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="TabControl.paml">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="TabItem.paml">
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

1
src/Markup/Perspex.Markup.Xaml/Binding/XamlTemplateBinding.cs

@ -51,6 +51,7 @@ namespace Perspex.Markup.Xaml.Binding
}
instance.Bind(targetProperty, templatedParent.GetObservable(sourceProperty), BindingPriority.Style);
templatedParent.Bind(sourceProperty, instance.GetObservable(targetProperty), BindingPriority.Style);
}
}
}

2
src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs

@ -23,6 +23,7 @@ using Perspex.Metadata;
using Perspex.Platform;
using Perspex.Styling;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
namespace Perspex.Markup.Xaml.Context
{
@ -97,6 +98,7 @@ namespace Perspex.Markup.Xaml.Context
new TypeConverterRegistration(typeof(Geometry), new GeometryTypeConverter()),
new TypeConverterRegistration(typeof(GridLength), new GridLengthTypeConverter()),
new TypeConverterRegistration(typeof(KeyGesture), new KeyGestureConverter()),
new TypeConverterRegistration(typeof(IMemberSelector), new MemberSelectorTypeConverter()),
new TypeConverterRegistration(typeof(Point), new PointTypeConverter()),
new TypeConverterRegistration(typeof(PerspexProperty), new PerspexPropertyTypeConverter()),
new TypeConverterRegistration(typeof(RelativePoint), new RelativePointTypeConverter()),

36
src/Markup/Perspex.Markup.Xaml/Converters/MemberSelectorTypeConverter.cs

@ -0,0 +1,36 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Globalization;
using OmniXaml.TypeConversion;
using Perspex.Markup.Xaml.Templates;
namespace Perspex.Markup.Xaml.Converters
{
public class MemberSelectorTypeConverter : ITypeConverter
{
public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType)
{
return false;
}
public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value)
{
return new MemberSelector
{
MemberName = (string)value,
};
}
public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)
{
throw new NotImplementedException();
}
}
}

4
src/Markup/Perspex.Markup.Xaml/Converters/PerspexPropertyTypeConverter.cs

@ -4,6 +4,7 @@
using System;
using System.Globalization;
using System.Linq;
using System.Runtime.CompilerServices;
using OmniXaml;
using OmniXaml.TypeConversion;
using Perspex.Styling;
@ -54,6 +55,9 @@ namespace Perspex.Markup.Xaml.Converters
}
}
// Ensure the type's static ctor has been run.
RuntimeHelpers.RunClassConstructor(type.TypeHandle);
// First look for non-attached property on the type and then look for an attached property.
var property = PerspexPropertyRegistry.Instance.FindRegistered(type, s);

2
src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj

@ -45,6 +45,7 @@
<Compile Include="Binding\XamlBindingDefinition.cs" />
<Compile Include="Context\PerspexAttachableXamlMember.cs" />
<Compile Include="Context\PerspexContentPropertyProvider.cs" />
<Compile Include="Converters\MemberSelectorTypeConverter.cs" />
<Compile Include="Converters\ColorTypeConverter.cs" />
<Compile Include="Converters\GeometryTypeConverter.cs" />
<Compile Include="Converters\KeyGestureConverter.cs" />
@ -236,6 +237,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Styling\StyleInclude.cs" />
<Compile Include="Templates\ControlTemplate.cs" />
<Compile Include="Templates\MemberSelector.cs" />
<Compile Include="Templates\TemplateLoader.cs" />
<Compile Include="Templates\Template.cs" />
<Compile Include="Templates\TemplateContent.cs" />

28
src/Markup/Perspex.Markup.Xaml/Templates/MemberSelector.cs

@ -0,0 +1,28 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Reflection;
using Perspex.Controls.Templates;
namespace Perspex.Markup.Xaml.Templates
{
public class MemberSelector : IMemberSelector
{
public string MemberName { get; set; }
public object Select(object o)
{
// TODO: Handle nested property paths, changing values etc.
var property = o.GetType().GetRuntimeProperty(MemberName);
if (property != null)
{
return property.GetValue(o);
}
else
{
return null;
}
}
}
}

11
src/Perspex.Controls/Control.cs

@ -301,12 +301,15 @@ namespace Perspex.Controls
{
var old = Parent;
if (old != null && parent != null)
if (parent != old)
{
throw new InvalidOperationException("The Control already has a parent.");
}
if (old != null && parent != null)
{
throw new InvalidOperationException("The Control already has a parent.");
}
SetAndRaise(ParentProperty, ref _parent, (IControl)parent);
SetAndRaise(ParentProperty, ref _parent, (IControl)parent);
}
}
/// <summary>

2
src/Perspex.Diagnostics/DevTools.cs

@ -6,6 +6,7 @@ using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Diagnostics.ViewModels;
using Perspex.Input;
using Perspex.Themes.Default;
using ReactiveUI;
namespace Perspex.Diagnostics
@ -60,6 +61,7 @@ namespace Perspex.Diagnostics
private void InitializeComponent()
{
DataTemplates.Add(new ViewLocator<ReactiveObject>());
Styles.Add(new DefaultTheme());
Child = new Grid
{

4
src/Perspex.Diagnostics/Perspex.Diagnostics.csproj

@ -75,6 +75,10 @@
<Project>{F1BAA01A-F176-4C6A-B39D-5B40BB1B148F}</Project>
<Name>Perspex.Styling</Name>
</ProjectReference>
<ProjectReference Include="..\Perspex.Themes.Default\Perspex.Themes.Default.csproj">
<Project>{3e10a5fa-e8da-48b1-ad44-6a5b6cb7750f}</Project>
<Name>Perspex.Themes.Default</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\Shared\SharedAssemblyInfo.cs">

Loading…
Cancel
Save