diff --git a/samples/TestApplication/Program.cs b/samples/TestApplication/Program.cs index bfbb8a17ce..90bb76905d 100644 --- a/samples/TestApplication/Program.cs +++ b/samples/TestApplication/Program.cs @@ -138,6 +138,7 @@ namespace TestApplication container.Classes.Add(":container"); + DevTools.Attach(window); window.Show(); Application.Current.Run(window); } @@ -340,8 +341,11 @@ namespace TestApplication Foreground = SolidColorBrush.Parse("#727272"), Margin = new Thickness(0, 0, 0, 10) }, - new TextBox { Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", Width = 200 }, - new TextBox { AcceptsReturn = true, TextWrapping = TextWrapping.Wrap, Width = 200, Height = 150, Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est." }, + + new TextBox { Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", Width = 200}, + new TextBox { Width = 200, Watermark="Watermark"}, + new TextBox { Width = 200, Watermark="Floating Watermark", UseFloatingWatermark = true }, + new TextBox { AcceptsReturn = true, TextWrapping = TextWrapping.Wrap, Width = 200, Height = 150, Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est." }, new TextBlock { Margin = new Thickness(0, 40, 0, 0), diff --git a/samples/XamlTestApplication/Views/MainWindow.paml b/samples/XamlTestApplication/Views/MainWindow.paml index 0f37faa54c..0794d15aff 100644 --- a/samples/XamlTestApplication/Views/MainWindow.paml +++ b/samples/XamlTestApplication/Views/MainWindow.paml @@ -2,7 +2,6 @@ xmlns="https://github.com/perspex" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Perspex Test Application" Height="350" Width="525" SizeToContent="WidthAndHeight" > - @@ -49,7 +48,7 @@ - + @@ -63,7 +62,7 @@ - + diff --git a/src/Gtk/Perspex.Gtk/WindowImpl.cs b/src/Gtk/Perspex.Gtk/WindowImpl.cs index 1faab58bc2..1914207d08 100644 --- a/src/Gtk/Perspex.Gtk/WindowImpl.cs +++ b/src/Gtk/Perspex.Gtk/WindowImpl.cs @@ -16,7 +16,7 @@ namespace Perspex.Gtk public class WindowImpl : Gtk.Window, IWindowImpl { - private TopLevel _owner; + private IInputRoot _inputRoot; private IPlatformHandle _windowHandle; @@ -105,9 +105,9 @@ namespace Perspex.Gtk return new Point(point.X + x, point.Y + y); } - public void SetOwner(TopLevel owner) + public void SetInputRoot(IInputRoot inputRoot) { - _owner = owner; + _inputRoot = inputRoot; } public void SetTitle(string title) @@ -158,7 +158,7 @@ namespace Perspex.Gtk var e = new RawMouseEventArgs( GtkMouseDevice.Instance, evnt.Time, - _owner, + _inputRoot, evnt.Button == 0 ? RawMouseEventType.LeftButtonDown : evnt.Button == 1 ? RawMouseEventType.RightButtonDown : RawMouseEventType.MiddleButtonDown, @@ -172,7 +172,7 @@ namespace Perspex.Gtk var e = new RawMouseEventArgs( GtkMouseDevice.Instance, evnt.Time, - _owner, + _inputRoot, evnt.Button == 0 ? RawMouseEventType.LeftButtonUp : evnt.Button == 1 ? RawMouseEventType.RightButtonUp : RawMouseEventType.MiddleButtonUp, @@ -241,7 +241,7 @@ namespace Perspex.Gtk var e = new RawMouseEventArgs( GtkMouseDevice.Instance, evnt.Time, - _owner, + _inputRoot, RawMouseEventType.Move, position, GetModifierKeys(evnt.State)); Input(e); diff --git a/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs b/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs index b2ab8c06ae..12ef408fcd 100644 --- a/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs +++ b/src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs @@ -12,6 +12,7 @@ using OmniXaml.Builder; using OmniXaml.TypeConversion; using OmniXaml.Typing; using Perspex.Controls; +using Perspex.Input; using Perspex.Markup.Xaml.Templates; using Perspex.Markup.Xaml.Converters; using Perspex.Markup.Xaml.DataBinding; @@ -21,23 +22,37 @@ using Perspex.Media.Imaging; using Perspex.Metadata; using Perspex.Platform; using Perspex.Styling; +using Perspex.Controls.Primitives; 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(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); } private static XamlNamespaceRegistry CreateXamlNamespaceRegistry() @@ -88,6 +103,7 @@ namespace Perspex.Markup.Xaml.Context new TypeConverterRegistration(typeof(Thickness), new ThicknessTypeConverter()), new TypeConverterRegistration(typeof(Selector), new SelectorTypeConverter()), new TypeConverterRegistration(typeof(TimeSpan), new TimeSpanTypeConverter()), + new TypeConverterRegistration(typeof(KeyGesture), new KeyGestureConverter()) }; typeConverterProvider.AddAll(converters); @@ -114,9 +130,5 @@ namespace Perspex.Markup.Xaml.Context return contentPropertyProvider; } - - public ITypeContext TypeContext => _context.TypeContext; - - public ITypeFeatureProvider FeatureProvider => _context.FeatureProvider; } } \ No newline at end of file diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/KeyGestureConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/KeyGestureConverter.cs new file mode 100644 index 0000000000..ebf1159d76 --- /dev/null +++ b/src/Markup/Perspex.Markup.Xaml/Converters/KeyGestureConverter.cs @@ -0,0 +1,30 @@ +using System; +using System.Globalization; +using OmniXaml.TypeConversion; +using Perspex.Input; + +namespace Perspex.Markup.Xaml.Converters +{ + class KeyGestureConverter : 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 KeyGesture.Parse((string)value); + } + + public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj index a50392931c..f6b9dcf204 100644 --- a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj +++ b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj @@ -39,6 +39,7 @@ Properties\SharedAssemblyInfo.cs + diff --git a/src/Perspex.Controls/Button.cs b/src/Perspex.Controls/Button.cs index 50a4871837..41736206c9 100644 --- a/src/Perspex.Controls/Button.cs +++ b/src/Perspex.Controls/Button.cs @@ -44,6 +44,9 @@ namespace Perspex.Controls public static readonly PerspexProperty CommandProperty = PerspexProperty.Register(nameof(Command)); + public static readonly PerspexProperty HotKeyProperty = + HotKeyManager.HotKeyProperty.AddOwner