Browse Source

Merge branch 'master' into EfficientTransformedBounds

pull/1312/head
Steven Kirk 8 years ago
committed by GitHub
parent
commit
dfb47e2cfb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .gitignore
  2. 3
      .ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject
  3. 6
      .ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject
  4. 12
      Avalonia.sln
  5. 2
      appveyor.yml
  6. 78
      build.cake
  7. 4
      parameters.cake
  8. 2
      samples/BindingTest/App.config
  9. 2
      samples/BindingTest/BindingTest.csproj
  10. 2
      samples/ControlCatalog.Desktop/App.config
  11. 2
      samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj
  12. 2
      samples/RenderTest/App.config
  13. 2
      samples/RenderTest/RenderTest.csproj
  14. 2
      samples/VirtualizationTest/App.config
  15. 2
      samples/VirtualizationTest/VirtualizationTest.csproj
  16. 1
      scripts/ReplaceNugetCache.ps1
  17. 2
      scripts/ReplaceNugetCache.sh
  18. 3
      scripts/ReplaceNugetCacheRelease.ps1
  19. 7
      src/Android/Avalonia.Android/Resources/Resource.Designer.cs
  20. 4
      src/Avalonia.Animation/Avalonia.Animation.csproj
  21. 4
      src/Avalonia.Base/Avalonia.Base.csproj
  22. 20
      src/Avalonia.Controls/AppBuilderBase.cs
  23. 9
      src/Avalonia.Controls/Application.cs
  24. 4
      src/Avalonia.Controls/Avalonia.Controls.csproj
  25. 2
      src/Avalonia.Controls/Carousel.cs
  26. 6
      src/Avalonia.Controls/ColumnDefinition.cs
  27. 1
      src/Avalonia.Controls/ContentControl.cs
  28. 14
      src/Avalonia.Controls/Control.cs
  29. 2
      src/Avalonia.Controls/DropDown.cs
  30. 15
      src/Avalonia.Controls/Presenters/ContentPresenter.cs
  31. 2
      src/Avalonia.Controls/Primitives/HeaderedContentControl.cs
  32. 31
      src/Avalonia.Controls/Primitives/PopupRoot.cs
  33. 2
      src/Avalonia.Controls/Primitives/TemplatedControl.cs
  34. 6
      src/Avalonia.Controls/Primitives/Thumb.cs
  35. 1
      src/Avalonia.Controls/Primitives/ToggleButton.cs
  36. 12
      src/Avalonia.Controls/Primitives/Track.cs
  37. 6
      src/Avalonia.Controls/RowDefinition.cs
  38. 4
      src/Avalonia.Controls/Shapes/Line.cs
  39. 2
      src/Avalonia.Controls/Shapes/Path.cs
  40. 29
      src/Avalonia.Controls/Shapes/Shape.cs
  41. 18
      src/Avalonia.Controls/TextBox.cs
  42. 4
      src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj
  43. 2
      src/Avalonia.Diagnostics/Views/ControlDetailsView.cs
  44. 2
      src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj
  45. 16
      src/Avalonia.HtmlRenderer/HtmlControl.cs
  46. 4
      src/Avalonia.Input/Avalonia.Input.csproj
  47. 18
      src/Avalonia.Input/InputElement.cs
  48. 6
      src/Avalonia.Input/KeyBinding.cs
  49. 17
      src/Avalonia.Input/KeyGesture.cs
  50. 4
      src/Avalonia.Interactivity/Avalonia.Interactivity.csproj
  51. 4
      src/Avalonia.Layout/Avalonia.Layout.csproj
  52. 4
      src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj
  53. 4
      src/Avalonia.Styling/Avalonia.Styling.csproj
  54. 4
      src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj
  55. 2
      src/Avalonia.Themes.Default/Button.xaml
  56. 2
      src/Avalonia.Themes.Default/CalendarButton.xaml
  57. 2
      src/Avalonia.Themes.Default/CalendarDayButton.xaml
  58. 2
      src/Avalonia.Themes.Default/CheckBox.xaml
  59. 2
      src/Avalonia.Themes.Default/ContentControl.xaml
  60. 2
      src/Avalonia.Themes.Default/DropDownItem.xaml
  61. 2
      src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml
  62. 8
      src/Avalonia.Themes.Default/Expander.xaml
  63. 2
      src/Avalonia.Themes.Default/LayoutTransformControl.xaml
  64. 2
      src/Avalonia.Themes.Default/ListBoxItem.xaml
  65. 2
      src/Avalonia.Themes.Default/PopupRoot.xaml
  66. 2
      src/Avalonia.Themes.Default/RadioButton.xaml
  67. 2
      src/Avalonia.Themes.Default/RepeatButton.xaml
  68. 2
      src/Avalonia.Themes.Default/TabStripItem.xaml
  69. 2
      src/Avalonia.Themes.Default/ToggleButton.xaml
  70. 2
      src/Avalonia.Themes.Default/ToolTip.xaml
  71. 2
      src/Avalonia.Themes.Default/Window.xaml
  72. 2
      src/Avalonia.Visuals/Media/Geometry.cs
  73. 2
      src/Avalonia.Visuals/Media/ImageBrush.cs
  74. 2
      src/Avalonia.Visuals/Media/MatrixTransform.cs
  75. 2
      src/Avalonia.Visuals/Media/RotateTransform.cs
  76. 4
      src/Avalonia.Visuals/Media/TranslateTransform.cs
  77. 2
      src/Avalonia.Visuals/Media/VisualBrush.cs
  78. 3
      src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
  79. 14
      src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoaderPortableXaml.cs
  80. 2
      src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github
  81. 24
      src/Markup/Avalonia.Markup.Xaml/XamlLoadException.cs
  82. 4
      src/Markup/Avalonia.Markup/Avalonia.Markup.csproj
  83. 4
      src/Skia/Avalonia.Skia/FormattedTextImpl.cs
  84. 7
      src/Windows/Avalonia.Direct2D1/FramebufferShimRenderTarget.cs
  85. 7
      src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs
  86. 4
      src/Windows/Avalonia.Win32/Avalonia.Win32.csproj
  87. 6
      src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
  88. 2
      tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
  89. 6
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs
  90. 2
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_GetSubject.cs
  91. 2
      tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs
  92. 8
      tests/Avalonia.Benchmarks/App.config
  93. 2
      tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj
  94. 6
      tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs
  95. 2
      tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj
  96. 58
      tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
  97. 18
      tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs
  98. 71
      tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs
  99. 9
      tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs
  100. 26
      tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs

2
.gitignore

@ -176,3 +176,5 @@ nuget
Avalonia.XBuild.sln
project.lock.json
.idea/*
**/obj-Skia/*
**/obj-Direct2D1/*

3
.ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject

@ -1,5 +1,8 @@
<ProjectConfiguration>
<Settings>
<AdditionalFilesToIncludeForProject>
<Value>..\TestFiles\Direct2D1\**.*</Value>
</AdditionalFilesToIncludeForProject>
<DefaultTestTimeout>3000</DefaultTestTimeout>
<PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
</Settings>

6
.ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject

@ -1,7 +1,9 @@
<ProjectConfiguration>
<Settings>
<DefaultTestTimeout>1000</DefaultTestTimeout>
<IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
<AdditionalFilesToIncludeForProject>
<Value>..\TestFiles\Skia\**.*</Value>
</AdditionalFilesToIncludeForProject>
<DefaultTestTimeout>3000</DefaultTestTimeout>
<PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
</Settings>
</ProjectConfiguration>

12
Avalonia.sln

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27004.2008
VisualStudioVersion = 15.0.27130.2024
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}"
EndProject
@ -45,11 +45,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Layout.UnitTests",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Interactivity.UnitTests", "tests\Avalonia.Interactivity.UnitTests\Avalonia.Interactivity.UnitTests.csproj", "{08478EF5-44E8-42E9-92D6-15E00EC038D8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Direct2D1.RenderTests", "tests\Avalonia.RenderTests\Avalonia.Direct2D1.RenderTests.csproj", "{DABFD304-D6A4-4752-8123-C2CCF7AC7831}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Direct2D1.RenderTests", "tests\Avalonia.Direct2D1.RenderTests\Avalonia.Direct2D1.RenderTests.csproj", "{DABFD304-D6A4-4752-8123-C2CCF7AC7831}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Input.UnitTests", "tests\Avalonia.Input.UnitTests\Avalonia.Input.UnitTests.csproj", "{AC18926A-E784-40FE-B09D-BB0FE2B599F0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Direct2D1.UnitTests", "tests\Avalonia.Direct2D1.UnitTests\Avalonia.Direct2D1.UnitTests.csproj", "{EFB11458-9CDF-41C0-BE4F-44AF45A4CAB8}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Direct2D1.UnitTests", "tests\Avalonia.Direct2D1.UnitTests\Avalonia.Direct2D1.UnitTests.csproj", "{EFB11458-9CDF-41C0-BE4F-44AF45A4CAB8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Markup.Xaml.UnitTests", "tests\Avalonia.Markup.Xaml.UnitTests\Avalonia.Markup.Xaml.UnitTests.csproj", "{99135EAB-653D-47E4-A378-C96E1278CA44}"
EndProject
@ -114,8 +114,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.DesignerSupport.Te
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.DesignerSupport.TestApp", "tests\Avalonia.DesignerSupport.TestApp\Avalonia.DesignerSupport.TestApp.csproj", "{F1381F98-4D24-409A-A6C5-1C5B1E08BB08}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Avalonia.RenderTests", "tests\Avalonia.RenderTests\Avalonia.RenderTests.shproj", "{48840EDD-24BF-495D-911E-2EB12AE75D3B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizationTest", "samples\VirtualizationTest\VirtualizationTest.csproj", "{FBCAF3D0-2808-4934-8E96-3F607594517B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interop", "Interop", "{A0CC0258-D18C-4AB3-854F-7101680FC3F9}"
@ -176,7 +174,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Direct3DInteropSample", "sa
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Win32.Interop", "src\Windows\Avalonia.Win32.Interop\Avalonia.Win32.Interop.csproj", "{CBC4FF2F-92D4-420B-BE21-9FE0B930B04E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.RenderTests", "tests\Avalonia.RenderTests\Avalonia.Skia.RenderTests.csproj", "{E1582370-37B3-403C-917F-8209551B1634}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.RenderTests", "tests\Avalonia.Skia.RenderTests\Avalonia.Skia.RenderTests.csproj", "{E1582370-37B3-403C-917F-8209551B1634}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Remote.Protocol", "src\Avalonia.Remote.Protocol\Avalonia.Remote.Protocol.csproj", "{D78A720C-C0C6-478B-8564-F167F9BDD01B}"
EndProject
@ -200,7 +198,6 @@ Global
src\Shared\RenderHelpers\RenderHelpers.projitems*{3e908f67-5543-4879-a1dc-08eace79b3cd}*SharedItemsImports = 4
src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{40759a76-d0f2-464e-8000-6ff0f5c4bd7c}*SharedItemsImports = 4
src\Shared\PlatformSupport\PlatformSupport.projitems*{4488ad85-1495-4809-9aa4-ddfe0a48527e}*SharedItemsImports = 4
tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{48840edd-24bf-495d-911e-2eb12ae75d3b}*SharedItemsImports = 13
src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4
src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4
src\Shared\PlatformSupport\PlatformSupport.projitems*{7b92af71-6287-4693-9dcb-bd5b6e927e23}*SharedItemsImports = 4
@ -2643,7 +2640,6 @@ Global
{57E0455D-D565-44BB-B069-EE1AA20F8337} = {9B9E3891-2366-4253-A952-D08BCEB71098}
{52F55355-D120-42AC-8116-8410A7D602FA} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
{F1381F98-4D24-409A-A6C5-1C5B1E08BB08} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
{48840EDD-24BF-495D-911E-2EB12AE75D3B} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
{FBCAF3D0-2808-4934-8E96-3F607594517B} = {9B9E3891-2366-4253-A952-D08BCEB71098}
{A0CC0258-D18C-4AB3-854F-7101680FC3F9} = {9B9E3891-2366-4253-A952-D08BCEB71098}
{C7A69145-60B6-4882-97D6-A3921DD43978} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}

2
appveyor.yml

@ -1,4 +1,4 @@
os: Previous Visual Studio 2017
os: Visual Studio 2017
platform:
- Any CPU
skip_branch_with_pr: true

78
build.cake

@ -93,7 +93,7 @@ Task("Clean")
CleanDirectory(parameters.NugetRoot);
CleanDirectory(parameters.ZipRoot);
CleanDirectory(parameters.BinRoot);
CleanDirectory(parameters.TestsRoot);
CleanDirectory(parameters.DesignerTestsRoot);
});
Task("Restore-NuGet-Packages")
@ -124,14 +124,9 @@ Task("Restore-NuGet-Packages")
void DotNetCoreBuild()
{
DotNetCoreRestore("samples\\ControlCatalog.NetCore");
DotNetBuild("samples\\ControlCatalog.NetCore");
DotNetCoreBuild("samples\\ControlCatalog.NetCore");
}
Task("DotNetCoreBuild")
.IsDependentOn("Clean")
.Does(() => DotNetCoreBuild());
Task("Build")
.IsDependentOn("Restore-NuGet-Packages")
.Does(() =>
@ -140,11 +135,11 @@ Task("Build")
{
MSBuild(parameters.MSBuildSolution, settings => {
settings.SetConfiguration(parameters.Configuration);
settings.SetVerbosity(Verbosity.Minimal);
settings.WithProperty("Platform", "\"" + parameters.Platform + "\"");
settings.WithProperty("UseRoslynPathHack", "true");
settings.SetVerbosity(Verbosity.Minimal);
settings.WithProperty("Windows", "True");
settings.UseToolVersion(MSBuildToolVersion.VS2017);
settings.WithProperty("Windows", "True");
settings.SetNodeReuse(false);
});
}
@ -160,10 +155,9 @@ void RunCoreTest(string project, Parameters parameters, bool coreOnly = false)
if(!project.EndsWith(".csproj"))
project = System.IO.Path.Combine(project, System.IO.Path.GetFileName(project)+".csproj");
Information("Running tests from " + project);
DotNetCoreRestore(project);
var frameworks = new List<string>(){"netcoreapp2.0"};
if(parameters.IsRunningOnWindows)
frameworks.Add("net461");
frameworks.Add("net47");
foreach(var fw in frameworks)
{
if(!fw.StartsWith("netcoreapp") && coreOnly)
@ -178,8 +172,11 @@ void RunCoreTest(string project, Parameters parameters, bool coreOnly = false)
}
}
Task("Run-Net-Core-Unit-Tests")
.IsDependentOn("Clean")
Task("Run-Unit-Tests")
.IsDependentOn("Build")
.IsDependentOn("Run-Designer-Unit-Tests")
.IsDependentOn("Run-Render-Tests")
.WithCriteria(() => !parameters.SkipTests)
.Does(() => {
RunCoreTest("./tests/Avalonia.Base.UnitTests", parameters, false);
RunCoreTest("./tests/Avalonia.Controls.UnitTests", parameters, false);
@ -190,27 +187,25 @@ Task("Run-Net-Core-Unit-Tests")
RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests", parameters, false);
RunCoreTest("./tests/Avalonia.Styling.UnitTests", parameters, false);
RunCoreTest("./tests/Avalonia.Visuals.UnitTests", parameters, false);
if(parameters.IsRunningOnWindows)
RunCoreTest("./tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj", parameters, true);
if (parameters.IsRunningOnWindows)
{
RunCoreTest("./tests/Avalonia.Direct2D1.UnitTests", parameters, true);
}
});
Task("Run-Unit-Tests")
.IsDependentOn("Run-Net-Core-Unit-Tests")
Task("Run-Render-Tests")
.IsDependentOn("Build")
//.IsDependentOn("Run-Leak-Tests")
.WithCriteria(() => !parameters.SkipTests)
.WithCriteria(() => !parameters.SkipTests && parameters.IsRunningOnWindows)
.Does(() => {
RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", parameters, true);
RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", parameters, true);
});
Task("Run-Designer-Unit-Tests")
.IsDependentOn("Build")
.WithCriteria(() => !parameters.SkipTests && parameters.IsRunningOnWindows)
.Does(() =>
{
if(!parameters.IsRunningOnWindows)
return;
var unitTests = GetDirectories("./tests/Avalonia.*.UnitTests")
.Select(dir => System.IO.Path.GetFileName(dir.FullPath))
.Where( name => !name.Contains("Skia")) // Run in the Run-Net-Core-Unit-Tests target
.Where(name => parameters.IsRunningOnWindows ? true : !name.Contains("Direct2D"))
.Select(name => MakeAbsolute(File("./tests/" + name + "/bin/" + parameters.DirSuffix + "/" + name + ".dll")))
.ToList();
var toolPath = (parameters.IsPlatformAnyCPU || parameters.IsPlatformX86) ?
Context.Tools.Resolve("xunit.console.x86.exe") :
Context.Tools.Resolve("xunit.console.exe");
@ -219,27 +214,10 @@ Task("Run-Unit-Tests")
{
ToolPath = toolPath,
Parallelism = ParallelismOption.None,
ShadowCopy = false
ShadowCopy = false,
};
xUnitSettings.NoAppDomain = !parameters.IsRunningOnWindows;
foreach(var test in unitTests.Where(testFile => FileExists(testFile)))
{
CopyDirectory(test.GetDirectory(), parameters.TestsRoot);
}
var testsInDirectoryToRun = new List<FilePath>();
if(parameters.IsRunningOnWindows)
{
testsInDirectoryToRun.AddRange(GetFiles("./artifacts/tests/*Tests.dll"));
}
else
{
testsInDirectoryToRun.AddRange(GetFiles("./artifacts/tests/*.UnitTests.dll"));
}
XUnit2(testsInDirectoryToRun, xUnitSettings);
XUnit2("./artifacts/designer-tests/Avalonia.DesignerSupport.Tests.dll", xUnitSettings);
});
Task("Copy-Files")
@ -427,7 +405,7 @@ Task("Default").Does(() =>
if(parameters.IsRunningOnWindows)
RunTarget("Package");
else
RunTarget("Run-Net-Core-Unit-Tests");
RunTarget("Run-Unit-Tests");
});
Task("AppVeyor")
.IsDependentOn("Zip-Files")
@ -435,7 +413,7 @@ Task("AppVeyor")
.IsDependentOn("Publish-NuGet");
Task("Travis")
.IsDependentOn("Run-Net-Core-Unit-Tests");
.IsDependentOn("Run-Unit-Tests");
///////////////////////////////////////////////////////////////////////////////
// EXECUTE

4
parameters.cake

@ -30,7 +30,7 @@ public class Parameters
public DirectoryPath NugetRoot { get; private set; }
public DirectoryPath ZipRoot { get; private set; }
public DirectoryPath BinRoot { get; private set; }
public DirectoryPath TestsRoot { get; private set; }
public DirectoryPath DesignerTestsRoot { get; private set; }
public string DirSuffix { get; private set; }
public string DirSuffixIOS { get; private set; }
public DirectoryPathCollection BuildDirs { get; private set; }
@ -106,7 +106,7 @@ public class Parameters
NugetRoot = ArtifactsDir.Combine("nuget");
ZipRoot = ArtifactsDir.Combine("zip");
BinRoot = ArtifactsDir.Combine("bin");
TestsRoot = ArtifactsDir.Combine("tests");
DesignerTestsRoot = ArtifactsDir.Combine("designer-tests");
BuildDirs = context.GetDirectories("**/bin") + context.GetDirectories("**/obj");

2
samples/BindingTest/App.config

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

2
samples/BindingTest/BindingTest.csproj

@ -9,7 +9,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BindingTest</RootNamespace>
<AssemblyName>BindingTest</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />

2
samples/ControlCatalog.Desktop/App.config

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

2
samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj

@ -9,7 +9,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ControlCatalog.Desktop</RootNamespace>
<AssemblyName>ControlCatalog.Desktop</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />

2
samples/RenderTest/App.config

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

2
samples/RenderTest/RenderTest.csproj

@ -9,7 +9,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>RenderTest</RootNamespace>
<AssemblyName>RenderTest</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />

2
samples/VirtualizationTest/App.config

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

2
samples/VirtualizationTest/VirtualizationTest.csproj

@ -9,7 +9,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>VirtualizationTest</RootNamespace>
<AssemblyName>VirtualizationTest</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />

1
scripts/ReplaceNugetCache.ps1

@ -2,3 +2,4 @@ copy ..\samples\ControlCatalog.NetCore\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\
copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netstandard2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.gtk3\$args\lib\netstandard2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.win32\$args\lib\netstandard2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.skia\$args\lib\netstandard2.0\

2
scripts/ReplaceNugetCache.sh

@ -3,4 +3,6 @@
cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp2.0/Avalonia**.dll ~/.nuget/packages/avalonia/$1/lib/netcoreapp2.0/
cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp2.0/Avalonia**.dll ~/.nuget/packages/avalonia/$1/lib/netstandard2.0/
cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp2.0/Avalonia**.dll ~/.nuget/packages/avalonia.gtk3/$1/lib/netstandard2.0/
cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp2.0/Avalonia**.dll ~/.nuget/packages/avalonia.skia/$1/lib/netstandard2.0/

3
scripts/ReplaceNugetCacheRelease.ps1

@ -1,4 +1,5 @@
copy ..\samples\ControlCatalog.NetCore\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netcoreapp2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netstandard2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.gtk3\$args\lib\netstandard2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.win32\$args\lib\netstandard2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.win32\$args\lib\netstandard2.0\
copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.skia\$args\lib\netstandard2.0\

7
src/Android/Avalonia.Android/Resources/Resource.Designer.cs

@ -40,14 +40,11 @@ namespace Avalonia.Android
public partial class String
{
// aapt resource value: 0x7f020002
public static int ApplicationName = 2130837506;
// aapt resource value: 0x7f020001
public static int Hello = 2130837505;
public static int ApplicationName = 2130837505;
// aapt resource value: 0x7f020000
public static int library_name = 2130837504;
public static int Hello = 2130837504;
static String()
{

4
src/Avalonia.Animation/Avalonia.Animation.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Animation.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Animation.xml</DocumentationFile>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -21,7 +21,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Animation.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Animation.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

4
src/Avalonia.Base/Avalonia.Base.csproj

@ -12,7 +12,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Base.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Base.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -22,7 +22,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Base.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Base.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

20
src/Avalonia.Controls/AppBuilderBase.cs

@ -14,6 +14,8 @@ namespace Avalonia.Controls
/// <typeparam name="TAppBuilder">The type of the AppBuilder class itself.</typeparam>
public abstract class AppBuilderBase<TAppBuilder> where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
{
private static bool s_setupWasAlreadyCalled;
/// <summary>
/// Gets or sets the <see cref="IRuntimePlatform"/> instance.
/// </summary>
@ -207,6 +209,17 @@ namespace Avalonia.Controls
public TAppBuilder UseAvaloniaModules() => AfterSetup(builder => SetupAvaloniaModules());
private bool CheckSetup { get; set; } = true;
/// <summary>
/// Set this AppBuilder to ignore the setup check. Used for testing purposes.
/// </summary>
internal TAppBuilder IgnoreSetupCheck()
{
CheckSetup = false;
return Self;
}
private void SetupAvaloniaModules()
{
var moduleInitializers = from assembly in AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetLoadedAssemblies()
@ -252,6 +265,13 @@ namespace Avalonia.Controls
throw new InvalidOperationException("No rendering system configured.");
}
if (s_setupWasAlreadyCalled && CheckSetup)
{
throw new InvalidOperationException("Setup was already called on one of AppBuilder instances");
}
s_setupWasAlreadyCalled = true;
Instance.RegisterServices();
RuntimePlatformServicesInitializer();
WindowingSubsystemInitializer();

9
src/Avalonia.Controls/Application.cs

@ -175,6 +175,15 @@ namespace Avalonia
closable.Closed += (s, e) => source.Cancel();
Dispatcher.UIThread.MainLoop(source.Token);
}
/// <summary>
/// Runs the application's main loop until the <see cref="CancellationToken"/> is cancelled.
/// </summary>
/// <param name="token">The token to track</param>
public void Run(CancellationToken token)
{
Dispatcher.UIThread.MainLoop(token);
}
/// <summary>
/// Exits the application

4
src/Avalonia.Controls/Avalonia.Controls.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Controls.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Controls.xml</DocumentationFile>
<NoWarn>CS1591;CS0067</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -21,7 +21,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Controls.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Controls.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

2
src/Avalonia.Controls/Carousel.cs

@ -24,7 +24,7 @@ namespace Avalonia.Controls
/// Defines the <see cref="Transition"/> property.
/// </summary>
public static readonly StyledProperty<IPageTransition> TransitionProperty =
AvaloniaProperty.Register<Carousel, IPageTransition>("Transition");
AvaloniaProperty.Register<Carousel, IPageTransition>(nameof(Transition));
/// <summary>
/// The default value of <see cref="ItemsControl.ItemsPanelProperty"/> for

6
src/Avalonia.Controls/ColumnDefinition.cs

@ -12,19 +12,19 @@ namespace Avalonia.Controls
/// Defines the <see cref="MaxWidth"/> property.
/// </summary>
public static readonly StyledProperty<double> MaxWidthProperty =
AvaloniaProperty.Register<ColumnDefinition, double>("MaxWidth", double.PositiveInfinity);
AvaloniaProperty.Register<ColumnDefinition, double>(nameof(MaxWidth), double.PositiveInfinity);
/// <summary>
/// Defines the <see cref="MinWidth"/> property.
/// </summary>
public static readonly StyledProperty<double> MinWidthProperty =
AvaloniaProperty.Register<ColumnDefinition, double>("MinWidth");
AvaloniaProperty.Register<ColumnDefinition, double>(nameof(MinWidth));
/// <summary>
/// Defines the <see cref="Width"/> property.
/// </summary>
public static readonly StyledProperty<GridLength> WidthProperty =
AvaloniaProperty.Register<ColumnDefinition, GridLength>("Width", new GridLength(1, GridUnitType.Star));
AvaloniaProperty.Register<ColumnDefinition, GridLength>(nameof(Width), new GridLength(1, GridUnitType.Star));
/// <summary>
/// Initializes a new instance of the <see cref="ColumnDefinition"/> class.

1
src/Avalonia.Controls/ContentControl.cs

@ -51,6 +51,7 @@ namespace Avalonia.Controls
/// Gets or sets the content to display.
/// </summary>
[Content]
[DependsOn(nameof(ContentTemplate))]
public object Content
{
get { return GetValue(ContentProperty); }

14
src/Avalonia.Controls/Control.cs

@ -487,11 +487,6 @@ namespace Avalonia.Controls
void ILogical.NotifyResourcesChanged(ResourcesChangedEventArgs e)
{
ResourcesChanged?.Invoke(this, new ResourcesChangedEventArgs());
foreach (var child in LogicalChildren)
{
child.NotifyResourcesChanged(e);
}
}
/// <inheritdoc/>
@ -536,6 +531,15 @@ namespace Avalonia.Controls
}
_parent = (IControl)parent;
if (old != null)
{
old.ResourcesChanged -= ThisResourcesChanged;
}
if (_parent != null)
{
_parent.ResourcesChanged += ThisResourcesChanged;
}
((ILogical)this).NotifyResourcesChanged(new ResourcesChangedEventArgs());
if (_parent is IStyleRoot || _parent?.IsAttachedToLogicalTree == true || this is IStyleRoot)

2
src/Avalonia.Controls/DropDown.cs

@ -38,7 +38,7 @@ namespace Avalonia.Controls
/// Defines the <see cref="SelectionBoxItem"/> property.
/// </summary>
public static readonly DirectProperty<DropDown, object> SelectionBoxItemProperty =
AvaloniaProperty.RegisterDirect<DropDown, object>("SelectionBoxItem", o => o.SelectionBoxItem);
AvaloniaProperty.RegisterDirect<DropDown, object>(nameof(SelectionBoxItem), o => o.SelectionBoxItem);
private bool _isDropDownOpen;
private Popup _popup;

15
src/Avalonia.Controls/Presenters/ContentPresenter.cs

@ -8,6 +8,7 @@ using Avalonia.Controls.Templates;
using Avalonia.Layout;
using Avalonia.LogicalTree;
using Avalonia.Media;
using Avalonia.Metadata;
using Avalonia.VisualTree;
namespace Avalonia.Controls.Presenters
@ -139,6 +140,7 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Gets or sets the content to be displayed by the presenter.
/// </summary>
[DependsOn(nameof(ContentTemplate))]
public object Content
{
get { return GetValue(ContentProperty); }
@ -255,18 +257,9 @@ namespace Avalonia.Controls.Presenters
LogicalChildren.Remove(oldChild);
}
if (newChild.Parent == null)
if (newChild.Parent == null && TemplatedParent == null)
{
var templatedLogicalParent = TemplatedParent as ILogical;
if (templatedLogicalParent != null)
{
((ISetLogicalParent)newChild).SetParent(templatedLogicalParent);
}
else
{
LogicalChildren.Add(newChild);
}
LogicalChildren.Add(newChild);
}
VisualChildren.Add(newChild);

2
src/Avalonia.Controls/Primitives/HeaderedContentControl.cs

@ -12,7 +12,7 @@ namespace Avalonia.Controls.Primitives
/// Defines the <see cref="Header"/> property.
/// </summary>
public static readonly StyledProperty<object> HeaderProperty =
AvaloniaProperty.Register<ContentControl, object>("Header");
AvaloniaProperty.Register<ContentControl, object>(nameof(Header));
/// <summary>
/// Gets or sets the header content.

31
src/Avalonia.Controls/Primitives/PopupRoot.cs

@ -8,6 +8,7 @@ using Avalonia.Interactivity;
using Avalonia.Layout;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Styling;
using Avalonia.VisualTree;
using JetBrains.Annotations;
@ -16,7 +17,7 @@ namespace Avalonia.Controls.Primitives
/// <summary>
/// The root window of a <see cref="Popup"/>.
/// </summary>
public class PopupRoot : WindowBase, IInteractive, IHostedVisualTreeRoot, IDisposable
public class PopupRoot : WindowBase, IInteractive, IHostedVisualTreeRoot, IDisposable, IStyleHost
{
private IDisposable _presenterSubscription;
@ -66,6 +67,11 @@ namespace Avalonia.Controls.Primitives
/// </summary>
IVisual IHostedVisualTreeRoot.Host => Parent;
/// <summary>
/// Gets the styling parent of the popup root.
/// </summary>
IStyleHost IStyleHost.StylingParent => Parent;
/// <inheritdoc/>
public void Dispose() => PlatformImpl?.Dispose();
@ -90,20 +96,23 @@ namespace Avalonia.Controls.Primitives
private void SetTemplatedParentAndApplyChildTemplates(IControl control)
{
var templatedParent = Parent.TemplatedParent;
if (control.TemplatedParent == null)
if (control != null)
{
control.SetValue(TemplatedParentProperty, templatedParent);
}
var templatedParent = Parent.TemplatedParent;
control.ApplyTemplate();
if (control.TemplatedParent == null)
{
control.SetValue(TemplatedParentProperty, templatedParent);
}
if (!(control is IPresenter) && control.TemplatedParent == templatedParent)
{
foreach (IControl child in control.GetVisualChildren())
control.ApplyTemplate();
if (!(control is IPresenter) && control.TemplatedParent == templatedParent)
{
SetTemplatedParentAndApplyChildTemplates(child);
foreach (IControl child in control.GetVisualChildren())
{
SetTemplatedParentAndApplyChildTemplates(child);
}
}
}
}

2
src/Avalonia.Controls/Primitives/TemplatedControl.cs

@ -75,7 +75,7 @@ namespace Avalonia.Controls.Primitives
/// Defines the <see cref="Template"/> property.
/// </summary>
public static readonly StyledProperty<IControlTemplate> TemplateProperty =
AvaloniaProperty.Register<TemplatedControl, IControlTemplate>("Template");
AvaloniaProperty.Register<TemplatedControl, IControlTemplate>(nameof(Template));
/// <summary>
/// Defines the IsTemplateFocusTarget attached property.

6
src/Avalonia.Controls/Primitives/Thumb.cs

@ -11,13 +11,13 @@ namespace Avalonia.Controls.Primitives
public class Thumb : TemplatedControl
{
public static readonly RoutedEvent<VectorEventArgs> DragStartedEvent =
RoutedEvent.Register<Thumb, VectorEventArgs>("DragStarted", RoutingStrategies.Bubble);
RoutedEvent.Register<Thumb, VectorEventArgs>(nameof(DragStarted), RoutingStrategies.Bubble);
public static readonly RoutedEvent<VectorEventArgs> DragDeltaEvent =
RoutedEvent.Register<Thumb, VectorEventArgs>("DragDelta", RoutingStrategies.Bubble);
RoutedEvent.Register<Thumb, VectorEventArgs>(nameof(DragDelta), RoutingStrategies.Bubble);
public static readonly RoutedEvent<VectorEventArgs> DragCompletedEvent =
RoutedEvent.Register<Thumb, VectorEventArgs>("DragCompleted", RoutingStrategies.Bubble);
RoutedEvent.Register<Thumb, VectorEventArgs>(nameof(DragCompleted), RoutingStrategies.Bubble);
private Point? _lastPoint;

1
src/Avalonia.Controls/Primitives/ToggleButton.cs

@ -14,6 +14,7 @@ namespace Avalonia.Controls.Primitives
nameof(IsChecked),
o => o.IsChecked,
(o, v) => o.IsChecked = v,
unsetValue: false,
defaultBindingMode: BindingMode.TwoWay);
public static readonly StyledProperty<bool> IsThreeStateProperty =

12
src/Avalonia.Controls/Primitives/Track.cs

@ -154,7 +154,11 @@ namespace Avalonia.Controls.Primitives
if (increaseButton != null)
{
increaseButton.Arrange(new Rect(firstWidth + thumbWidth, 0, remaining - firstWidth, finalSize.Height));
increaseButton.Arrange(new Rect(
firstWidth + thumbWidth,
0,
Math.Max(0, remaining - firstWidth),
finalSize.Height));
}
}
else
@ -185,7 +189,11 @@ namespace Avalonia.Controls.Primitives
if (increaseButton != null)
{
increaseButton.Arrange(new Rect(0, firstHeight + thumbHeight, finalSize.Width, Math.Max(remaining - firstHeight, 0)));
increaseButton.Arrange(new Rect(
0,
firstHeight + thumbHeight,
finalSize.Width,
Math.Max(remaining - firstHeight, 0)));
}
}

6
src/Avalonia.Controls/RowDefinition.cs

@ -12,19 +12,19 @@ namespace Avalonia.Controls
/// Defines the <see cref="MaxHeight"/> property.
/// </summary>
public static readonly StyledProperty<double> MaxHeightProperty =
AvaloniaProperty.Register<RowDefinition, double>("MaxHeight", double.PositiveInfinity);
AvaloniaProperty.Register<RowDefinition, double>(nameof(MaxHeight), double.PositiveInfinity);
/// <summary>
/// Defines the <see cref="MinHeight"/> property.
/// </summary>
public static readonly StyledProperty<double> MinHeightProperty =
AvaloniaProperty.Register<RowDefinition, double>("MinHeight");
AvaloniaProperty.Register<RowDefinition, double>(nameof(MinHeight));
/// <summary>
/// Defines the <see cref="Height"/> property.
/// </summary>
public static readonly StyledProperty<GridLength> HeightProperty =
AvaloniaProperty.Register<RowDefinition, GridLength>("Height", new GridLength(1, GridUnitType.Star));
AvaloniaProperty.Register<RowDefinition, GridLength>(nameof(Height), new GridLength(1, GridUnitType.Star));
/// <summary>
/// Initializes a new instance of the <see cref="RowDefinition"/> class.

4
src/Avalonia.Controls/Shapes/Line.cs

@ -8,10 +8,10 @@ namespace Avalonia.Controls.Shapes
public class Line : Shape
{
public static readonly StyledProperty<Point> StartPointProperty =
AvaloniaProperty.Register<Line, Point>("StartPoint");
AvaloniaProperty.Register<Line, Point>(nameof(StartPoint));
public static readonly StyledProperty<Point> EndPointProperty =
AvaloniaProperty.Register<Line, Point>("EndPoint");
AvaloniaProperty.Register<Line, Point>(nameof(EndPoint));
static Line()
{

2
src/Avalonia.Controls/Shapes/Path.cs

@ -9,7 +9,7 @@ namespace Avalonia.Controls.Shapes
public class Path : Shape
{
public static readonly StyledProperty<Geometry> DataProperty =
AvaloniaProperty.Register<Path, Geometry>("Data");
AvaloniaProperty.Register<Path, Geometry>(nameof(Data));
static Path()
{

29
src/Avalonia.Controls/Shapes/Shape.cs

@ -12,19 +12,19 @@ namespace Avalonia.Controls.Shapes
public abstract class Shape : Control
{
public static readonly StyledProperty<IBrush> FillProperty =
AvaloniaProperty.Register<Shape, IBrush>("Fill");
AvaloniaProperty.Register<Shape, IBrush>(nameof(Fill));
public static readonly StyledProperty<Stretch> StretchProperty =
AvaloniaProperty.Register<Shape, Stretch>("Stretch");
AvaloniaProperty.Register<Shape, Stretch>(nameof(Stretch));
public static readonly StyledProperty<IBrush> StrokeProperty =
AvaloniaProperty.Register<Shape, IBrush>("Stroke");
AvaloniaProperty.Register<Shape, IBrush>(nameof(Stroke));
public static readonly StyledProperty<AvaloniaList<double>> StrokeDashArrayProperty =
AvaloniaProperty.Register<Shape, AvaloniaList<double>>("StrokeDashArray");
public static readonly StyledProperty<double> StrokeThicknessProperty =
AvaloniaProperty.Register<Shape, double>("StrokeThickness");
AvaloniaProperty.Register<Shape, double>(nameof(StrokeThickness));
private Matrix _transform = Matrix.Identity;
private Geometry _definingGeometry;
@ -61,12 +61,26 @@ namespace Avalonia.Controls.Shapes
{
get
{
if (_renderedGeometry == null)
if (_renderedGeometry == null && DefiningGeometry != null)
{
if (DefiningGeometry != null)
if (_transform == Matrix.Identity)
{
_renderedGeometry = DefiningGeometry;
}
else
{
_renderedGeometry = DefiningGeometry.Clone();
_renderedGeometry.Transform = new MatrixTransform(_transform);
if (_renderedGeometry.Transform == null ||
_renderedGeometry.Transform.Value == Matrix.Identity)
{
_renderedGeometry.Transform = new MatrixTransform(_transform);
}
else
{
_renderedGeometry.Transform = new MatrixTransform(
_renderedGeometry.Transform.Value * _transform);
}
}
}
@ -193,6 +207,7 @@ namespace Avalonia.Controls.Shapes
return finalSize;
}
private Size CalculateShapeSizeAndSetTransform(Size availableSize)
{
// This should probably use GetRenderBounds(strokeThickness) but then the calculations

18
src/Avalonia.Controls/TextBox.cs

@ -21,13 +21,13 @@ namespace Avalonia.Controls
public class TextBox : TemplatedControl, UndoRedoHelper<TextBox.UndoRedoState>.IUndoRedoHost
{
public static readonly StyledProperty<bool> AcceptsReturnProperty =
AvaloniaProperty.Register<TextBox, bool>("AcceptsReturn");
AvaloniaProperty.Register<TextBox, bool>(nameof(AcceptsReturn));
public static readonly StyledProperty<bool> AcceptsTabProperty =
AvaloniaProperty.Register<TextBox, bool>("AcceptsTab");
AvaloniaProperty.Register<TextBox, bool>(nameof(AcceptsTab));
public static readonly DirectProperty<TextBox, bool> CanScrollHorizontallyProperty =
AvaloniaProperty.RegisterDirect<TextBox, bool>("CanScrollHorizontally", o => o.CanScrollHorizontally);
AvaloniaProperty.RegisterDirect<TextBox, bool>(nameof(CanScrollHorizontally), o => o.CanScrollHorizontally);
public static readonly DirectProperty<TextBox, int> CaretIndexProperty =
AvaloniaProperty.RegisterDirect<TextBox, int>(
@ -69,10 +69,10 @@ namespace Avalonia.Controls
TextBlock.TextWrappingProperty.AddOwner<TextBox>();
public static readonly StyledProperty<string> WatermarkProperty =
AvaloniaProperty.Register<TextBox, string>("Watermark");
AvaloniaProperty.Register<TextBox, string>(nameof(Watermark));
public static readonly StyledProperty<bool> UseFloatingWatermarkProperty =
AvaloniaProperty.Register<TextBox, bool>("UseFloatingWatermark");
AvaloniaProperty.Register<TextBox, bool>(nameof(UseFloatingWatermark));
struct UndoRedoState : IEquatable<UndoRedoState>
{
@ -178,6 +178,10 @@ namespace Avalonia.Controls
{
value = CoerceCaretIndex(value);
SetAndRaise(SelectionStartProperty, ref _selectionStart, value);
if (SelectionStart == SelectionEnd)
{
CaretIndex = SelectionStart;
}
}
}
@ -192,6 +196,10 @@ namespace Avalonia.Controls
{
value = CoerceCaretIndex(value);
SetAndRaise(SelectionEndProperty, ref _selectionEnd, value);
if (SelectionStart == SelectionEnd)
{
CaretIndex = SelectionEnd;
}
}
}

4
src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj

@ -11,7 +11,7 @@
<DefineConstants>TRACE;DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Diagnostics.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Diagnostics.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -21,7 +21,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Diagnostics.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Diagnostics.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

2
src/Avalonia.Diagnostics/Views/ControlDetailsView.cs

@ -14,7 +14,7 @@ namespace Avalonia.Diagnostics.Views
internal class ControlDetailsView : UserControl
{
private static readonly StyledProperty<ControlDetailsViewModel> ViewModelProperty =
AvaloniaProperty.Register<ControlDetailsView, ControlDetailsViewModel>("ViewModel");
AvaloniaProperty.Register<ControlDetailsView, ControlDetailsViewModel>(nameof(ViewModel));
private SimpleGrid _grid;
public ControlDetailsView()

2
src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj

@ -5,7 +5,7 @@
<DefineConstants>$(DefineConstants);DOTNETCORE</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<DocumentationFile>bin\$(Configuration)\Avalonia.DotNetCoreRuntime.XML</DocumentationFile>
<DocumentationFile>bin\$(Configuration)\Avalonia.DotNetCoreRuntime.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\Shared\SharedAssemblyInfo.cs">

16
src/Avalonia.HtmlRenderer/HtmlControl.cs

@ -74,29 +74,29 @@ namespace Avalonia.Controls.Html
protected Point _lastScrollOffset;
public static readonly AvaloniaProperty AvoidImagesLateLoadingProperty =
PropertyHelper.Register<HtmlControl, bool>("AvoidImagesLateLoading", false, OnAvaloniaProperty_valueChanged);
PropertyHelper.Register<HtmlControl, bool>(nameof(AvoidImagesLateLoading), false, OnAvaloniaProperty_valueChanged);
public static readonly AvaloniaProperty IsSelectionEnabledProperty =
PropertyHelper.Register<HtmlControl, bool>("IsSelectionEnabled", true, OnAvaloniaProperty_valueChanged);
PropertyHelper.Register<HtmlControl, bool>(nameof(IsSelectionEnabled), true, OnAvaloniaProperty_valueChanged);
public static readonly AvaloniaProperty IsContextMenuEnabledProperty =
PropertyHelper.Register<HtmlControl, bool>("IsContextMenuEnabled", true, OnAvaloniaProperty_valueChanged);
PropertyHelper.Register<HtmlControl, bool>(nameof(IsContextMenuEnabled), true, OnAvaloniaProperty_valueChanged);
public static readonly AvaloniaProperty BaseStylesheetProperty =
PropertyHelper.Register<HtmlControl, string>("BaseStylesheet", null, OnAvaloniaProperty_valueChanged);
PropertyHelper.Register<HtmlControl, string>(nameof(BaseStylesheet), null, OnAvaloniaProperty_valueChanged);
public static readonly AvaloniaProperty TextProperty =
PropertyHelper.Register<HtmlControl, string>("Text", null, OnAvaloniaProperty_valueChanged);
PropertyHelper.Register<HtmlControl, string>(nameof(Text), null, OnAvaloniaProperty_valueChanged);
public static readonly StyledProperty<IBrush> BackgroundProperty =
Border.BackgroundProperty.AddOwner<HtmlControl>();
public static readonly AvaloniaProperty BorderThicknessProperty =
AvaloniaProperty.Register<HtmlControl, Thickness>("BorderThickness", new Thickness(0));
AvaloniaProperty.Register<HtmlControl, Thickness>(nameof(BorderThickness), new Thickness(0));
public static readonly AvaloniaProperty BorderBrushProperty =
AvaloniaProperty.Register<HtmlControl, IBrush>("BorderBrush");
AvaloniaProperty.Register<HtmlControl, IBrush>(nameof(BorderBrush));
public static readonly AvaloniaProperty PaddingProperty =
AvaloniaProperty.Register<HtmlControl, Thickness>("Padding", new Thickness(0));
AvaloniaProperty.Register<HtmlControl, Thickness>(nameof(Padding), new Thickness(0));
public static readonly RoutedEvent LoadCompleteEvent =
RoutedEvent.Register<RoutedEventArgs>("LoadComplete", RoutingStrategies.Bubble, typeof(HtmlControl));

4
src/Avalonia.Input/Avalonia.Input.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Input.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Input.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -21,7 +21,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Input.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Input.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

18
src/Avalonia.Input/InputElement.cs

@ -31,43 +31,43 @@ namespace Avalonia.Input
/// Defines the <see cref="IsEnabledCore"/> property.
/// </summary>
public static readonly StyledProperty<bool> IsEnabledCoreProperty =
AvaloniaProperty.Register<InputElement, bool>("IsEnabledCore", true);
AvaloniaProperty.Register<InputElement, bool>(nameof(IsEnabledCore), true);
/// <summary>
/// Gets or sets associated mouse cursor.
/// </summary>
public static readonly StyledProperty<Cursor> CursorProperty =
AvaloniaProperty.Register<InputElement, Cursor>("Cursor", null, true);
AvaloniaProperty.Register<InputElement, Cursor>(nameof(Cursor), null, true);
/// <summary>
/// Defines the <see cref="IsFocused"/> property.
/// </summary>
public static readonly DirectProperty<InputElement, bool> IsFocusedProperty =
AvaloniaProperty.RegisterDirect<InputElement, bool>("IsFocused", o => o.IsFocused);
AvaloniaProperty.RegisterDirect<InputElement, bool>(nameof(IsFocused), o => o.IsFocused);
/// <summary>
/// Defines the <see cref="IsHitTestVisible"/> property.
/// </summary>
public static readonly StyledProperty<bool> IsHitTestVisibleProperty =
AvaloniaProperty.Register<InputElement, bool>("IsHitTestVisible", true);
AvaloniaProperty.Register<InputElement, bool>(nameof(IsHitTestVisible), true);
/// <summary>
/// Defines the <see cref="IsPointerOver"/> property.
/// </summary>
public static readonly DirectProperty<InputElement, bool> IsPointerOverProperty =
AvaloniaProperty.RegisterDirect<InputElement, bool>("IsPointerOver", o => o.IsPointerOver);
AvaloniaProperty.RegisterDirect<InputElement, bool>(nameof(IsPointerOver), o => o.IsPointerOver);
/// <summary>
/// Defines the <see cref="GotFocus"/> event.
/// </summary>
public static readonly RoutedEvent<GotFocusEventArgs> GotFocusEvent =
RoutedEvent.Register<InputElement, GotFocusEventArgs>("GotFocus", RoutingStrategies.Bubble);
RoutedEvent.Register<InputElement, GotFocusEventArgs>(nameof(GotFocus), RoutingStrategies.Bubble);
/// <summary>
/// Defines the <see cref="LostFocus"/> event.
/// </summary>
public static readonly RoutedEvent<RoutedEventArgs> LostFocusEvent =
RoutedEvent.Register<InputElement, RoutedEventArgs>("LostFocus", RoutingStrategies.Bubble);
RoutedEvent.Register<InputElement, RoutedEventArgs>(nameof(LostFocus), RoutingStrategies.Bubble);
/// <summary>
/// Defines the <see cref="KeyDown"/> event.
@ -97,13 +97,13 @@ namespace Avalonia.Input
/// Defines the <see cref="PointerEnter"/> event.
/// </summary>
public static readonly RoutedEvent<PointerEventArgs> PointerEnterEvent =
RoutedEvent.Register<InputElement, PointerEventArgs>("PointerEnter", RoutingStrategies.Direct);
RoutedEvent.Register<InputElement, PointerEventArgs>(nameof(PointerEnter), RoutingStrategies.Direct);
/// <summary>
/// Defines the <see cref="PointerLeave"/> event.
/// </summary>
public static readonly RoutedEvent<PointerEventArgs> PointerLeaveEvent =
RoutedEvent.Register<InputElement, PointerEventArgs>("PointerLeave", RoutingStrategies.Direct);
RoutedEvent.Register<InputElement, PointerEventArgs>(nameof(PointerLeave), RoutingStrategies.Direct);
/// <summary>
/// Defines the <see cref="PointerMoved"/> event.

6
src/Avalonia.Input/KeyBinding.cs

@ -10,7 +10,7 @@ namespace Avalonia.Input
public class KeyBinding : AvaloniaObject
{
public static readonly StyledProperty<ICommand> CommandProperty =
AvaloniaProperty.Register<KeyBinding, ICommand>("Command");
AvaloniaProperty.Register<KeyBinding, ICommand>(nameof(Command));
public ICommand Command
{
@ -19,7 +19,7 @@ namespace Avalonia.Input
}
public static readonly StyledProperty<object> CommandParameterProperty =
AvaloniaProperty.Register<KeyBinding, object>("CommandParameter");
AvaloniaProperty.Register<KeyBinding, object>(nameof(CommandParameter));
public object CommandParameter
{
@ -28,7 +28,7 @@ namespace Avalonia.Input
}
public static readonly StyledProperty<KeyGesture> GestureProperty =
AvaloniaProperty.Register<KeyBinding, KeyGesture>("Gesture");
AvaloniaProperty.Register<KeyBinding, KeyGesture>(nameof(Gesture));
public KeyGesture Gesture
{

17
src/Avalonia.Input/KeyGesture.cs

@ -111,6 +111,21 @@ namespace Avalonia.Input
return string.Join(" + ", parts);
}
public bool Matches(KeyEventArgs keyEvent) => keyEvent.Key == Key && keyEvent.Modifiers == Modifiers;
public bool Matches(KeyEventArgs keyEvent) => ResolveNumPadOperationKey(keyEvent.Key) == Key && keyEvent.Modifiers == Modifiers;
private Key ResolveNumPadOperationKey(Key key)
{
switch (key)
{
case Key.Add:
return Key.OemPlus;
case Key.Subtract:
return Key.OemMinus;
case Key.Decimal:
return Key.OemPeriod;
default:
return key;
}
}
}
}

4
src/Avalonia.Interactivity/Avalonia.Interactivity.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Interactivity.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Interactivity.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -21,7 +21,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Interactivity.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Interactivity.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

4
src/Avalonia.Layout/Avalonia.Layout.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Layout.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Layout.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -21,7 +21,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Layout.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Layout.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

4
src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Logging.Serilog.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Logging.Serilog.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugType>pdbonly</DebugType>
@ -20,7 +20,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Logging.Serilog.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Logging.Serilog.xml</DocumentationFile>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>

4
src/Avalonia.Styling/Avalonia.Styling.csproj

@ -12,7 +12,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Styling.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Styling.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@ -22,7 +22,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Styling.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Styling.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

4
src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Themes.Default.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Themes.Default.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugType>pdbonly</DebugType>
@ -20,7 +20,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Themes.Default.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Themes.Default.xml</DocumentationFile>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>

2
src/Avalonia.Themes.Default/Button.xaml

@ -13,8 +13,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"
TextBlock.Foreground="{TemplateBinding Foreground}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"

2
src/Avalonia.Themes.Default/CalendarButton.xaml

@ -29,8 +29,8 @@
<!--Focusable="False"-->
<ContentControl Name="Content"
Foreground="#FF333333"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
FontSize="{TemplateBinding FontSize}"

2
src/Avalonia.Themes.Default/CalendarDayButton.xaml

@ -30,8 +30,8 @@
Fill="{TemplateBinding Background}"/>
<ContentControl Name="Content"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
FontSize="{TemplateBinding FontSize}"

2
src/Avalonia.Themes.Default/CheckBox.xaml

@ -31,8 +31,8 @@
</Panel>
</Border>
<ContentPresenter Name="PART_ContentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="4,0,0,0"
VerticalAlignment="Center"
Grid.Column="1"/>

2
src/Avalonia.Themes.Default/ContentControl.xaml

@ -5,8 +5,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter>

2
src/Avalonia.Themes.Default/DropDownItem.xaml

@ -10,8 +10,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
Padding="{TemplateBinding Padding}"/>

2
src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml

@ -7,8 +7,8 @@
<Border Background="{TemplateBinding Background}">
<AdornerDecorator>
<ContentPresenter Name="PART_ContentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="{TemplateBinding Padding}"/>
</AdornerDecorator>
</Border>

8
src/Avalonia.Themes.Default/Expander.xaml

@ -16,8 +16,8 @@
<ContentPresenter Name="PART_ContentPresenter"
Grid.Row="1"
IsVisible="{TemplateBinding IsExpanded}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Grid>
@ -34,8 +34,8 @@
<ContentPresenter Name="PART_ContentPresenter"
Grid.Row="0"
IsVisible="{TemplateBinding IsExpanded}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Grid>
@ -52,8 +52,8 @@
<ContentPresenter Name="PART_ContentPresenter"
Grid.Column="1"
IsVisible="{TemplateBinding IsExpanded}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Grid>
@ -70,8 +70,8 @@
<ContentPresenter Name="PART_ContentPresenter"
Grid.Column="0"
IsVisible="{TemplateBinding IsExpanded}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Grid>

2
src/Avalonia.Themes.Default/LayoutTransformControl.xaml

@ -5,8 +5,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter>

2
src/Avalonia.Themes.Default/ListBoxItem.xaml

@ -7,8 +7,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter>

2
src/Avalonia.Themes.Default/PopupRoot.xaml

@ -4,8 +4,8 @@
<ControlTemplate>
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter>

2
src/Avalonia.Themes.Default/RadioButton.xaml

@ -29,8 +29,8 @@
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
<ContentPresenter Name="PART_ContentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="4,0,0,0"
VerticalAlignment="Center"
Grid.Column="1"/>

2
src/Avalonia.Themes.Default/RepeatButton.xaml

@ -20,8 +20,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"
TextBlock.Foreground="{TemplateBinding Foreground}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"

2
src/Avalonia.Themes.Default/TabStripItem.xaml

@ -9,8 +9,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter>

2
src/Avalonia.Themes.Default/ToggleButton.xaml

@ -13,8 +13,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"
TextBlock.Foreground="{TemplateBinding Foreground}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"

2
src/Avalonia.Themes.Default/ToolTip.xaml

@ -9,8 +9,8 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter>

2
src/Avalonia.Themes.Default/Window.xaml

@ -7,8 +7,8 @@
<Border Background="{TemplateBinding Background}">
<AdornerDecorator>
<ContentPresenter Name="PART_ContentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Margin="{TemplateBinding Padding}"/>
</AdornerDecorator>
</Border>

2
src/Avalonia.Visuals/Media/Geometry.cs

@ -15,7 +15,7 @@ namespace Avalonia.Media
/// Defines the <see cref="Transform"/> property.
/// </summary>
public static readonly StyledProperty<Transform> TransformProperty =
AvaloniaProperty.Register<Geometry, Transform>("Transform");
AvaloniaProperty.Register<Geometry, Transform>(nameof(Transform));
/// <summary>
/// Initializes static members of the <see cref="Geometry"/> class.

2
src/Avalonia.Visuals/Media/ImageBrush.cs

@ -14,7 +14,7 @@ namespace Avalonia.Media
/// Defines the <see cref="Visual"/> property.
/// </summary>
public static readonly StyledProperty<IBitmap> SourceProperty =
AvaloniaProperty.Register<ImageBrush, IBitmap>("Source");
AvaloniaProperty.Register<ImageBrush, IBitmap>(nameof(Source));
/// <summary>
/// Initializes a new instance of the <see cref="ImageBrush"/> class.

2
src/Avalonia.Visuals/Media/MatrixTransform.cs

@ -15,7 +15,7 @@ namespace Avalonia.Media
/// Defines the <see cref="Matrix"/> property.
/// </summary>
public static readonly StyledProperty<Matrix> MatrixProperty =
AvaloniaProperty.Register<MatrixTransform, Matrix>("Matrix", Matrix.Identity);
AvaloniaProperty.Register<MatrixTransform, Matrix>(nameof(Matrix), Matrix.Identity);
/// <summary>
/// Initializes a new instance of the <see cref="MatrixTransform"/> class.

2
src/Avalonia.Visuals/Media/RotateTransform.cs

@ -15,7 +15,7 @@ namespace Avalonia.Media
/// Defines the <see cref="Angle"/> property.
/// </summary>
public static readonly StyledProperty<double> AngleProperty =
AvaloniaProperty.Register<RotateTransform, double>("Angle");
AvaloniaProperty.Register<RotateTransform, double>(nameof(Angle));
/// <summary>
/// Initializes a new instance of the <see cref="RotateTransform"/> class.

4
src/Avalonia.Visuals/Media/TranslateTransform.cs

@ -15,13 +15,13 @@ namespace Avalonia.Media
/// Defines the <see cref="X"/> property.
/// </summary>
public static readonly StyledProperty<double> XProperty =
AvaloniaProperty.Register<TranslateTransform, double>("X");
AvaloniaProperty.Register<TranslateTransform, double>(nameof(X));
/// <summary>
/// Defines the <see cref="Y"/> property.
/// </summary>
public static readonly StyledProperty<double> YProperty =
AvaloniaProperty.Register<TranslateTransform, double>("Y");
AvaloniaProperty.Register<TranslateTransform, double>(nameof(Y));
/// <summary>
/// Initializes a new instance of the <see cref="TranslateTransform"/> class.

2
src/Avalonia.Visuals/Media/VisualBrush.cs

@ -14,7 +14,7 @@ namespace Avalonia.Media
/// Defines the <see cref="Visual"/> property.
/// </summary>
public static readonly StyledProperty<IVisual> VisualProperty =
AvaloniaProperty.Register<VisualBrush, IVisual>("Visual");
AvaloniaProperty.Register<VisualBrush, IVisual>(nameof(Visual));
/// <summary>
/// Initializes a new instance of the <see cref="VisualBrush"/> class.

3
src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj

@ -22,7 +22,7 @@
<DefineConstants>NETSTANDARD1_3;PCL;NETSTANDARD</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Markup.Xaml.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Markup.Xaml.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<ItemGroup>
@ -91,6 +91,7 @@
<Compile Include="Templates\TemplateContent.cs" />
<Compile Include="Templates\TemplateLoader.cs" />
<Compile Include="Templates\TreeDataTemplate.cs" />
<Compile Include="XamlLoadException.cs" />
<Compile Include="PortableXaml\portable.xaml.github\src\Portable.Xaml\**\*.cs" Exclude="PortableXaml\portable.xaml.github\src\Portable.Xaml\Assembly\**\*.cs" />
<Compile Remove="**\UriTypeConverter.cs" />
</ItemGroup>

14
src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoaderPortableXaml.cs

@ -127,7 +127,19 @@ namespace Avalonia.Markup.Xaml
using (var stream = assetLocator.Open(uri, baseUri))
{
return Load(stream, rootInstance, uri);
try
{
return Load(stream, rootInstance, uri);
}
catch (Exception e)
{
var uriString = uri.ToString();
if (!uri.IsAbsoluteUri)
{
uriString = new Uri(baseUri, uri).AbsoluteUri;
}
throw new XamlLoadException("Error loading xaml at " + uriString, e);
}
}
}

2
src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github

@ -1 +1 @@
Subproject commit d50ae8335eb50d4b9606de6f5fa1cbbc78bfd72f
Subproject commit c0664014455392ac221a765e66f9837704339b6f

24
src/Markup/Avalonia.Markup.Xaml/XamlLoadException.cs

@ -0,0 +1,24 @@
using System;
using System.Runtime.Serialization;
namespace Avalonia.Markup.Xaml
{
public class XamlLoadException: Exception
{
public XamlLoadException()
{
}
protected XamlLoadException(SerializationInfo info, StreamingContext context): base(info, context)
{
}
public XamlLoadException(string message): base(message)
{
}
public XamlLoadException(string message, Exception innerException): base(message, innerException)
{
}
}
}

4
src/Markup/Avalonia.Markup/Avalonia.Markup.csproj

@ -11,7 +11,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Markup.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Markup.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@ -21,7 +21,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Markup.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Markup.xml</DocumentationFile>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

4
src/Skia/Avalonia.Skia/FormattedTextImpl.cs

@ -450,7 +450,7 @@ namespace Avalonia.Skia
{
var match = _foregroundBrushes[bi];
len = match.Key.EndIndex - index + 1;
len = match.Key.EndIndex - index;
result = match.Value;
if (len > 0 && len < length)
@ -641,7 +641,7 @@ namespace Avalonia.Skia
Length = length;
}
public int EndIndex => StartIndex + Length - 1;
public int EndIndex => StartIndex + Length;
public int Length { get; private set; }

7
src/Windows/Avalonia.Direct2D1/FramebufferShimRenderTarget.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
using Avalonia.Controls.Platform.Surfaces;
using Avalonia.Direct2D1.Media;
@ -68,9 +69,9 @@ namespace Avalonia.Direct2D1
for (var y = 0; y < _target.Height; y++)
{
UnmanagedMethods.CopyMemory(
_target.Address + _target.RowBytes * y,
l.Data.DataPointer + l.Stride * y,
(uint) Math.Min(l.Stride, _target.RowBytes));
(_target.Address + _target.RowBytes * y),
(l.Data.DataPointer + l.Stride * y),
(UIntPtr)Math.Min(l.Stride, _target.RowBytes));
}
}
Dispose();

7
src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs

@ -3,6 +3,7 @@
using System;
using System.IO;
using System.Runtime.CompilerServices;
using Avalonia.Win32.Interop;
using SharpDX.WIC;
using APixelFormat = Avalonia.Platform.PixelFormat;
@ -74,8 +75,10 @@ namespace Avalonia.Direct2D1.Media
{
for (var row = 0; row < height; row++)
{
UnmanagedMethods.CopyMemory(new IntPtr(l.Data.DataPointer.ToInt64() + row * l.Stride),
new IntPtr(data.ToInt64() + row * stride), (uint) l.Data.Pitch);
UnmanagedMethods.CopyMemory(
(l.Data.DataPointer + row * l.Stride),
(data + row * stride),
(UIntPtr) l.Data.Pitch);
}
}
}

4
src/Windows/Avalonia.Win32/Avalonia.Win32.csproj

@ -22,7 +22,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\Avalonia.Win32.XML</DocumentationFile>
<DocumentationFile>bin\Debug\Avalonia.Win32.xml</DocumentationFile>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn>CS1591</NoWarn>
</PropertyGroup>
@ -33,7 +33,7 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Avalonia.Win32.XML</DocumentationFile>
<DocumentationFile>bin\Release\Avalonia.Win32.xml</DocumentationFile>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn>CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

6
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

@ -948,9 +948,9 @@ namespace Avalonia.Win32.Interop
uint dwMaximumSizeLow,
string lpName);
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
[DllImport("msvcrt.dll", EntryPoint="memcpy", SetLastError = false, CallingConvention=CallingConvention.Cdecl)]
public static extern IntPtr CopyMemory(IntPtr dest, IntPtr src, UIntPtr count);
public enum MONITOR
{
MONITOR_DEFAULTTONULL = 0x00000000,

2
tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
<PropertyGroup>
<TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>
<TargetFrameworks>net47;netcoreapp2.0</TargetFrameworks>
<OutputType>Library</OutputType>
</PropertyGroup>
<Import Project="..\..\build\UnitTests.NetCore.targets" />

6
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs

@ -506,17 +506,17 @@ namespace Avalonia.Base.UnitTests
{
public static readonly DirectProperty<Class1, string> FooProperty =
AvaloniaProperty.RegisterDirect<Class1, string>(
"Foo",
nameof(Foo),
o => o.Foo,
(o, v) => o.Foo = v,
unsetValue: "unset");
public static readonly DirectProperty<Class1, string> BarProperty =
AvaloniaProperty.RegisterDirect<Class1, string>("Bar", o => o.Bar);
AvaloniaProperty.RegisterDirect<Class1, string>(nameof(Bar), o => o.Bar);
public static readonly DirectProperty<Class1, int> BazProperty =
AvaloniaProperty.RegisterDirect<Class1, int>(
"Bar",
nameof(Baz),
o => o.Baz,
(o, v) => o.Baz = v,
unsetValue: -1);

2
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_GetSubject.cs

@ -37,7 +37,7 @@ namespace Avalonia.Base.UnitTests
private class Class1 : AvaloniaObject
{
public static readonly StyledProperty<string> FooProperty =
AvaloniaProperty.Register<Class1, string>("Foo", "foodefault");
AvaloniaProperty.Register<Class1, string>(nameof(Foo), "foodefault");
public string Foo
{

2
tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs

@ -85,7 +85,7 @@ namespace Avalonia.Base.UnitTests
private class Class1 : AvaloniaObject
{
public static readonly DirectProperty<Class1, string> FooProperty =
AvaloniaProperty.RegisterDirect<Class1, string>("Foo", o => o.Foo, (o, v) => o.Foo = v);
AvaloniaProperty.RegisterDirect<Class1, string>(nameof(Foo), o => o.Foo, (o, v) => o.Foo = v);
private string _foo = "foo";

8
tests/Avalonia.Benchmarks/App.config

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Moq" publicKeyToken="69f491c39445e920" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.1510.2205" newVersion="4.2.1510.2205" />
<assemblyIdentity name="Moq" publicKeyToken="69f491c39445e920" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.1510.2205" newVersion="4.2.1510.2205"/>
</dependentAssembly>
</assemblyBinding>
</runtime>

2
tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj

@ -9,7 +9,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Avalonia.Benchmarks</RootNamespace>
<AssemblyName>Avalonia.Benchmarks</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />

6
tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs

@ -65,6 +65,7 @@ namespace Avalonia.Controls.UnitTests
{
ResetModuleLoadStates();
AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { })
.UseAvaloniaModules()
@ -81,6 +82,7 @@ namespace Avalonia.Controls.UnitTests
{
ResetModuleLoadStates();
var builder = AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { }, "Direct2D1");
builder.UseAvaloniaModules().SetupWithoutStarting();
@ -90,6 +92,7 @@ namespace Avalonia.Controls.UnitTests
ResetModuleLoadStates();
builder = AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { }, "Skia");
builder.UseAvaloniaModules().SetupWithoutStarting();
@ -99,13 +102,14 @@ namespace Avalonia.Controls.UnitTests
}
}
[Fact (Skip = "We don't have rendering modules with dependencies right now")]
[Fact]
public void LoadsRenderingModuleWithoutDependenciesWhenNoModuleMatches()
{
using (AvaloniaLocator.EnterScope())
{
ResetModuleLoadStates();
var builder = AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { }, "TBD");
builder.UseAvaloniaModules().SetupWithoutStarting();

2
tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
<PropertyGroup>
<TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>
<TargetFrameworks>net47;netcoreapp2.0</TargetFrameworks>
<OutputType>Library</OutputType>
</PropertyGroup>
<Import Project="..\..\build\UnitTests.NetCore.targets" />

58
tests/Avalonia.Controls.UnitTests/ContentControlTests.cs

@ -1,6 +1,7 @@
// Copyright (c) The Avalonia 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.Collections.Specialized;
using System.Linq;
using Moq;
@ -11,6 +12,9 @@ using Avalonia.Styling;
using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Xunit;
using Avalonia.Markup.Xaml.Data;
using Avalonia.Data;
using System.Collections.Generic;
namespace Avalonia.Controls.UnitTests
{
@ -273,6 +277,60 @@ namespace Avalonia.Controls.UnitTests
Assert.Null(target.Presenter.Child.DataContext);
}
[Fact]
public void Binding_ContentTemplate_After_Content_Does_Not_Leave_Orpaned_TextBlock()
{
// Test for #1271.
var children = new List<IControl>();
var presenter = new ContentPresenter();
// The content and then the content template property need to be bound with delayed bindings
// as they are in Avalonia.Markup.Xaml.
DelayedBinding.Add(presenter, ContentPresenter.ContentProperty, new Binding("Content")
{
Priority = BindingPriority.TemplatedParent,
RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent),
});
DelayedBinding.Add(presenter, ContentPresenter.ContentTemplateProperty, new Binding("ContentTemplate")
{
Priority = BindingPriority.TemplatedParent,
RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent),
});
presenter.GetObservable(ContentPresenter.ChildProperty).Subscribe(children.Add);
var target = new ContentControl
{
Template = new FuncControlTemplate<ContentControl>(_ => presenter),
ContentTemplate = new FuncDataTemplate<string>(x => new Canvas()),
Content = "foo",
};
// The control must be rooted.
var root = new TestRoot
{
Child = target,
};
target.ApplyTemplate();
// When the template is applied, the Content property is bound before the ContentTemplate
// property, causing a TextBlock to be created by the default template before ContentTemplate
// is bound.
Assert.Collection(
children,
x => Assert.Null(x),
x => Assert.IsType<TextBlock>(x),
x => Assert.IsType<Canvas>(x));
var textBlock = (TextBlock)children[1];
// The leak in #1271 was caused by the TextBlock's logical parent not being cleared when
// it is replaced by the Canvas.
Assert.Null(textBlock.GetLogicalParent());
}
private FuncControlTemplate GetTemplate()
{
return new FuncControlTemplate<ContentControl>(parent =>

18
tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs

@ -168,7 +168,7 @@ namespace Avalonia.Controls.UnitTests
target.Resources.Add("foo", "bar");
Assert.True(raisedOnTarget);
Assert.False(raisedOnPresenter);
Assert.True(raisedOnPresenter);
Assert.True(raisedOnChild);
}
@ -204,6 +204,22 @@ namespace Avalonia.Controls.UnitTests
Assert.True(raised);
}
[Fact]
public void Setting_Logical_Parent_Subscribes_To_Parents_ResourceChanged_Event()
{
var parent = new ContentControl();
var child = new Border();
((ISetLogicalParent)child).SetParent(parent);
var raisedOnChild = false;
child.ResourcesChanged += (_, __) => raisedOnChild = true;
parent.Resources.Add("foo", "bar");
Assert.True(raisedOnChild);
}
private IControlTemplate ContentControlTemplate()
{
return new FuncControlTemplate<ContentControl>(x =>

71
tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs

@ -2,11 +2,14 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Linq;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.LogicalTree;
using Avalonia.Styling;
using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Xunit;
namespace Avalonia.Controls.UnitTests.Primitives
@ -35,6 +38,25 @@ namespace Avalonia.Controls.UnitTests.Primitives
}
}
[Fact]
public void PopupRoot_StylingParent_Is_Popup()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var target = new TemplatedControlWithPopup
{
PopupContent = new Canvas(),
};
var root = new TestRoot { Child = target };
target.ApplyTemplate();
target.Popup.Open();
Assert.Equal(target.Popup, ((IStyleHost)target.Popup.PopupRoot).StylingParent);
}
}
[Fact]
public void Attaching_PopupRoot_To_Parent_Logical_Tree_Raises_DetachedFromLogicalTree_And_AttachedToLogicalTree()
{
@ -90,14 +112,33 @@ namespace Avalonia.Controls.UnitTests.Primitives
}
}
[Fact]
public void Clearing_Content_Of_Popup_In_ControlTemplate_Doesnt_Crash()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var target = new TemplatedControlWithPopup
{
PopupContent = new Canvas(),
};
var root = new TestRoot { Child = target };
target.ApplyTemplate();
target.Popup.Open();
target.PopupContent = null;
}
}
private PopupRoot CreateTarget()
{
var result = new PopupRoot
{
Template = new FuncControlTemplate<PopupRoot>(_ =>
Template = new FuncControlTemplate<PopupRoot>(parent =>
new ContentPresenter
{
Name = "PART_ContentPresenter",
[!ContentPresenter.ContentProperty] = parent[!PopupRoot.ContentProperty],
}),
};
@ -105,5 +146,33 @@ namespace Avalonia.Controls.UnitTests.Primitives
return result;
}
private class TemplatedControlWithPopup : TemplatedControl
{
public static readonly AvaloniaProperty<Control> PopupContentProperty =
AvaloniaProperty.Register<TemplatedControlWithPopup, Control>(nameof(PopupContent));
public TemplatedControlWithPopup()
{
Template = new FuncControlTemplate<TemplatedControlWithPopup>(parent =>
new Popup
{
[!Popup.ChildProperty] = parent[!TemplatedControlWithPopup.PopupContentProperty],
});
}
public Popup Popup { get; private set; }
public Control PopupContent
{
get => GetValue(PopupContentProperty);
set => SetValue(PopupContentProperty, value);
}
protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
{
Popup = (Popup)this.GetVisualChildren().Single();
}
}
}
}

9
tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs

@ -15,6 +15,7 @@ using Avalonia.Styling;
using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Xunit;
using Avalonia.Input;
namespace Avalonia.Controls.UnitTests.Primitives
{
@ -189,9 +190,11 @@ namespace Avalonia.Controls.UnitTests.Primitives
{
using (CreateServices())
{
var window = new Window();
var target = new Popup();
var child = new Control();
window.Content = target;
target.Open();
Assert.Single(target.PopupRoot.GetVisualChildren());
@ -214,7 +217,8 @@ namespace Avalonia.Controls.UnitTests.Primitives
{
Content = new Border(),
Template = new FuncControlTemplate<PopupContentControl>(PopupContentControlTemplate),
}
},
StylingParent = AvaloniaLocator.Current.GetService<IGlobalStyles>()
};
target.ApplyTemplate();
@ -306,7 +310,8 @@ namespace Avalonia.Controls.UnitTests.Primitives
.Bind<IGlobalStyles>().ToFunc(() => globalStyles.Object)
.Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformMock())
.Bind<IStyler>().ToTransient<Styler>()
.Bind<IPlatformRenderInterface>().ToFunc(() => renderInterface.Object);
.Bind<IPlatformRenderInterface>().ToFunc(() => renderInterface.Object)
.Bind<IInputManager>().ToConstant(new InputManager());
return result;
}

26
tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs

@ -140,5 +140,31 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Same(thumb.Parent, target);
Assert.Equal(new[] { thumb }, ((ILogical)target).LogicalChildren);
}
[Fact]
public void Should_Not_Pass_Invalid_Arrange_Rect()
{
var thumb = new Thumb { Width = 100.873106060606 };
var increaseButton = new Button { Width = 10 };
var decreaseButton = new Button { Width = 10 };
var target = new Track
{
Height = 12,
Thumb = thumb,
IncreaseButton = increaseButton,
DecreaseButton = decreaseButton,
Orientation = Orientation.Horizontal,
Minimum = 0,
Maximum = 287,
Value = 287,
ViewportSize = 241,
};
target.Measure(Size.Infinity);
// #1297 was occuring here.
target.Arrange(new Rect(0, 0, 221, 12));
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save