diff --git a/Avalonia.sln b/Avalonia.sln
index 75f1dd8407..6c3c3a92b9 100644
--- a/Avalonia.sln
+++ b/Avalonia.sln
@@ -222,8 +222,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Headless.Vnc", "sr
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Markup.Xaml.Loader", "src\Markup\Avalonia.Markup.Xaml.Loader\Avalonia.Markup.Xaml.Loader.csproj", "{909A8CBD-7D0E-42FD-B841-022AD8925820}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.ReactiveUI.Events", "src\Avalonia.ReactiveUI.Events\Avalonia.ReactiveUI.Events.csproj", "{28F18757-C3E6-4BBE-A37D-11BA2AB9177C}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox", "samples\Sandbox\Sandbox.csproj", "{11BE52AF-E2DD-4CF0-B19A-05285ACAF571}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroComGenerator", "src\tools\MicroComGenerator\MicroComGenerator.csproj", "{AEC9031E-06EA-4A9E-9E7F-7D7C719404DD}"
diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs
index eec21d4423..6f4afd9191 100644
--- a/nukebuild/Build.cs
+++ b/nukebuild/Build.cs
@@ -16,7 +16,6 @@ using Nuke.Common.Tools.MSBuild;
using Nuke.Common.Tools.Npm;
using Nuke.Common.Utilities;
using Nuke.Common.Utilities.Collections;
-using Pharmacist.Core;
using static Nuke.Common.EnvironmentInfo;
using static Nuke.Common.IO.FileSystemTasks;
using static Nuke.Common.IO.PathConstruction;
@@ -163,44 +162,8 @@ partial class Build : NukeBuild
.AddProperty("PackageVersion", Parameters.Version)
.SetConfiguration(Parameters.Configuration)
);
-
- await CompileReactiveEvents();
});
- async Task CompileReactiveEvents()
- {
- var avaloniaBuildOutput = Path.Combine(RootDirectory, "packages", "Avalonia", "bin", Parameters.Configuration);
- var avaloniaAssemblies = GlobFiles(avaloniaBuildOutput, "**/Avalonia*.dll")
- .Where(file => !file.Contains("Avalonia.Build.Tasks") &&
- !file.Contains("Avalonia.Remote.Protocol"));
-
- var eventsDirectory = GlobDirectories($"{RootDirectory}/src/**/Avalonia.ReactiveUI.Events").First();
- var eventsBuildFile = Path.Combine(eventsDirectory, "Events_Avalonia.cs");
- if (File.Exists(eventsBuildFile))
- File.Delete(eventsBuildFile);
-
- using (var stream = File.Create(eventsBuildFile))
- using (var writer = new StreamWriter(stream))
- {
- await ObservablesForEventGenerator.ExtractEventsFromAssemblies(
- writer, avaloniaAssemblies, new string[0], "netstandard2.0"
- );
- }
-
- var eventsProject = Path.Combine(eventsDirectory, "Avalonia.ReactiveUI.Events.csproj");
- if (Parameters.IsRunningOnWindows)
- MsBuildCommon(eventsProject, c => c
- .SetProcessArgumentConfigurator(a => a.Add("/r"))
- .AddTargets("Build")
- );
- else
- DotNetBuild(c => c
- .SetProjectFile(eventsProject)
- .AddProperty("PackageVersion", Parameters.Version)
- .SetConfiguration(Parameters.Configuration)
- );
- }
-
void RunCoreTest(string projectName)
{
Information($"Running tests from {projectName}");
diff --git a/nukebuild/_build.csproj b/nukebuild/_build.csproj
index b0380cc92b..e08ffd0413 100644
--- a/nukebuild/_build.csproj
+++ b/nukebuild/_build.csproj
@@ -17,7 +17,6 @@
-
diff --git a/src/Avalonia.Controls/Converters/CornerRadiusFilterConverter.cs b/src/Avalonia.Controls/Converters/CornerRadiusFilterConverter.cs
new file mode 100644
index 0000000000..7587a9dacb
--- /dev/null
+++ b/src/Avalonia.Controls/Converters/CornerRadiusFilterConverter.cs
@@ -0,0 +1,44 @@
+#nullable enable
+using System;
+using System.Globalization;
+
+using Avalonia.Data.Converters;
+
+namespace Avalonia.Controls.Converters
+{
+ ///
+ /// Converts an existing CornerRadius struct to a new CornerRadius struct,
+ /// with filters applied to extract only the specified fields, leaving the others set to 0.
+ ///
+ public class CornerRadiusFilterConverter : IValueConverter
+ {
+ ///
+ /// Gets or sets the type of the filter applied to the .
+ ///
+ public CornerRadiusFilterKinds Filter { get; set; }
+
+ ///
+ /// Gets or sets the scale multiplier applied to the .
+ ///
+ public double Scale { get; set; } = 1;
+
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (!(value is CornerRadius radius))
+ {
+ return value;
+ }
+
+ return new CornerRadius(
+ Filter.HasAllFlags(CornerRadiusFilterKinds.TopLeft) ? radius.TopLeft * Scale : 0,
+ Filter.HasAllFlags(CornerRadiusFilterKinds.TopRight) ? radius.TopRight * Scale : 0,
+ Filter.HasAllFlags(CornerRadiusFilterKinds.BottomRight) ? radius.BottomRight * Scale : 0,
+ Filter.HasAllFlags(CornerRadiusFilterKinds.BottomLeft) ? radius.BottomLeft * Scale : 0);
+ }
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/Avalonia.Controls/Converters/CornerRadiusFilterKind.cs b/src/Avalonia.Controls/Converters/CornerRadiusFilterKind.cs
new file mode 100644
index 0000000000..6a9d0596be
--- /dev/null
+++ b/src/Avalonia.Controls/Converters/CornerRadiusFilterKind.cs
@@ -0,0 +1,32 @@
+using System;
+
+namespace Avalonia.Controls.Converters
+{
+ ///
+ /// Defines constants that specify the filter type for a instance.
+ ///
+ [Flags]
+ public enum CornerRadiusFilterKinds
+ {
+ ///
+ /// No filter applied.
+ ///
+ None,
+ ///
+ /// Filters TopLeft value.
+ ///
+ TopLeft = 1,
+ ///
+ /// Filters TopRight value.
+ ///
+ TopRight = 2,
+ ///
+ /// Filters BottomLeft value.
+ ///
+ BottomLeft = 4,
+ ///
+ /// Filters BottomRight value.
+ ///
+ BottomRight = 8
+ }
+}
diff --git a/src/Avalonia.Dialogs/Avalonia.Dialogs.csproj b/src/Avalonia.Dialogs/Avalonia.Dialogs.csproj
index dd476e2559..665693a654 100644
--- a/src/Avalonia.Dialogs/Avalonia.Dialogs.csproj
+++ b/src/Avalonia.Dialogs/Avalonia.Dialogs.csproj
@@ -4,9 +4,6 @@
-
- Designer
-
diff --git a/src/Avalonia.Dialogs/ChildFitter.cs b/src/Avalonia.Dialogs/ChildFitter.cs
index 744d455d9d..4a6db62b32 100644
--- a/src/Avalonia.Dialogs/ChildFitter.cs
+++ b/src/Avalonia.Dialogs/ChildFitter.cs
@@ -4,7 +4,7 @@ using Avalonia.Layout;
namespace Avalonia.Dialogs
{
- internal class ChildFitter : Decorator
+ public class ChildFitter : Decorator
{
protected override Size MeasureOverride(Size availableSize)
{
diff --git a/src/Avalonia.Dialogs/FileSizeStringConverter.cs b/src/Avalonia.Dialogs/FileSizeStringConverter.cs
index 5b41b9da35..c2cdf1e502 100644
--- a/src/Avalonia.Dialogs/FileSizeStringConverter.cs
+++ b/src/Avalonia.Dialogs/FileSizeStringConverter.cs
@@ -6,7 +6,7 @@ using System.Text;
namespace Avalonia.Dialogs
{
- internal class FileSizeStringConverter : IValueConverter
+ public class FileSizeStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
diff --git a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs b/src/Avalonia.Dialogs/ManagedFileChooser.cs
similarity index 66%
rename from src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
rename to src/Avalonia.Dialogs/ManagedFileChooser.cs
index 7f29407ed5..f9f38ac474 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
+++ b/src/Avalonia.Dialogs/ManagedFileChooser.cs
@@ -3,6 +3,7 @@ using System.Linq;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.LogicalTree;
@@ -10,17 +11,14 @@ using Avalonia.Markup.Xaml;
namespace Avalonia.Dialogs
{
- internal class ManagedFileChooser : UserControl
+ public class ManagedFileChooser : TemplatedControl
{
private Control _quickLinksRoot;
private ListBox _filesView;
public ManagedFileChooser()
{
- AvaloniaXamlLoader.Load(this);
AddHandler(PointerPressedEvent, OnPointerPressed, RoutingStrategies.Tunnel);
- _quickLinksRoot = this.FindControl("QuickLinks");
- _filesView = this.FindControl("Files");
}
ManagedFileChooserViewModel Model => DataContext as ManagedFileChooserViewModel;
@@ -34,19 +32,22 @@ namespace Avalonia.Dialogs
return;
}
- var isQuickLink = _quickLinksRoot.IsLogicalAncestorOf(e.Source as Control);
- if (e.ClickCount == 2 || isQuickLink)
+ if (_quickLinksRoot != null)
{
- if (model.ItemType == ManagedFileChooserItemType.File)
+ var isQuickLink = _quickLinksRoot.IsLogicalAncestorOf(e.Source as Control);
+ if (e.ClickCount == 2 || isQuickLink)
{
- Model?.SelectSingleFile(model);
+ if (model.ItemType == ManagedFileChooserItemType.File)
+ {
+ Model?.SelectSingleFile(model);
+ }
+ else
+ {
+ Model?.Navigate(model.Path);
+ }
+
+ e.Handled = true;
}
- else
- {
- Model?.Navigate(model.Path);
- }
-
- e.Handled = true;
}
}
@@ -79,10 +80,16 @@ namespace Avalonia.Dialogs
// Workaround for ListBox bug, scroll to the previous file
var indexOfPreselected = model.Items.IndexOf(preselected);
- if (indexOfPreselected > 1)
+ if ((_filesView != null) && (indexOfPreselected > 1))
{
_filesView.ScrollIntoView(indexOfPreselected - 1);
}
}
+
+ protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
+ {
+ _quickLinksRoot = e.NameScope.Get("QuickLinks");
+ _filesView = e.NameScope.Get("Files");
+ }
}
}
diff --git a/src/Avalonia.Dialogs/ManagedFileChooser.xaml b/src/Avalonia.Dialogs/ManagedFileChooser.xaml
deleted file mode 100644
index 227cc1afc0..0000000000
--- a/src/Avalonia.Dialogs/ManagedFileChooser.xaml
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Show hidden files
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Avalonia.Dialogs/ResourceSelectorConverter.cs b/src/Avalonia.Dialogs/ResourceSelectorConverter.cs
index 9d8b6cb1c7..c8226b98e4 100644
--- a/src/Avalonia.Dialogs/ResourceSelectorConverter.cs
+++ b/src/Avalonia.Dialogs/ResourceSelectorConverter.cs
@@ -5,7 +5,7 @@ using Avalonia.Data.Converters;
namespace Avalonia.Dialogs
{
- internal class ResourceSelectorConverter : ResourceDictionary, IValueConverter
+ public class ResourceSelectorConverter : ResourceDictionary, IValueConverter
{
public object Convert(object key, Type targetType, object parameter, CultureInfo culture)
{
diff --git a/src/Avalonia.ReactiveUI.Events/Avalonia.ReactiveUI.Events.csproj b/src/Avalonia.ReactiveUI.Events/Avalonia.ReactiveUI.Events.csproj
deleted file mode 100644
index 7f58e455f9..0000000000
--- a/src/Avalonia.ReactiveUI.Events/Avalonia.ReactiveUI.Events.csproj
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- netstandard2.0
- Avalonia.ReactiveUI.Events
- false
-
-
-
-
-
-
-
-
diff --git a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
index 153e21761e..06859e0cbb 100644
--- a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
+++ b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
@@ -12,6 +12,7 @@
+
diff --git a/src/Avalonia.Themes.Default/DefaultTheme.xaml b/src/Avalonia.Themes.Default/DefaultTheme.xaml
index 4ae9ea4812..109fde390c 100644
--- a/src/Avalonia.Themes.Default/DefaultTheme.xaml
+++ b/src/Avalonia.Themes.Default/DefaultTheme.xaml
@@ -62,4 +62,5 @@
+
diff --git a/src/Avalonia.Themes.Default/ManagedFileChooser.xaml b/src/Avalonia.Themes.Default/ManagedFileChooser.xaml
new file mode 100644
index 0000000000..f9f77bf455
--- /dev/null
+++ b/src/Avalonia.Themes.Default/ManagedFileChooser.xaml
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj b/src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj
index 72f1fbf973..d0bc8e9d26 100644
--- a/src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj
+++ b/src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj
@@ -11,7 +11,8 @@
-
+
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/FluentControls.xaml b/src/Avalonia.Themes.Fluent/Controls/FluentControls.xaml
index 16e05ffdfd..51836255ef 100644
--- a/src/Avalonia.Themes.Fluent/Controls/FluentControls.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/FluentControls.xaml
@@ -61,4 +61,6 @@
+
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml b/src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml
new file mode 100644
index 0000000000..7ba5440591
--- /dev/null
+++ b/src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml
@@ -0,0 +1,324 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file