diff --git a/readme.md b/readme.md
index 33da0e82b6..42b1e52205 100644
--- a/readme.md
+++ b/readme.md
@@ -24,6 +24,8 @@ Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?it
For those without Visual Studio, a starter guide for .NET Core CLI can be found [here](http://avaloniaui.net/docs/quickstart/create-new-project#net-core).
+If you need to develop Avalonia app with JetBrains Rider, go and *vote* on [this issue](https://youtrack.jetbrains.com/issue/RIDER-39247) in their tracker. JetBrains won't do things without their users telling them that they want the feature, so only **YOU** can make it happen.
+
Avalonia is delivered via NuGet package manager. You can find the packages here: [stable(ish)](https://www.nuget.org/packages/Avalonia/)
Use these commands in the Package Manager console to install Avalonia manually:
diff --git a/samples/ControlCatalog/Pages/ProgressBarPage.xaml b/samples/ControlCatalog/Pages/ProgressBarPage.xaml
index 39bbf391bb..13bae59805 100644
--- a/samples/ControlCatalog/Pages/ProgressBarPage.xaml
+++ b/samples/ControlCatalog/Pages/ProgressBarPage.xaml
@@ -6,15 +6,19 @@
A progress bar control
+
-
+
-
+
diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs
index 6a00feaf79..ddc3d8d081 100644
--- a/src/Avalonia.Base/AvaloniaObject.cs
+++ b/src/Avalonia.Base/AvaloniaObject.cs
@@ -34,7 +34,6 @@ namespace Avalonia
public AvaloniaObject()
{
VerifyAccess();
- AvaloniaPropertyRegistry.Instance.NotifyInitialized(this);
}
///
diff --git a/src/Avalonia.Base/AvaloniaProperty.cs b/src/Avalonia.Base/AvaloniaProperty.cs
index b305a9aaa2..aa7a675764 100644
--- a/src/Avalonia.Base/AvaloniaProperty.cs
+++ b/src/Avalonia.Base/AvaloniaProperty.cs
@@ -20,7 +20,6 @@ namespace Avalonia
public static readonly object UnsetValue = new UnsetValueType();
private static int s_nextId;
- private readonly Subject _initialized;
private readonly Subject _changed;
private readonly PropertyMetadata _defaultMetadata;
private readonly Dictionary _metadata;
@@ -53,7 +52,6 @@ namespace Avalonia
throw new ArgumentException("'name' may not contain periods.");
}
- _initialized = new Subject();
_changed = new Subject();
_metadata = new Dictionary();
@@ -81,7 +79,6 @@ namespace Avalonia
Contract.Requires(source != null);
Contract.Requires(ownerType != null);
- _initialized = source._initialized;
_changed = source._changed;
_metadata = new Dictionary();
@@ -136,22 +133,6 @@ namespace Avalonia
///
public virtual bool IsReadOnly => false;
- ///
- /// Gets an observable that is fired when this property is initialized on a
- /// new instance.
- ///
- ///
- /// This observable is fired each time a new is constructed
- /// for all properties registered on the object's type. The default value of the property
- /// for the object is passed in the args' NewValue (OldValue will always be
- /// .
- ///
- ///
- /// An observable that is fired when this property is initialized on a new
- /// instance.
- ///
- public IObservable Initialized => _initialized;
-
///
/// Gets an observable that is fired when this property changes on any
/// instance.
@@ -488,26 +469,6 @@ namespace Avalonia
return Name;
}
- ///
- /// True if has any observers.
- ///
- internal bool HasNotifyInitializedObservers => _initialized.HasObservers;
-
- ///
- /// Notifies the observable.
- ///
- /// The object being initialized.
- internal abstract void NotifyInitialized(IAvaloniaObject o);
-
- ///
- /// Notifies the observable.
- ///
- /// The observable arguments.
- internal void NotifyInitialized(AvaloniaPropertyChangedEventArgs e)
- {
- _initialized.OnNext(e);
- }
-
///
/// Notifies the observable.
///
diff --git a/src/Avalonia.Base/AvaloniaPropertyRegistry.cs b/src/Avalonia.Base/AvaloniaPropertyRegistry.cs
index 14c8630599..29ab10278b 100644
--- a/src/Avalonia.Base/AvaloniaPropertyRegistry.cs
+++ b/src/Avalonia.Base/AvaloniaPropertyRegistry.cs
@@ -415,51 +415,6 @@ namespace Avalonia
_inheritedCache.Clear();
}
- internal void NotifyInitialized(AvaloniaObject o)
- {
- Contract.Requires(o != null);
-
- var type = o.GetType();
-
- if (!_initializedCache.TryGetValue(type, out var initializationData))
- {
- var visited = new HashSet();
-
- initializationData = new List();
-
- foreach (AvaloniaProperty property in GetRegistered(type))
- {
- if (property.IsDirect)
- {
- initializationData.Add(new PropertyInitializationData(property, (IDirectPropertyAccessor)property));
- }
- else
- {
- initializationData.Add(new PropertyInitializationData(property, (IStyledPropertyAccessor)property, type));
- }
-
- visited.Add(property);
- }
-
- foreach (AvaloniaProperty property in GetRegisteredAttached(type))
- {
- if (!visited.Contains(property))
- {
- initializationData.Add(new PropertyInitializationData(property, (IStyledPropertyAccessor)property, type));
-
- visited.Add(property);
- }
- }
-
- _initializedCache.Add(type, initializationData);
- }
-
- foreach (PropertyInitializationData data in initializationData)
- {
- data.Property.NotifyInitialized(o);
- }
- }
-
private readonly struct PropertyInitializationData
{
public AvaloniaProperty Property { get; }
diff --git a/src/Avalonia.Base/DirectPropertyBase.cs b/src/Avalonia.Base/DirectPropertyBase.cs
index 7a0be065eb..39ed3b084f 100644
--- a/src/Avalonia.Base/DirectPropertyBase.cs
+++ b/src/Avalonia.Base/DirectPropertyBase.cs
@@ -101,21 +101,6 @@ namespace Avalonia
return (DirectPropertyMetadata)base.GetMetadata(type);
}
- ///
- internal override void NotifyInitialized(IAvaloniaObject o)
- {
- if (HasNotifyInitializedObservers)
- {
- var e = new AvaloniaPropertyChangedEventArgs(
- o,
- this,
- default,
- InvokeGetter(o),
- BindingPriority.Unset);
- NotifyInitialized(e);
- }
- }
-
///
internal override void RouteClearValue(IAvaloniaObject o)
{
diff --git a/src/Avalonia.Base/StyledPropertyBase.cs b/src/Avalonia.Base/StyledPropertyBase.cs
index 8c4d683ae0..d1f961a567 100644
--- a/src/Avalonia.Base/StyledPropertyBase.cs
+++ b/src/Avalonia.Base/StyledPropertyBase.cs
@@ -181,21 +181,6 @@ namespace Avalonia
///
object IStyledPropertyAccessor.GetDefaultValue(Type type) => GetDefaultBoxedValue(type);
- ///
- internal override void NotifyInitialized(IAvaloniaObject o)
- {
- if (HasNotifyInitializedObservers)
- {
- var e = new AvaloniaPropertyChangedEventArgs(
- o,
- this,
- default,
- o.GetValue(this),
- BindingPriority.Unset);
- NotifyInitialized(e);
- }
- }
-
///
internal override void RouteClearValue(IAvaloniaObject o)
{
diff --git a/src/Avalonia.Controls.DataGrid/DataGrid.cs b/src/Avalonia.Controls.DataGrid/DataGrid.cs
index e16e11cdd6..214132f03c 100644
--- a/src/Avalonia.Controls.DataGrid/DataGrid.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGrid.cs
@@ -149,6 +149,9 @@ namespace Avalonia.Controls
private IEnumerable _items;
+ public event EventHandler HorizontalScroll;
+ public event EventHandler VerticalScroll;
+
///
/// Identifies the CanUserReorderColumns dependency property.
///
@@ -373,7 +376,11 @@ namespace Avalonia.Controls
public bool IsValid
{
get { return _isValid; }
- internal set { SetAndRaise(IsValidProperty, ref _isValid, value); }
+ internal set
+ {
+ SetAndRaise(IsValidProperty, ref _isValid, value);
+ PseudoClasses.Set(":invalid", !value);
+ }
}
public static readonly StyledProperty MaxColumnWidthProperty =
@@ -656,8 +663,6 @@ namespace Avalonia.Controls
HorizontalScrollBarVisibilityProperty,
VerticalScrollBarVisibilityProperty);
- PseudoClass(IsValidProperty, x => !x, ":invalid");
-
ItemsProperty.Changed.AddClassHandler((x, e) => x.OnItemsPropertyChanged(e));
CanUserResizeColumnsProperty.Changed.AddClassHandler((x, e) => x.OnCanUserResizeColumnsChanged(e));
ColumnWidthProperty.Changed.AddClassHandler((x, e) => x.OnColumnWidthChanged(e));
@@ -4223,6 +4228,7 @@ namespace Avalonia.Controls
private void HorizontalScrollBar_Scroll(object sender, ScrollEventArgs e)
{
ProcessHorizontalScroll(e.ScrollEventType);
+ HorizontalScroll?.Invoke(sender, e);
}
private bool IsColumnOutOfBounds(int columnIndex)
@@ -5555,6 +5561,7 @@ namespace Avalonia.Controls
private void VerticalScrollBar_Scroll(object sender, ScrollEventArgs e)
{
ProcessVerticalScroll(e.ScrollEventType);
+ VerticalScroll?.Invoke(sender, e);
}
//TODO: Ensure left button is checked for
diff --git a/src/Avalonia.Controls/Button.cs b/src/Avalonia.Controls/Button.cs
index 2e115463ac..0bc6394b19 100644
--- a/src/Avalonia.Controls/Button.cs
+++ b/src/Avalonia.Controls/Button.cs
@@ -91,7 +91,11 @@ namespace Avalonia.Controls
CommandProperty.Changed.Subscribe(CommandChanged);
IsDefaultProperty.Changed.Subscribe(IsDefaultChanged);
IsCancelProperty.Changed.Subscribe(IsCancelChanged);
- PseudoClass