From 9dd936cff737e3f8cbb2b7a69418effd63fc5478 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 23 Sep 2015 18:29:35 +0200 Subject: [PATCH 1/3] Trying to make Setter.Value depend on Property. But something is breaking in OmniXaml. --- .../Context/PerspexWiringContext.cs | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs b/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs index b75b07b289..cee6e3689d 100644 --- a/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs +++ b/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs @@ -21,23 +21,33 @@ using Perspex.Metadata; using Perspex.Platform; using Perspex.Styling; using Splat; +using System; namespace Perspex.Markup.Xaml.Context { - public class PerspexWiringContext : IWiringContext + public class PerspexWiringContext : WiringContext { - private readonly WiringContext _context; private const string PerspexNs = "https://github.com/perspex"; public PerspexWiringContext(ITypeFactory typeFactory) + : this(typeFactory, new TypeFeatureProvider(GetContentPropertyProvider(), GetConverterProvider())) { - var featureProvider = new TypeFeatureProvider(GetContentPropertyProvider(), GetConverterProvider()); + } + public PerspexWiringContext(ITypeFactory typeFactory, TypeFeatureProvider featureProvider) + : base(CreateTypeContext(typeFactory, featureProvider), featureProvider) + { + } + + private static ITypeContext CreateTypeContext(ITypeFactory typeFactory, TypeFeatureProvider featureProvider) + { var xamlNamespaceRegistry = CreateXamlNamespaceRegistry(); var perspexPropertyBinder = new PerspexPropertyBinder(featureProvider.ConverterProvider); - var xamlTypeRepository = new PerspexTypeRepository(xamlNamespaceRegistry, typeFactory, featureProvider, perspexPropertyBinder); - var typeContext = new TypeContext(xamlTypeRepository, xamlNamespaceRegistry, typeFactory); - _context = new WiringContext(typeContext, featureProvider); + var typeRepository = new PerspexTypeRepository(xamlNamespaceRegistry, typeFactory, featureProvider, perspexPropertyBinder); + + typeRepository.RegisterMetadata(new Metadata().WithMemberDependency(setter => setter.Value, setter => setter.Property)); + + return new TypeContext(typeRepository, xamlNamespaceRegistry, typeFactory); } private static XamlNamespaceRegistry CreateXamlNamespaceRegistry() @@ -113,9 +123,5 @@ namespace Perspex.Markup.Xaml.Context return contentPropertyProvider; } - - public ITypeContext TypeContext => _context.TypeContext; - - public ITypeFeatureProvider FeatureProvider => _context.FeatureProvider; } } \ No newline at end of file From b3af361686ae59879659f7fa3ad3192c8a633614 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 24 Sep 2015 00:06:04 +0200 Subject: [PATCH 2/3] Still trying to get property dependencies working. SelectedIndex isn't being set. --- samples/XamlTestApplication/Views/MainWindow.paml | 15 ++++++++++----- .../Context/PerspexWiringContext.cs | 7 ++++++- src/Markup/Perspex.Markup.Xaml/OmniXAML | 2 +- src/Perspex.Controls/ItemsControl.cs | 2 ++ .../Primitives/SelectingItemsControl.cs | 2 ++ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/samples/XamlTestApplication/Views/MainWindow.paml b/samples/XamlTestApplication/Views/MainWindow.paml index 2c4525eb13..a85c949f69 100644 --- a/samples/XamlTestApplication/Views/MainWindow.paml +++ b/samples/XamlTestApplication/Views/MainWindow.paml @@ -2,8 +2,13 @@ xmlns="https://github.com/perspex" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Perspex Test Application" Height="350" Width="525" SizeToContent="WidthAndHeight" > - - + + + Hello + World + + + \ No newline at end of file diff --git a/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs b/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs index cee6e3689d..fb8c6e5836 100644 --- a/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs +++ b/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs @@ -22,6 +22,7 @@ using Perspex.Platform; using Perspex.Styling; using Splat; using System; +using Perspex.Controls.Primitives; namespace Perspex.Markup.Xaml.Context { @@ -45,7 +46,11 @@ namespace Perspex.Markup.Xaml.Context var perspexPropertyBinder = new PerspexPropertyBinder(featureProvider.ConverterProvider); var typeRepository = new PerspexTypeRepository(xamlNamespaceRegistry, typeFactory, featureProvider, perspexPropertyBinder); - typeRepository.RegisterMetadata(new Metadata().WithMemberDependency(setter => setter.Value, setter => setter.Property)); + typeRepository.RegisterMetadata(new Metadata().WithMemberDependency(x => x.Value, x => x.Property)); + typeRepository.RegisterMetadata( + new Metadata() + .WithMemberDependency(x => x.SelectedIndex, x => x.Items) + .WithMemberDependency(x => x.SelectedItem, x => x.Items)); return new TypeContext(typeRepository, xamlNamespaceRegistry, typeFactory); } diff --git a/src/Markup/Perspex.Markup.Xaml/OmniXAML b/src/Markup/Perspex.Markup.Xaml/OmniXAML index 7b13ebcde0..1461be589a 160000 --- a/src/Markup/Perspex.Markup.Xaml/OmniXAML +++ b/src/Markup/Perspex.Markup.Xaml/OmniXAML @@ -1 +1 @@ -Subproject commit 7b13ebcde030df9f8d538917e57b3a34ea9edf32 +Subproject commit 1461be589a5d39d378fd177648c61a780271c742 diff --git a/src/Perspex.Controls/ItemsControl.cs b/src/Perspex.Controls/ItemsControl.cs index 83f86eba78..cdbf883d95 100644 --- a/src/Perspex.Controls/ItemsControl.cs +++ b/src/Perspex.Controls/ItemsControl.cs @@ -140,6 +140,8 @@ namespace Perspex.Controls /// The event args. protected virtual void ItemsChanged(PerspexPropertyChangedEventArgs e) { + System.Diagnostics.Debug.WriteLine($"{this.GetType().Name} set items"); + var incc = e.OldValue as INotifyCollectionChanged; if (incc != null) diff --git a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs index 371a3a96a9..811cc7bb3e 100644 --- a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs @@ -299,6 +299,8 @@ namespace Perspex.Controls.Primitives /// The event args. private void SelectedIndexChanged(PerspexPropertyChangedEventArgs e) { + System.Diagnostics.Debug.WriteLine($"{this.GetType().Name} set selected index"); + var index = (int)e.OldValue; if (index != -1) From d143b7fcee59d3abff9ceef9b13ffaba5eaaf2da Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 29 Sep 2015 12:30:14 +0200 Subject: [PATCH 3/3] Make initial DropDown selection work Fixes #110 --- samples/XamlTestApplication/Views/MainWindow.paml | 10 ++-------- src/Markup/Perspex.Markup.Xaml/OmniXAML | 2 +- .../Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj | 1 + src/Perspex.Controls/DropDown.cs | 2 ++ src/Perspex.Controls/TextBlock.cs | 6 +++--- src/Perspex.SceneGraph/Media/FormattedText.cs | 4 ++++ 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/samples/XamlTestApplication/Views/MainWindow.paml b/samples/XamlTestApplication/Views/MainWindow.paml index a85c949f69..a58c1929ca 100644 --- a/samples/XamlTestApplication/Views/MainWindow.paml +++ b/samples/XamlTestApplication/Views/MainWindow.paml @@ -2,13 +2,7 @@ xmlns="https://github.com/perspex" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Perspex Test Application" Height="350" Width="525" SizeToContent="WidthAndHeight" > - - - Hello - World - - - + \ No newline at end of file diff --git a/src/Markup/Perspex.Markup.Xaml/OmniXAML b/src/Markup/Perspex.Markup.Xaml/OmniXAML index 1461be589a..49e6ec001f 160000 --- a/src/Markup/Perspex.Markup.Xaml/OmniXAML +++ b/src/Markup/Perspex.Markup.Xaml/OmniXAML @@ -1 +1 @@ -Subproject commit 1461be589a5d39d378fd177648c61a780271c742 +Subproject commit 49e6ec001f5873cf2290e0bc1f6f06ca9b9cf808 diff --git a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj index 6da087ac13..fea6a7f307 100644 --- a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj +++ b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj @@ -57,6 +57,7 @@ + diff --git a/src/Perspex.Controls/DropDown.cs b/src/Perspex.Controls/DropDown.cs index dbfd03ea83..6ff5b5f343 100644 --- a/src/Perspex.Controls/DropDown.cs +++ b/src/Perspex.Controls/DropDown.cs @@ -140,6 +140,8 @@ namespace Perspex.Controls if (control != null) { + control.Measure(Size.Infinity); + SelectionBoxItem = new Rectangle { Width = control.DesiredSize.Width, diff --git a/src/Perspex.Controls/TextBlock.cs b/src/Perspex.Controls/TextBlock.cs index 463173cbc9..c9959ebeb3 100644 --- a/src/Perspex.Controls/TextBlock.cs +++ b/src/Perspex.Controls/TextBlock.cs @@ -235,9 +235,9 @@ namespace Perspex.Controls protected virtual FormattedText CreateFormattedText(Size constraint) { var result = new FormattedText( - Text, - FontFamily, - FontSize, + Text ?? string.Empty, + FontFamily ?? "Ariel", + FontSize > 0 ? FontSize : 12, FontStyle, TextAlignment, FontWeight); diff --git a/src/Perspex.SceneGraph/Media/FormattedText.cs b/src/Perspex.SceneGraph/Media/FormattedText.cs index 0d8b4eb298..2c78a234de 100644 --- a/src/Perspex.SceneGraph/Media/FormattedText.cs +++ b/src/Perspex.SceneGraph/Media/FormattedText.cs @@ -30,6 +30,10 @@ namespace Perspex.Media TextAlignment textAlignment, FontWeight fontWeight) { + Contract.Requires(text != null); + Contract.Requires(fontFamilyName != null); + Contract.Requires(fontSize > 0); + Text = text; FontFamilyName = fontFamilyName; FontSize = fontSize;