Browse Source

Merge branch 'master' into refactor/new-value-store

pull/8600/head
Steven Kirk 4 years ago
committed by GitHub
parent
commit
59ea8b8d94
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      azure-pipelines-integrationtests.yml
  2. 1
      build/BuildTargets.targets
  3. 13
      native/Avalonia.Native/src/OSX/menu.h
  4. 26
      native/Avalonia.Native/src/OSX/menu.mm
  5. 4
      packages/Avalonia/AvaloniaBuildTasks.targets
  6. 6
      samples/BindingDemo/MainWindow.xaml
  7. 6
      samples/BindingDemo/TestItemView.xaml
  8. 8
      samples/ControlCatalog.Blazor.Web/Properties/launchSettings.json
  9. 2
      samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj
  10. 1
      samples/ControlCatalog/App.xaml
  11. 15
      samples/ControlCatalog/ControlCatalog.csproj
  12. 11
      samples/ControlCatalog/DecoratedWindow.xaml
  13. 17
      samples/ControlCatalog/MainView.xaml
  14. 11
      samples/ControlCatalog/MainWindow.xaml
  15. 12
      samples/ControlCatalog/MainWindow.xaml.cs
  16. 20
      samples/ControlCatalog/Models/StateData.cs
  17. 6
      samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml
  18. 20
      samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
  19. 1
      samples/ControlCatalog/Pages/BorderPage.xaml
  20. 2
      samples/ControlCatalog/Pages/ButtonSpinnerPage.xaml
  21. 2
      samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml
  22. 4
      samples/ControlCatalog/Pages/ColorPickerPage.xaml
  23. 8
      samples/ControlCatalog/Pages/ComboBoxPage.xaml
  24. 4
      samples/ControlCatalog/Pages/CompositionPage.axaml
  25. 6
      samples/ControlCatalog/Pages/ContextFlyoutPage.xaml
  26. 6
      samples/ControlCatalog/Pages/ContextMenuPage.xaml
  27. 6
      samples/ControlCatalog/Pages/CursorPage.xaml
  28. 30
      samples/ControlCatalog/Pages/DataGridPage.xaml
  29. 2
      samples/ControlCatalog/Pages/DateTimePickerPage.xaml
  30. 4
      samples/ControlCatalog/Pages/ExpanderPage.xaml
  31. 8
      samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml
  32. 4
      samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml.cs
  33. 4
      samples/ControlCatalog/Pages/LabelsPage.axaml
  34. 4
      samples/ControlCatalog/Pages/ListBoxPage.xaml
  35. 8
      samples/ControlCatalog/Pages/MenuPage.xaml
  36. 4
      samples/ControlCatalog/Pages/NotificationsPage.xaml
  37. 15
      samples/ControlCatalog/Pages/NotificationsPage.xaml.cs
  38. 11
      samples/ControlCatalog/Pages/NumericUpDownPage.xaml
  39. 3
      samples/ControlCatalog/Pages/NumericUpDownPage.xaml.cs
  40. 2
      samples/ControlCatalog/Pages/OpenGlPage.xaml
  41. 53
      samples/ControlCatalog/Pages/PlatformInfoPage.xaml
  42. 20
      samples/ControlCatalog/Pages/PlatformInfoPage.xaml.cs
  43. 2
      samples/ControlCatalog/Pages/ProgressBarPage.xaml
  44. 4
      samples/ControlCatalog/Pages/ScrollViewerPage.xaml
  45. 2
      samples/ControlCatalog/Pages/SliderPage.xaml
  46. 6
      samples/ControlCatalog/Pages/SplitViewPage.xaml
  47. 10
      samples/ControlCatalog/Pages/TabControlPage.xaml
  48. 32
      samples/ControlCatalog/Pages/TabControlPage.xaml.cs
  49. 10
      samples/ControlCatalog/Pages/TabStripPage.xaml
  50. 40
      samples/ControlCatalog/Pages/TabStripPage.xaml.cs
  51. 2
      samples/ControlCatalog/Pages/TextBoxPage.xaml
  52. 3
      samples/ControlCatalog/Pages/TransitioningContentControlPage.axaml
  53. 4
      samples/ControlCatalog/Pages/TreeViewPage.xaml
  54. 2
      samples/ControlCatalog/Pages/ViewboxPage.xaml
  55. 4
      samples/ControlCatalog/Pages/WindowCustomizationsPage.xaml
  56. 20
      samples/ControlCatalog/ViewModels/CursorPageViewModel.cs
  57. 44
      samples/ControlCatalog/ViewModels/ItemsRepeaterPageViewModel.cs
  58. 32
      samples/ControlCatalog/ViewModels/MainWindowViewModel.cs
  59. 29
      samples/ControlCatalog/ViewModels/NotificationViewModel.cs
  60. 54
      samples/ControlCatalog/ViewModels/PlatformInformationViewModel.cs
  61. 26
      samples/ControlCatalog/ViewModels/TabControlPageViewModel.cs
  62. 4
      samples/ControlCatalog/Views/CustomNotificationView.xaml
  63. 2
      samples/IntegrationTestApp/IntegrationTestApp.csproj
  64. 10
      samples/IntegrationTestApp/MainWindow.axaml
  65. 2
      samples/IntegrationTestApp/MainWindow.axaml.cs
  66. 3
      samples/IntegrationTestApp/ShowWindowTest.axaml
  67. 1
      samples/MobileSandbox/App.xaml
  68. 4
      samples/MobileSandbox/MainView.xaml
  69. 8
      samples/MobileSandbox/Views/CustomNotificationView.xaml
  70. 6
      samples/RenderDemo/MainWindow.xaml
  71. 4
      samples/RenderDemo/Pages/AnimationsPage.xaml
  72. 2
      samples/RenderDemo/Pages/CustomAnimatorPage.xaml
  73. 2
      samples/RenderDemo/Pages/GlyphRunPage.xaml
  74. 2
      samples/RenderDemo/Pages/LineBoundsPage.xaml
  75. 4
      samples/RenderDemo/Pages/Transform3DPage.axaml
  76. 2
      samples/RenderDemo/Pages/TransitionsPage.xaml
  77. 6
      samples/SampleControls/HamburgerMenu/HamburgerMenu.xaml
  78. 4
      samples/VirtualizationDemo/MainWindow.xaml
  79. 7
      src/Avalonia.Base/Avalonia.Base.csproj
  80. 8
      src/Avalonia.Base/Input/MouseDevice.cs
  81. 2
      src/Avalonia.Base/Input/PointerWheelEventArgs.cs
  82. 22
      src/Avalonia.Base/Metadata/MarkupExtensionOption.cs
  83. 13
      src/Avalonia.Base/Platform/IRuntimePlatform.cs
  84. 2
      src/Avalonia.Build.Tasks/BuildEngineErrorCode.cs
  85. 5
      src/Avalonia.Build.Tasks/CompileAvaloniaXamlTask.cs
  86. 72
      src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs
  87. 5
      src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorPicker.xaml
  88. 3
      src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorPreviewer.xaml
  89. 3
      src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorSlider.xaml
  90. 3
      src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorSpectrum.xaml
  91. 5
      src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml
  92. 3
      src/Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml
  93. 5
      src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorPicker.xaml
  94. 3
      src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorPreviewer.xaml
  95. 3
      src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorSlider.xaml
  96. 3
      src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorSpectrum.xaml
  97. 5
      src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorView.xaml
  98. 3
      src/Avalonia.Controls.ColorPicker/Themes/Simple/Simple.xaml
  99. 6
      src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml
  100. 5
      src/Avalonia.Controls.DataGrid/Themes/Simple.xaml

10
azure-pipelines-integrationtests.yml

@ -18,9 +18,9 @@ jobs:
version: 6.0.401 version: 6.0.401
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Use .NET Core SDK 7.0.100-rc.2.22477.23' displayName: 'Use .NET Core SDK 7.0.100'
inputs: inputs:
version: 7.0.100-rc.2.22477.23 version: 7.0.100
- script: system_profiler SPDisplaysDataType |grep Resolution - script: system_profiler SPDisplaysDataType |grep Resolution
@ -32,7 +32,7 @@ jobs:
rm -rf $(osascript -e "POSIX path of (path to application id \"net.avaloniaui.avalonia.integrationtestapp\")") rm -rf $(osascript -e "POSIX path of (path to application id \"net.avaloniaui.avalonia.integrationtestapp\")")
pkill IntegrationTestApp pkill IntegrationTestApp
./samples/IntegrationTestApp/bundle.sh ./samples/IntegrationTestApp/bundle.sh
open -n ./samples/IntegrationTestApp/bin/Debug/net6.0/osx-arm64/publish/IntegrationTestApp.app open -n ./samples/IntegrationTestApp/bin/Debug/net7.0/osx-arm64/publish/IntegrationTestApp.app
pkill IntegrationTestApp pkill IntegrationTestApp
- task: DotNetCoreCLI@2 - task: DotNetCoreCLI@2
@ -56,9 +56,9 @@ jobs:
version: 6.0.401 version: 6.0.401
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Use .NET Core SDK 7.0.100-rc.2.22477.23' displayName: 'Use .NET Core SDK 7.0.100'
inputs: inputs:
version: 7.0.100-rc.2.22477.23 version: 7.0.100
- task: Windows Application Driver@0 - task: Windows Application Driver@0
inputs: inputs:

1
build/BuildTargets.targets

@ -3,6 +3,7 @@
<AvaloniaBuildTasksLocation>$(MSBuildThisFileDirectory)\..\src\Avalonia.Build.Tasks\bin\$(Configuration)\netstandard2.0\Avalonia.Build.Tasks.dll</AvaloniaBuildTasksLocation> <AvaloniaBuildTasksLocation>$(MSBuildThisFileDirectory)\..\src\Avalonia.Build.Tasks\bin\$(Configuration)\netstandard2.0\Avalonia.Build.Tasks.dll</AvaloniaBuildTasksLocation>
<AvaloniaUseExternalMSBuild>true</AvaloniaUseExternalMSBuild> <AvaloniaUseExternalMSBuild>true</AvaloniaUseExternalMSBuild>
<AvaloniaXamlIlVerifyIl>true</AvaloniaXamlIlVerifyIl> <AvaloniaXamlIlVerifyIl>true</AvaloniaXamlIlVerifyIl>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup> </PropertyGroup>
<Import Project="$(MSBuildThisFileDirectory)\..\packages\Avalonia\AvaloniaBuildTasks.props"/> <Import Project="$(MSBuildThisFileDirectory)\..\packages\Avalonia\AvaloniaBuildTasks.props"/>
<Import Project="$(MSBuildThisFileDirectory)\..\packages\Avalonia\AvaloniaBuildTasks.targets"/> <Import Project="$(MSBuildThisFileDirectory)\..\packages\Avalonia\AvaloniaBuildTasks.targets"/>

13
native/Avalonia.Native/src/OSX/menu.h

@ -59,11 +59,20 @@ public:
void RaiseOnClicked(); void RaiseOnClicked();
}; };
class AvnAppMenu;
@interface AvnMenuDelegate : NSObject<NSMenuDelegate>
- (id) initWithParent: (AvnAppMenu*) parent;
- (void) parentDestroyed;
@end
class AvnAppMenu : public ComSingleObject<IAvnMenu, &IID_IAvnMenu> class AvnAppMenu : public ComSingleObject<IAvnMenu, &IID_IAvnMenu>
{ {
private: private:
AvnMenu* _native; AvnMenu* _native;
ComPtr<IAvnMenuEvents> _baseEvents; ComPtr<IAvnMenuEvents> _baseEvents;
AvnMenuDelegate* _delegate;
public: public:
FORWARD_IUNKNOWN() FORWARD_IUNKNOWN()
@ -83,12 +92,10 @@ public:
virtual HRESULT SetTitle (char* utf8String) override; virtual HRESULT SetTitle (char* utf8String) override;
virtual HRESULT Clear () override; virtual HRESULT Clear () override;
virtual ~AvnAppMenu() override;
}; };
@interface AvnMenuDelegate : NSObject<NSMenuDelegate>
- (id) initWithParent: (AvnAppMenu*) parent;
@end
#endif #endif

26
native/Avalonia.Native/src/OSX/menu.mm

@ -292,8 +292,13 @@ void AvnAppMenuItem::RaiseOnClicked()
AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events) AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events)
{ {
_baseEvents = events; _baseEvents = events;
id del = [[AvnMenuDelegate alloc] initWithParent: this]; _delegate = [[AvnMenuDelegate alloc] initWithParent: this];
_native = [[AvnMenu alloc] initWithDelegate: del]; _native = [[AvnMenu alloc] initWithDelegate: _delegate];
}
AvnAppMenu::~AvnAppMenu()
{
[_delegate parentDestroyed];
} }
@ -394,7 +399,7 @@ HRESULT AvnAppMenu::Clear()
@implementation AvnMenuDelegate @implementation AvnMenuDelegate
{ {
ComPtr<AvnAppMenu> _parent; AvnAppMenu* _parent;
} }
- (id) initWithParent:(AvnAppMenu *)parent - (id) initWithParent:(AvnAppMenu *)parent
{ {
@ -402,6 +407,12 @@ HRESULT AvnAppMenu::Clear()
_parent = parent; _parent = parent;
return self; return self;
} }
- (void) parentDestroyed
{
_parent = nullptr;
}
- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel - (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel
{ {
if(shouldCancel) if(shouldCancel)
@ -416,17 +427,20 @@ HRESULT AvnAppMenu::Clear()
- (void)menuNeedsUpdate:(NSMenu *)menu - (void)menuNeedsUpdate:(NSMenu *)menu
{ {
_parent->RaiseNeedsUpdate(); if(_parent)
_parent->RaiseNeedsUpdate();
} }
- (void)menuWillOpen:(NSMenu *)menu - (void)menuWillOpen:(NSMenu *)menu
{ {
_parent->RaiseOpening(); if(_parent)
_parent->RaiseOpening();
} }
- (void)menuDidClose:(NSMenu *)menu - (void)menuDidClose:(NSMenu *)menu
{ {
_parent->RaiseClosed(); if(_parent)
_parent->RaiseClosed();
} }
@end @end

4
packages/Avalonia/AvaloniaBuildTasks.targets

@ -4,6 +4,7 @@
<_AvaloniaUseExternalMSBuild Condition="'$(_AvaloniaForceInternalMSBuild)' == 'true'">false</_AvaloniaUseExternalMSBuild> <_AvaloniaUseExternalMSBuild Condition="'$(_AvaloniaForceInternalMSBuild)' == 'true'">false</_AvaloniaUseExternalMSBuild>
<AvaloniaXamlReportImportance Condition="'$(AvaloniaXamlReportImportance)' == ''">low</AvaloniaXamlReportImportance> <AvaloniaXamlReportImportance Condition="'$(AvaloniaXamlReportImportance)' == ''">low</AvaloniaXamlReportImportance>
<_AvaloniaSkipXamlCompilation Condition="'$(_AvaloniaSkipXamlCompilation)' == ''">false</_AvaloniaSkipXamlCompilation> <_AvaloniaSkipXamlCompilation Condition="'$(_AvaloniaSkipXamlCompilation)' == ''">false</_AvaloniaSkipXamlCompilation>
<AvaloniaUseCompiledBindingsByDefault Condition="'$(AvaloniaUseCompiledBindingsByDefault)' == ''">false</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup> </PropertyGroup>
<!-- Unfortunately we have to update default items in .targets since custom nuget props are improted before Microsoft.NET.Sdk.DefaultItems.props --> <!-- Unfortunately we have to update default items in .targets since custom nuget props are improted before Microsoft.NET.Sdk.DefaultItems.props -->
@ -43,7 +44,7 @@
<PropertyGroup> <PropertyGroup>
<BuildAvaloniaResourcesDependsOn>$(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences;_GenerateAvaloniaResourcesDependencyCache</BuildAvaloniaResourcesDependsOn> <BuildAvaloniaResourcesDependsOn>$(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences;_GenerateAvaloniaResourcesDependencyCache</BuildAvaloniaResourcesDependsOn>
</PropertyGroup> </PropertyGroup>
<Target Name="_GenerateAvaloniaResourcesDependencyCache" BeforeTargets="GenerateAvaloniaResources"> <Target Name="_GenerateAvaloniaResourcesDependencyCache" BeforeTargets="GenerateAvaloniaResources">
<ItemGroup> <ItemGroup>
<CustomAdditionalGenerateAvaloniaResourcesInputs Include="$(IntermediateOutputPath)/Avalonia/Resources.Inputs.cache" /> <CustomAdditionalGenerateAvaloniaResourcesInputs Include="$(IntermediateOutputPath)/Avalonia/Resources.Inputs.cache" />
@ -106,6 +107,7 @@
DelaySign="$(DelaySign)" DelaySign="$(DelaySign)"
SkipXamlCompilation="$(_AvaloniaSkipXamlCompilation)" SkipXamlCompilation="$(_AvaloniaSkipXamlCompilation)"
DebuggerLaunch="$(AvaloniaXamlIlDebuggerLaunch)" DebuggerLaunch="$(AvaloniaXamlIlDebuggerLaunch)"
DefaultCompileBindings="$(AvaloniaUseCompiledBindingsByDefault)"
/> />
<Exec <Exec
Condition="'$(_AvaloniaUseExternalMSBuild)' == 'true'" Condition="'$(_AvaloniaUseExternalMSBuild)' == 'true'"

6
samples/BindingDemo/MainWindow.xaml

@ -1,8 +1,8 @@
<Window xmlns="https://github.com/avaloniaui" <Window xmlns="https://github.com/avaloniaui"
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
x:Class="BindingDemo.MainWindow" x:Class="BindingDemo.MainWindow"
xmlns:vm="clr-namespace:BindingDemo.ViewModels" xmlns:vm="using:BindingDemo.ViewModels"
xmlns:local="clr-namespace:BindingDemo" xmlns:local="using:BindingDemo"
Title="AvaloniaUI Bindings Test" Title="AvaloniaUI Bindings Test"
Width="800" Width="800"
Height="600" Height="600"
@ -81,7 +81,7 @@
<TextBlock FontSize="16" Text="Multiple"/> <TextBlock FontSize="16" Text="Multiple"/>
<ListBox Items="{Binding Items}" SelectionMode="Multiple" Selection="{Binding Selection}"/> <ListBox Items="{Binding Items}" SelectionMode="Multiple" Selection="{Binding Selection}"/>
</StackPanel> </StackPanel>
<ContentControl Content="{Binding SelectedItems[0]}"> <ContentControl Content="{ReflectionBinding Selection.SelectedItems[0]}">
<ContentControl.DataTemplates> <ContentControl.DataTemplates>
<DataTemplate DataType="vm:TestItem"> <DataTemplate DataType="vm:TestItem">
<local:TestItemView></local:TestItemView> <local:TestItemView></local:TestItemView>

6
samples/BindingDemo/TestItemView.xaml

@ -1,8 +1,10 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
x:Class="BindingDemo.TestItemView"> xmlns:viewModels="using:BindingDemo.ViewModels"
x:Class="BindingDemo.TestItemView"
x:DataType="viewModels:TestItem">
<StackPanel> <StackPanel>
<TextBlock Classes="h1" Text="{Binding StringValue}"/> <TextBlock Classes="h1" Text="{Binding StringValue}"/>
<TextBox Text="{Binding Detail}" AcceptsReturn="True"/> <TextBox Text="{Binding Detail}" AcceptsReturn="True"/>
</StackPanel> </StackPanel>
</UserControl> </UserControl>

8
samples/ControlCatalog.Blazor.Web/Properties/launchSettings.json

@ -8,14 +8,6 @@
} }
}, },
"profiles": { "profiles": {
"ControlCatalog.Web - IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"ControlCatalog.Web": { "ControlCatalog.Web": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": "true", "dotnetRunMessages": "true",

2
samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj

@ -5,7 +5,7 @@
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch> <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<RuntimeFrameworkVersion>6.0.9</RuntimeFrameworkVersion> <RuntimeFrameworkVersion>6.0.8</RuntimeFrameworkVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(RunNativeAotCompilation)' == 'true'"> <PropertyGroup Condition="'$(RunNativeAotCompilation)' == 'true'">

1
samples/ControlCatalog/App.xaml

@ -2,7 +2,6 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ControlCatalog.ViewModels" xmlns:vm="using:ControlCatalog.ViewModels"
x:DataType="vm:ApplicationViewModel" x:DataType="vm:ApplicationViewModel"
x:CompileBindings="True"
Name="Avalonia ControlCatalog" Name="Avalonia ControlCatalog"
x:Class="ControlCatalog.App"> x:Class="ControlCatalog.App">
<Application.Resources> <Application.Resources>

15
samples/ControlCatalog/ControlCatalog.csproj

@ -14,9 +14,6 @@
<AvaloniaResource Include="Assets\*" /> <AvaloniaResource Include="Assets\*" />
<AvaloniaResource Include="Assets\Fonts\*" /> <AvaloniaResource Include="Assets\Fonts\*" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Remove="Pages\NativeEmbedPage.xaml" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-Bold.ttf" /> <EmbeddedResource Include="Assets\Fonts\SourceSansPro-Bold.ttf" />
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-BoldItalic.ttf" /> <EmbeddedResource Include="Assets\Fonts\SourceSansPro-BoldItalic.ttf" />
@ -35,17 +32,5 @@
<ProjectReference Include="..\SampleControls\ControlSamples.csproj" /> <ProjectReference Include="..\SampleControls\ControlSamples.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<AvaloniaResource Update="Pages\NativeEmbedPage.xaml">
<Generator>MSBuild:Compile</Generator>
</AvaloniaResource>
</ItemGroup>
<ItemGroup>
<Compile Update="Pages\NativeEmbedPage.xaml.cs">
<DependentUpon>%(Filename)</DependentUpon>
</Compile>
</ItemGroup>
<Import Project="..\..\build\BuildTargets.targets" /> <Import Project="..\..\build\BuildTargets.targets" />
</Project> </Project>

11
samples/ControlCatalog/DecoratedWindow.xaml

@ -2,7 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.DecoratedWindow" x:Class="ControlCatalog.DecoratedWindow"
Title="Avalonia Control Gallery" Title="Avalonia Control Gallery"
xmlns:local="clr-namespace:ControlCatalog" SystemDecorations="None" Name="Window"> SystemDecorations="None" Name="Window">
<NativeMenu.Menu> <NativeMenu.Menu>
<NativeMenu> <NativeMenu>
<NativeMenuItem Header="Decorated"> <NativeMenuItem Header="Decorated">
@ -43,8 +43,13 @@
<StackPanel> <StackPanel>
<TextBlock>Hello world!</TextBlock> <TextBlock>Hello world!</TextBlock>
<CheckBox IsChecked="{Binding ElementName=Window, Path=HasSystemDecorations}">Decorated</CheckBox> <ComboBox SelectedItem="{Binding ElementName=Window, Path=SystemDecorations}">
<ComboBox.Items>
<SystemDecorations>None</SystemDecorations>
<SystemDecorations>BorderOnly</SystemDecorations>
<SystemDecorations>Full</SystemDecorations>
</ComboBox.Items>
</ComboBox>
<CheckBox IsChecked="{Binding ElementName=Window, Path=CanResize}">CanResize</CheckBox> <CheckBox IsChecked="{Binding ElementName=Window, Path=CanResize}">CanResize</CheckBox>
</StackPanel> </StackPanel>
</Border> </Border>

17
samples/ControlCatalog/MainView.xaml

@ -1,9 +1,11 @@
<UserControl x:Class="ControlCatalog.MainView" <UserControl x:Class="ControlCatalog.MainView"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:ControlSamples;assembly=ControlSamples" xmlns:controls="using:ControlSamples"
xmlns:models="clr-namespace:ControlCatalog.Models" xmlns:models="using:ControlCatalog.Models"
xmlns:pages="clr-namespace:ControlCatalog.Pages"> xmlns:pages="using:ControlCatalog.Pages"
xmlns:viewModels="using:ControlCatalog.ViewModels"
x:DataType="viewModels:MainWindowViewModel">
<Grid> <Grid>
<Grid.Styles> <Grid.Styles>
<Style Selector="TextBlock.h2"> <Style Selector="TextBlock.h2">
@ -12,8 +14,8 @@
<Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="HorizontalAlignment" Value="Left" />
</Style> </Style>
</Grid.Styles> </Grid.Styles>
<controls:HamburgerMenu Name="Sidebar"> <controls:HamburgerMenu Name="Sidebar">
<TabItem Header="Composition"> <TabItem Header="Composition">
<pages:CompositionPage/> <pages:CompositionPage/>
</TabItem> </TabItem>
<TabItem Header="Acrylic"> <TabItem Header="Acrylic">
@ -118,6 +120,9 @@
<TabItem Header="OpenGL"> <TabItem Header="OpenGL">
<pages:OpenGlPage /> <pages:OpenGlPage />
</TabItem> </TabItem>
<TabItem Header="Platform Information">
<pages:PlatformInfoPage />
</TabItem>
<TabItem Header="Pointers"> <TabItem Header="Pointers">
<pages:PointersPage /> <pages:PointersPage />
</TabItem> </TabItem>
@ -130,7 +135,7 @@
<TabItem Header="RelativePanel"> <TabItem Header="RelativePanel">
<pages:RelativePanelPage /> <pages:RelativePanelPage />
</TabItem> </TabItem>
<TabItem Header="ScrollViewer"> <TabItem Header="ScrollViewer">
<pages:ScrollViewerPage /> <pages:ScrollViewerPage />
</TabItem> </TabItem>
<TabItem Header="Slider"> <TabItem Header="Slider">

11
samples/ControlCatalog/MainWindow.xaml

@ -1,19 +1,20 @@
<Window xmlns="https://github.com/avaloniaui" MinWidth="500" MinHeight="300" <Window xmlns="https://github.com/avaloniaui" MinWidth="500" MinHeight="300"
Width="1024" Height="800" Width="1024" Height="800"
xmlns:pages="clr-namespace:ControlCatalog.Pages" xmlns:pages="using:ControlCatalog.Pages"
Title="Avalonia Control Gallery" Title="Avalonia Control Gallery"
Icon="/Assets/test_icon.ico" Icon="/Assets/test_icon.ico"
xmlns:local="clr-namespace:ControlCatalog" xmlns:local="using:ControlCatalog"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ControlCatalog.ViewModels" xmlns:vm="clr-namespace:ControlCatalog.ViewModels;assembly=ControlCatalog"
xmlns:v="clr-namespace:ControlCatalog.Views" xmlns:v="using:ControlCatalog.Views"
ExtendClientAreaToDecorationsHint="{Binding ExtendClientAreaEnabled}" ExtendClientAreaToDecorationsHint="{Binding ExtendClientAreaEnabled}"
ExtendClientAreaChromeHints="{Binding ChromeHints}" ExtendClientAreaChromeHints="{Binding ChromeHints}"
ExtendClientAreaTitleBarHeightHint="{Binding TitleBarHeight}" ExtendClientAreaTitleBarHeightHint="{Binding TitleBarHeight}"
TransparencyLevelHint="{Binding TransparencyLevel}" TransparencyLevelHint="{Binding TransparencyLevel}"
x:Name="MainWindow" x:Name="MainWindow"
Background="Transparent" Background="Transparent"
x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}"> x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}"
x:DataType="vm:MainWindowViewModel">
<NativeMenu.Menu> <NativeMenu.Menu>
<NativeMenu> <NativeMenu>
<NativeMenuItem Header="File"> <NativeMenuItem Header="File">

12
samples/ControlCatalog/MainWindow.xaml.cs

@ -11,23 +11,13 @@ namespace ControlCatalog
{ {
public class MainWindow : Window public class MainWindow : Window
{ {
private WindowNotificationManager _notificationArea;
private NativeMenu? _recentMenu; private NativeMenu? _recentMenu;
public MainWindow() public MainWindow()
{ {
this.InitializeComponent(); this.InitializeComponent();
//Renderer.DrawFps = true; DataContext = new MainWindowViewModel();
//Renderer.DrawDirtyRects = Renderer.DrawFps = true;
_notificationArea = new WindowNotificationManager(this)
{
Position = NotificationPosition.TopRight,
MaxItems = 3
};
DataContext = new MainWindowViewModel(_notificationArea);
_recentMenu = ((NativeMenu.GetMenu(this)?.Items[0] as NativeMenuItem)?.Menu?.Items[2] as NativeMenuItem)?.Menu; _recentMenu = ((NativeMenu.GetMenu(this)?.Items[0] as NativeMenuItem)?.Menu?.Items[2] as NativeMenuItem)?.Menu;
} }

20
samples/ControlCatalog/Models/StateData.cs

@ -0,0 +1,20 @@
namespace ControlCatalog.Models;
public class StateData
{
public string Name { get; private set; }
public string Abbreviation { get; private set; }
public string Capital { get; private set; }
public StateData(string name, string abbreviatoin, string capital)
{
Name = name;
Abbreviation = abbreviatoin;
Capital = capital;
}
public override string ToString()
{
return Name;
}
}

6
samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml

@ -2,8 +2,8 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:sys="using:System"
xmlns:sys="clr-namespace:System;assembly=netstandard" xmlns:models="using:ControlCatalog.Models"
d:DesignHeight="600" d:DesignHeight="600"
d:DesignWidth="400"> d:DesignWidth="400">
<StackPanel Orientation="Vertical" <StackPanel Orientation="Vertical"
@ -45,7 +45,7 @@
<StackPanel> <StackPanel>
<TextBlock Text="ValueMemberBinding" /> <TextBlock Text="ValueMemberBinding" />
<AutoCompleteBox ValueMemberBinding="{Binding Capital}" /> <AutoCompleteBox ValueMemberBinding="{Binding Capital, x:DataType=models:StateData}" />
</StackPanel> </StackPanel>
<StackPanel> <StackPanel>
<TextBlock Text="Multi-Binding" /> <TextBlock Text="Multi-Binding" />

20
samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs

@ -8,30 +8,12 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.Data.Converters; using Avalonia.Data.Converters;
using Avalonia.Data; using Avalonia.Data;
using ControlCatalog.Models;
namespace ControlCatalog.Pages namespace ControlCatalog.Pages
{ {
public class AutoCompleteBoxPage : UserControl public class AutoCompleteBoxPage : UserControl
{ {
public class StateData
{
public string Name { get; private set; }
public string Abbreviation { get; private set; }
public string Capital { get; private set; }
public StateData(string name, string abbreviatoin, string capital)
{
Name = name;
Abbreviation = abbreviatoin;
Capital = capital;
}
public override string ToString()
{
return Name;
}
}
private StateData[] BuildAllStates() private StateData[] BuildAllStates()
{ {
return new StateData[] return new StateData[]

1
samples/ControlCatalog/Pages/BorderPage.xaml

@ -1,7 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="800" d:DesignHeight="800"
d:DesignWidth="400" d:DesignWidth="400"
x:Class="ControlCatalog.Pages.BorderPage"> x:Class="ControlCatalog.Pages.BorderPage">

2
samples/ControlCatalog/Pages/ButtonSpinnerPage.xaml

@ -1,7 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.ButtonSpinnerPage" x:Class="ControlCatalog.Pages.ButtonSpinnerPage"
xmlns:sys="clr-namespace:System;assembly=netstandard"> xmlns:sys="using:System">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">The ButtonSpinner control allows you to add button spinners to any element and then respond to the Spin event to manipulate that element.</TextBlock> <TextBlock Classes="h2">The ButtonSpinner control allows you to add button spinners to any element and then respond to the Spin event to manipulate that element.</TextBlock>

2
samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml

@ -1,6 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ControlCatalog.ViewModels" xmlns:vm="using:ControlCatalog.ViewModels"
x:DataType="vm:MainWindowViewModel" x:DataType="vm:MainWindowViewModel"
x:Class="ControlCatalog.Pages.CalendarDatePickerPage"> x:Class="ControlCatalog.Pages.CalendarDatePickerPage">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">

4
samples/ControlCatalog/Pages/ColorPickerPage.xaml

@ -2,9 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="clr-namespace:Avalonia.Controls;assembly=Avalonia.Controls.ColorPicker" xmlns:controls="using:Avalonia.Controls"
xmlns:primitives="clr-namespace:Avalonia.Controls.Primitives;assembly=Avalonia.Controls"
xmlns:pc="clr-namespace:Avalonia.Controls.Primitives.Converters;assembly=Avalonia.Controls.ColorPicker"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignWidth="800" d:DesignWidth="800"
d:DesignHeight="450" d:DesignHeight="450"

8
samples/ControlCatalog/Pages/ComboBoxPage.xaml

@ -3,7 +3,9 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:col="using:System.Collections" xmlns:col="using:System.Collections"
xmlns:sys="using:System"> xmlns:sys="using:System"
xmlns:viewModels="using:ControlCatalog.ViewModels"
x:DataType="viewModels:ComboBoxPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">A drop-down list.</TextBlock> <TextBlock Classes="h2">A drop-down list.</TextBlock>
@ -39,7 +41,7 @@
</col:ArrayList> </col:ArrayList>
</ComboBox.Items> </ComboBox.Items>
<ComboBox.ItemTemplate> <ComboBox.ItemTemplate>
<DataTemplate> <DataTemplate x:DataType="sys:String">
<Panel> <Panel>
<TextBlock Text="{Binding}" /> <TextBlock Text="{Binding}" />
<TextBlock IsVisible="{Binding Converter={x:Static ObjectConverters.IsNull}}" Text="Null object" /> <TextBlock IsVisible="{Binding Converter={x:Static ObjectConverters.IsNull}}" Text="Null object" />
@ -71,7 +73,7 @@
SelectedIndex="0" SelectedIndex="0"
WrapSelection="{Binding WrapSelection}"> WrapSelection="{Binding WrapSelection}">
<ComboBox.ItemTemplate> <ComboBox.ItemTemplate>
<DataTemplate> <DataTemplate x:DataType="FontFamily">
<TextBlock FontFamily="{Binding}" Text="{Binding Name}" /> <TextBlock FontFamily="{Binding}" Text="{Binding Name}" />
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>

4
samples/ControlCatalog/Pages/CompositionPage.axaml

@ -1,6 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pages="clr-namespace:ControlCatalog.Pages" xmlns:pages="using:ControlCatalog.Pages"
x:Class="ControlCatalog.Pages.CompositionPage"> x:Class="ControlCatalog.Pages.CompositionPage">
<StackPanel> <StackPanel>
<TextBlock Classes="h1">Implicit animations</TextBlock> <TextBlock Classes="h1">Implicit animations</TextBlock>
@ -42,4 +42,4 @@
</StackPanel> </StackPanel>
</UserControl> </UserControl>

6
samples/ControlCatalog/Pages/ContextFlyoutPage.xaml

@ -3,9 +3,11 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:ControlCatalog.ViewModels"
d:DesignHeight="450" d:DesignHeight="450"
d:DesignWidth="800" d:DesignWidth="800"
mc:Ignorable="d"> mc:Ignorable="d"
x:DataType="viewModels:ContextPageViewModel">
<UserControl.Styles> <UserControl.Styles>
<Style Selector="FlyoutPresenter.NoPadding"> <Style Selector="FlyoutPresenter.NoPadding">
<Setter Property="Padding" Value="0" /> <Setter Property="Padding" Value="0" />
@ -57,7 +59,7 @@
</Border> </Border>
<Border Classes="context-target"> <Border Classes="context-target">
<Border.Styles> <Border.Styles>
<Style Selector="MenuFlyoutPresenter MenuItem"> <Style Selector="MenuFlyoutPresenter MenuItem" x:DataType="viewModels:MenuItemViewModel">
<Setter Property="Header" Value="{Binding Header}"/> <Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Items" Value="{Binding Items}"/> <Setter Property="Items" Value="{Binding Items}"/>
<Setter Property="Command" Value="{Binding Command}"/> <Setter Property="Command" Value="{Binding Command}"/>

6
samples/ControlCatalog/Pages/ContextMenuPage.xaml

@ -1,6 +1,8 @@
<UserControl x:Class="ControlCatalog.Pages.ContextMenuPage" <UserControl x:Class="ControlCatalog.Pages.ContextMenuPage"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="using:ControlCatalog.ViewModels"
x:DataType="viewModels:ContextPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">A right click menu that can be applied to any control.</TextBlock> <TextBlock Classes="h2">A right click menu that can be applied to any control.</TextBlock>
@ -47,7 +49,7 @@
</Border> </Border>
<Border> <Border>
<Border.Styles> <Border.Styles>
<Style Selector="ContextMenu MenuItem"> <Style Selector="ContextMenu MenuItem" x:DataType="viewModels:MenuItemViewModel">
<Setter Property="Header" Value="{Binding Header}"/> <Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Items" Value="{Binding Items}"/> <Setter Property="Items" Value="{Binding Items}"/>
<Setter Property="Command" Value="{Binding Command}"/> <Setter Property="Command" Value="{Binding Command}"/>

6
samples/ControlCatalog/Pages/CursorPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.CursorPage"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Pages.CursorPage"
x:DataType="viewModels:CursorPageViewModel">
<Grid ColumnDefinitions="*,*" RowDefinitions="Auto,*"> <Grid ColumnDefinitions="*,*" RowDefinitions="Auto,*">
<StackPanel Grid.ColumnSpan="2" Orientation="Vertical" Spacing="4"> <StackPanel Grid.ColumnSpan="2" Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">Defines a cursor (mouse pointer)</TextBlock> <TextBlock Classes="h2">Defines a cursor (mouse pointer)</TextBlock>
@ -9,7 +11,7 @@
<ListBox Grid.Row="1" Items="{Binding StandardCursors}" Margin="0 8 8 8"> <ListBox Grid.Row="1" Items="{Binding StandardCursors}" Margin="0 8 8 8">
<ListBox.Styles> <ListBox.Styles>
<Style Selector="ListBoxItem"> <Style Selector="ListBoxItem">
<Setter Property="Cursor" Value="{Binding Cursor}"/> <Setter Property="Cursor" Value="{Binding Cursor}" x:DataType="viewModels:StandardCursorModel"/>
</Style> </Style>
</ListBox.Styles> </ListBox.Styles>
<ListBox.ItemTemplate> <ListBox.ItemTemplate>

30
samples/ControlCatalog/Pages/DataGridPage.xaml

@ -4,13 +4,13 @@
x:Class="ControlCatalog.Pages.DataGridPage"> x:Class="ControlCatalog.Pages.DataGridPage">
<UserControl.Resources> <UserControl.Resources>
<local:GDPValueConverter x:Key="GDPConverter" /> <local:GDPValueConverter x:Key="GDPConverter" />
<DataTemplate x:Key="Demo.DataTemplates.CountryHeader"> <DataTemplate x:Key="Demo.DataTemplates.CountryHeader" x:DataType="local:Country">
<StackPanel Orientation="Horizontal" Spacing="5"> <StackPanel Orientation="Horizontal" Spacing="5">
<PathIcon Height="12" Data="M 255 116 A 1 1 0 0 0 254 117 L 254 130 A 1 1 0 0 0 255 131 A 1 1 0 0 0 256 130 L 256 123.87109 C 256.1125 123.90694 256.2187 123.94195 256.33984 123.97852 C 257.18636 124.23404 258.19155 124.5 259 124.5 C 259.80845 124.5 260.52133 124.2168 261.17773 123.9668 C 261.83414 123.7168 262.43408 123.5 263 123.5 C 263.56592 123.5 264.5612 123.73404 265.37109 123.97852 C 266.18098 124.22299 266.82227 124.4668 266.82227 124.4668 A 0.50005 0.50005 0 0 0 267.5 124 L 267.5 118 A 0.50005 0.50005 0 0 0 267.17773 117.5332 C 267.17773 117.5332 266.50667 117.27701 265.66016 117.02148 C 264.81364 116.76596 263.80845 116.5 263 116.5 C 262.19155 116.5 261.47867 116.7832 260.82227 117.0332 C 260.16586 117.2832 259.56592 117.5 259 117.5 C 258.43408 117.5 257.4388 117.26596 256.62891 117.02148 C 256.39123 116.94974 256.17716 116.87994 255.98047 116.81445 A 1 1 0 0 0 255 116 z M 263 117.5 C 263.56592 117.5 264.5612 117.73404 265.37109 117.97852 C 266.00097 118.16865 266.29646 118.28239 266.5 118.35742 L 266.5 120.29297 C 266.25708 120.21012 265.97978 120.11797 265.66016 120.02148 C 264.81364 119.76596 263.80845 119.5 263 119.5 C 262.19155 119.5 261.47867 119.7832 260.82227 120.0332 C 260.16586 120.2832 259.56592 120.5 259 120.5 C 258.43408 120.5 257.4388 120.26596 256.62891 120.02148 C 256.39971 119.9523 256.19148 119.88388 256 119.82031 L 256 117.87109 C 256.1125 117.90694 256.2187 117.94195 256.33984 117.97852 C 257.18636 118.23404 258.19155 118.5 259 118.5 C 259.80845 118.5 260.52133 118.2168 261.17773 117.9668 C 261.83414 117.7168 262.43408 117.5 263 117.5 z M 263 120.5 C 263.56592 120.5 264.5612 120.73404 265.37109 120.97852 C 265.8714 121.12954 266.2398 121.25641 266.5 121.34961 L 266.5 123.30469 C 266.22286 123.20649 266.12863 123.1629 265.66016 123.02148 C 264.81364 122.76596 263.80845 122.5 263 122.5 C 262.19155 122.5 261.47867 122.7832 260.82227 123.0332 C 260.16586 123.2832 259.56592 123.5 259 123.5 C 258.43408 123.5 257.4388 123.26596 256.62891 123.02148 C 256.39971 122.9523 256.19148 122.88388 256 122.82031 L 256 120.87109 C 256.1125 120.90694 256.2187 120.94195 256.33984 120.97852 C 257.18636 121.23404 258.19155 121.5 259 121.5 C 259.80845 121.5 260.52133 121.2168 261.17773 120.9668 C 261.83414 120.7168 262.43408 120.5 263 120.5 z" /> <PathIcon Height="12" Data="M 255 116 A 1 1 0 0 0 254 117 L 254 130 A 1 1 0 0 0 255 131 A 1 1 0 0 0 256 130 L 256 123.87109 C 256.1125 123.90694 256.2187 123.94195 256.33984 123.97852 C 257.18636 124.23404 258.19155 124.5 259 124.5 C 259.80845 124.5 260.52133 124.2168 261.17773 123.9668 C 261.83414 123.7168 262.43408 123.5 263 123.5 C 263.56592 123.5 264.5612 123.73404 265.37109 123.97852 C 266.18098 124.22299 266.82227 124.4668 266.82227 124.4668 A 0.50005 0.50005 0 0 0 267.5 124 L 267.5 118 A 0.50005 0.50005 0 0 0 267.17773 117.5332 C 267.17773 117.5332 266.50667 117.27701 265.66016 117.02148 C 264.81364 116.76596 263.80845 116.5 263 116.5 C 262.19155 116.5 261.47867 116.7832 260.82227 117.0332 C 260.16586 117.2832 259.56592 117.5 259 117.5 C 258.43408 117.5 257.4388 117.26596 256.62891 117.02148 C 256.39123 116.94974 256.17716 116.87994 255.98047 116.81445 A 1 1 0 0 0 255 116 z M 263 117.5 C 263.56592 117.5 264.5612 117.73404 265.37109 117.97852 C 266.00097 118.16865 266.29646 118.28239 266.5 118.35742 L 266.5 120.29297 C 266.25708 120.21012 265.97978 120.11797 265.66016 120.02148 C 264.81364 119.76596 263.80845 119.5 263 119.5 C 262.19155 119.5 261.47867 119.7832 260.82227 120.0332 C 260.16586 120.2832 259.56592 120.5 259 120.5 C 258.43408 120.5 257.4388 120.26596 256.62891 120.02148 C 256.39971 119.9523 256.19148 119.88388 256 119.82031 L 256 117.87109 C 256.1125 117.90694 256.2187 117.94195 256.33984 117.97852 C 257.18636 118.23404 258.19155 118.5 259 118.5 C 259.80845 118.5 260.52133 118.2168 261.17773 117.9668 C 261.83414 117.7168 262.43408 117.5 263 117.5 z M 263 120.5 C 263.56592 120.5 264.5612 120.73404 265.37109 120.97852 C 265.8714 121.12954 266.2398 121.25641 266.5 121.34961 L 266.5 123.30469 C 266.22286 123.20649 266.12863 123.1629 265.66016 123.02148 C 264.81364 122.76596 263.80845 122.5 263 122.5 C 262.19155 122.5 261.47867 122.7832 260.82227 123.0332 C 260.16586 123.2832 259.56592 123.5 259 123.5 C 258.43408 123.5 257.4388 123.26596 256.62891 123.02148 C 256.39971 122.9523 256.19148 122.88388 256 122.82031 L 256 120.87109 C 256.1125 120.90694 256.2187 120.94195 256.33984 120.97852 C 257.18636 121.23404 258.19155 121.5 259 121.5 C 259.80845 121.5 260.52133 121.2168 261.17773 120.9668 C 261.83414 120.7168 262.43408 120.5 263 120.5 z" />
<TextBlock Text="{Binding}"/> <TextBlock Text="{Binding}"/>
</StackPanel> </StackPanel>
</DataTemplate> </DataTemplate>
<ControlTheme x:Key="GdpCell" TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> <ControlTheme x:Key="GdpCell" TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}" x:DataType="local:Country">
<Setter Property="Background" Value="{Binding Path=GDP, Mode=OneWay, Converter={StaticResource GDPConverter}}" /> <Setter Property="Background" Value="{Binding Path=GDP, Mode=OneWay, Converter={StaticResource GDPConverter}}" />
</ControlTheme> </ControlTheme>
</UserControl.Resources> </UserControl.Resources>
@ -49,15 +49,15 @@
AlternatingRowBackground="#1fff"> AlternatingRowBackground="#1fff">
<DataGrid.Columns> <DataGrid.Columns>
<!-- Using HeaderTemplate --> <!-- Using HeaderTemplate -->
<DataGridTextColumn Header="Country" HeaderTemplate="{StaticResource Demo.DataTemplates.CountryHeader}" Binding="{Binding Name}" Width="6*" /> <DataGridTextColumn Header="Country" HeaderTemplate="{StaticResource Demo.DataTemplates.CountryHeader}" Binding="{Binding Name}" Width="6*" x:DataType="local:Country" />
<!-- CompiledBinding example of usage. -->
<DataGridTextColumn Header="Region" Binding="{CompiledBinding Region}" Width="4*" x:DataType="local:Country" /> <DataGridTextColumn Header="Region" Binding="{CompiledBinding Region}" Width="4*" x:DataType="local:Country" />
<DataGridTextColumn Header="Population" Binding="{Binding Population}" Width="3*" /> <DataGridTextColumn Header="Population" Binding="{Binding Population}" Width="3*" x:DataType="local:Country" />
<DataGridTextColumn Header="Area" Binding="{Binding Area}" Width="3*" /> <DataGridTextColumn Header="Area" Binding="{Binding Area}" Width="3*" x:DataType="local:Country" />
<DataGridTextColumn Header="GDP" Binding="{Binding GDP}" Width="3*" <DataGridTextColumn Header="GDP" Binding="{Binding GDP}" Width="3*"
CellTheme="{StaticResource GdpCell}" CellTheme="{StaticResource GdpCell}"
MinWidth="200" MinWidth="200"
IsVisible="{Binding #ShowGDP.IsChecked}"/> IsVisible="{Binding #ShowGDP.IsChecked}"
x:DataType="local:Country" />
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>
</DockPanel> </DockPanel>
@ -65,11 +65,11 @@
<TabItem Header="Grouping"> <TabItem Header="Grouping">
<DataGrid Name="dataGridGrouping" Margin="12"> <DataGrid Name="dataGridGrouping" Margin="12">
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="Country" Binding="{Binding Name}" Width="6*" /> <DataGridTextColumn Header="Country" Binding="{Binding Name}" Width="6*" x:DataType="local:Country" />
<DataGridTextColumn Header="Region" Binding="{Binding Region}" Width="4*" /> <DataGridTextColumn Header="Region" Binding="{Binding Region}" Width="4*" x:DataType="local:Country" />
<DataGridTextColumn DisplayIndex="3" Header="Population" Binding="{Binding Population}" Width="3*" /> <DataGridTextColumn DisplayIndex="3" Header="Population" Binding="{Binding Population}" Width="3*" x:DataType="local:Country" />
<DataGridTextColumn DisplayIndex="2" Header="Area" Binding="{Binding Area}" Width="3*" /> <DataGridTextColumn DisplayIndex="2" Header="Area" Binding="{Binding Area}" Width="3*" x:DataType="local:Country" />
<DataGridTextColumn Header="GDP" Binding="{Binding GDP}" Width="3*" /> <DataGridTextColumn Header="GDP" Binding="{Binding GDP}" Width="3*" x:DataType="local:Country" />
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>
</TabItem> </TabItem>
@ -77,9 +77,9 @@
<Grid RowDefinitions="*,Auto"> <Grid RowDefinitions="*,Auto">
<DataGrid Name="dataGridEdit" Margin="12" Grid.Row="0"> <DataGrid Name="dataGridEdit" Margin="12" Grid.Row="0">
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" Width="2*" FontSize="{Binding #FontSizeSlider.Value, Mode=OneWay}" /> <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" Width="2*" FontSize="{Binding #FontSizeSlider.Value, Mode=OneWay}" x:DataType="local:Person" />
<DataGridTextColumn Header="Last" Binding="{Binding LastName}" Width="2*" FontSize="{Binding #FontSizeSlider.Value, Mode=OneWay}" /> <DataGridTextColumn Header="Last" Binding="{Binding LastName}" Width="2*" FontSize="{Binding #FontSizeSlider.Value, Mode=OneWay}" x:DataType="local:Person" />
<DataGridCheckBoxColumn Header="Is Banned" Binding="{Binding IsBanned}" Width="*" IsThreeState="{Binding #IsThreeStateCheckBox.IsChecked, Mode=OneWay}" /> <DataGridCheckBoxColumn Header="Is Banned" Binding="{Binding IsBanned}" Width="*" IsThreeState="{Binding #IsThreeStateCheckBox.IsChecked, Mode=OneWay}" x:DataType="local:Person" />
<DataGridTemplateColumn Header="Age" > <DataGridTemplateColumn Header="Age" >
<DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="local:Person"> <DataTemplate DataType="local:Person">

2
samples/ControlCatalog/Pages/DateTimePickerPage.xaml

@ -2,7 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=netstandard" xmlns:sys="using:System"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="ControlCatalog.Pages.DateTimePickerPage"> x:Class="ControlCatalog.Pages.DateTimePickerPage">
<StackPanel Orientation="Vertical" Spacing="4" HorizontalAlignment="Stretch"> <StackPanel Orientation="Vertical" Spacing="4" HorizontalAlignment="Stretch">

4
samples/ControlCatalog/Pages/ExpanderPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.ExpanderPage"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Pages.ExpanderPage"
x:DataType="viewModels:ExpanderPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">Expands to show nested content</TextBlock> <TextBlock Classes="h2">Expands to show nested content</TextBlock>

8
samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.ItemsRepeaterPage"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Pages.ItemsRepeaterPage"
x:DataType="viewModels:ItemsRepeaterPageViewModel">
<UserControl.Styles> <UserControl.Styles>
<Style Selector="ItemsRepeater TextBlock.oddTemplate"> <Style Selector="ItemsRepeater TextBlock.oddTemplate">
<Setter Property="Background" Value="Yellow" /> <Setter Property="Background" Value="Yellow" />
@ -21,12 +23,12 @@
</UserControl.Styles> </UserControl.Styles>
<UserControl.Resources> <UserControl.Resources>
<RecyclePool x:Key="RecyclePool" /> <RecyclePool x:Key="RecyclePool" />
<DataTemplate x:Key="odd"> <DataTemplate x:Key="odd" x:DataType="viewModels:ItemsRepeaterPageViewModelItem">
<TextBlock Classes="oddTemplate" <TextBlock Classes="oddTemplate"
Height="{Binding Height}" Height="{Binding Height}"
Text="{Binding Text}"/> Text="{Binding Text}"/>
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="even"> <DataTemplate x:Key="even" x:DataType="viewModels:ItemsRepeaterPageViewModelItem">
<TextBlock Classes="evenTemplate" <TextBlock Classes="evenTemplate"
Height="{Binding Height}" Height="{Binding Height}"
Text="{Binding Text}"/> Text="{Binding Text}"/>

4
samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml.cs

@ -44,7 +44,7 @@ namespace ControlCatalog.Pages
public void OnSelectTemplateKey(object sender, SelectTemplateEventArgs e) public void OnSelectTemplateKey(object sender, SelectTemplateEventArgs e)
{ {
if (e.DataContext is ItemsRepeaterPageViewModel.Item item) if (e.DataContext is ItemsRepeaterPageViewModelItem item)
{ {
e.TemplateKey = (item.Index % 2 == 0) ? "even" : "odd"; e.TemplateKey = (item.Index % 2 == 0) ? "even" : "odd";
} }
@ -125,7 +125,7 @@ namespace ControlCatalog.Pages
private void RepeaterClick(object? sender, PointerPressedEventArgs e) private void RepeaterClick(object? sender, PointerPressedEventArgs e)
{ {
if ((e.Source as TextBlock)?.DataContext is ItemsRepeaterPageViewModel.Item item) if ((e.Source as TextBlock)?.DataContext is ItemsRepeaterPageViewModelItem item)
{ {
_viewModel.SelectedItem = item; _viewModel.SelectedItem = item;
_selectedIndex = _viewModel.Items.IndexOf(item); _selectedIndex = _viewModel.Items.IndexOf(item);

4
samples/ControlCatalog/Pages/LabelsPage.axaml

@ -2,9 +2,11 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:models="using:ControlCatalog.Models"
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="250" mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="250"
x:Class="ControlCatalog.Pages.LabelsPage" x:Class="ControlCatalog.Pages.LabelsPage"
x:Name="_labelsPage"> x:Name="_labelsPage"
x:DataType="models:Person">
<UserControl.Styles> <UserControl.Styles>
<Style Selector="Label"> <Style Selector="Label">
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>

4
samples/ControlCatalog/Pages/ListBoxPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.ListBoxPage"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Pages.ListBoxPage"
x:DataType="viewModels:ListBoxPageViewModel">
<DockPanel> <DockPanel>
<DockPanel.Styles> <DockPanel.Styles>
<Style Selector="ListBox ListBoxItem:nth-child(5n+3)"> <Style Selector="ListBox ListBoxItem:nth-child(5n+3)">

8
samples/ControlCatalog/Pages/MenuPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.MenuPage"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Pages.MenuPage"
x:DataType="viewModels:MenuPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">Exported menu fallback</TextBlock> <TextBlock Classes="h2">Exported menu fallback</TextBlock>
<TextBlock>(Should be only visible on platforms without desktop-global menu bar)</TextBlock> <TextBlock>(Should be only visible on platforms without desktop-global menu bar)</TextBlock>
@ -45,7 +47,7 @@
<TextBlock Classes="h3" Margin="4 8">Dyanamically generated</TextBlock> <TextBlock Classes="h3" Margin="4 8">Dyanamically generated</TextBlock>
<Menu Items="{Binding MenuItems}"> <Menu Items="{Binding MenuItems}">
<Menu.Styles> <Menu.Styles>
<Style Selector="MenuItem"> <Style Selector="MenuItem" x:DataType="viewModels:MenuItemViewModel">
<Setter Property="Header" Value="{Binding Header}"/> <Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Items" Value="{Binding Items}"/> <Setter Property="Items" Value="{Binding Items}"/>
<Setter Property="Command" Value="{Binding Command}"/> <Setter Property="Command" Value="{Binding Command}"/>
@ -68,7 +70,7 @@
<Separator/> <Separator/>
<MenuItem Header="_Recent" Items="{Binding RecentItems}"> <MenuItem Header="_Recent" Items="{Binding RecentItems}">
<MenuItem.Styles> <MenuItem.Styles>
<Style Selector="MenuItem"> <Style Selector="MenuItem" x:DataType="viewModels:MenuItemViewModel">
<Setter Property="Header" Value="{Binding Header}"/> <Setter Property="Header" Value="{Binding Header}"/>
</Style> </Style>
</MenuItem.Styles> </MenuItem.Styles>

4
samples/ControlCatalog/Pages/NotificationsPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.NotificationsPage"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Pages.NotificationsPage"
x:DataType="viewModels:NotificationViewModel">
<StackPanel Orientation="Vertical" Spacing="4" HorizontalAlignment="Left"> <StackPanel Orientation="Vertical" Spacing="4" HorizontalAlignment="Left">
<Button Content="Show Standard Managed Notification" Command="{Binding ShowManagedNotificationCommand}" /> <Button Content="Show Standard Managed Notification" Command="{Binding ShowManagedNotificationCommand}" />
<Button Content="Show Custom Managed Notification" Command="{Binding ShowCustomManagedNotificationCommand}" /> <Button Content="Show Custom Managed Notification" Command="{Binding ShowCustomManagedNotificationCommand}" />

15
samples/ControlCatalog/Pages/NotificationsPage.xaml.cs

@ -1,18 +1,33 @@
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using ControlCatalog.ViewModels;
namespace ControlCatalog.Pages namespace ControlCatalog.Pages
{ {
public class NotificationsPage : UserControl public class NotificationsPage : UserControl
{ {
private NotificationViewModel _viewModel;
public NotificationsPage() public NotificationsPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
_viewModel = new NotificationViewModel();
DataContext = _viewModel;
} }
private void InitializeComponent() private void InitializeComponent()
{ {
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
_viewModel.NotificationManager = new Avalonia.Controls.Notifications.WindowNotificationManager(VisualRoot as TopLevel);
}
} }
} }

11
samples/ControlCatalog/Pages/NumericUpDownPage.xaml

@ -1,8 +1,10 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard" xmlns:sys="using:System"
xmlns:converter="clr-namespace:ControlCatalog.Converter" xmlns:converter="using:ControlCatalog.Converter"
x:Class="ControlCatalog.Pages.NumericUpDownPage"> xmlns:pages="using:ControlCatalog.Pages"
x:Class="ControlCatalog.Pages.NumericUpDownPage"
x:DataType="pages:NumbersPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4" <StackPanel Orientation="Vertical" Spacing="4"
MaxWidth="800"> MaxWidth="800">
<TextBlock Margin="2" Classes="h2" TextWrapping="Wrap">Numeric up-down control provides a TextBox with button spinners that allow incrementing and decrementing numeric values by using the spinner buttons, keyboard up/down arrows, or mouse wheel.</TextBlock> <TextBlock Margin="2" Classes="h2" TextWrapping="Wrap">Numeric up-down control provides a TextBox with button spinners that allow incrementing and decrementing numeric values by using the spinner buttons, keyboard up/down arrows, or mouse wheel.</TextBlock>
@ -43,7 +45,7 @@
VerticalAlignment="Center" Margin="2"/> VerticalAlignment="Center" Margin="2"/>
<TextBlock Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" Margin="2">CultureInfo:</TextBlock> <TextBlock Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" Margin="2">CultureInfo:</TextBlock>
<ComboBox Grid.Row="2" Grid.Column="1" Items="{Binding Cultures}" SelectedItem="{Binding #upDown.CultureInfo}" <ComboBox x:Name="CultureSelector" Grid.Row="2" Grid.Column="1" Items="{Binding Cultures}"
VerticalAlignment="Center" Margin="2"/> VerticalAlignment="Center" Margin="2"/>
<TextBlock Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Margin="2">Watermark:</TextBlock> <TextBlock Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Margin="2">Watermark:</TextBlock>
@ -77,6 +79,7 @@
<StackPanel Orientation="Vertical" Margin="10"> <StackPanel Orientation="Vertical" Margin="10">
<Label Target="upDown" FontSize="14" FontWeight="Bold" VerticalAlignment="Center">Usage of decimal NumericUpDown:</Label> <Label Target="upDown" FontSize="14" FontWeight="Bold" VerticalAlignment="Center">Usage of decimal NumericUpDown:</Label>
<NumericUpDown Name="upDown" Minimum="0" Maximum="10" Increment="0.5" <NumericUpDown Name="upDown" Minimum="0" Maximum="10" Increment="0.5"
NumberFormat="{Binding #CultureSelector.SelectedItem, Converter={x:Static pages:NumericUpDownPage.CultureConverter}}"
VerticalAlignment="Center" Value="{Binding DecimalValue}" VerticalAlignment="Center" Value="{Binding DecimalValue}"
Watermark="Enter text" FormatString="{Binding SelectedFormat.Value}"/> Watermark="Enter text" FormatString="{Binding SelectedFormat.Value}"/>
</StackPanel> </StackPanel>

3
samples/ControlCatalog/Pages/NumericUpDownPage.xaml.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Data.Converters;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using MiniMvvm; using MiniMvvm;
@ -22,6 +23,8 @@ namespace ControlCatalog.Pages
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
public static IValueConverter CultureConverter =
new FuncValueConverter<CultureInfo, NumberFormatInfo>(c => (c ?? CultureInfo.CurrentCulture).NumberFormat);
} }
public class NumbersPageViewModel : ViewModelBase public class NumbersPageViewModel : ViewModelBase

2
samples/ControlCatalog/Pages/OpenGlPage.xaml

@ -1,7 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.OpenGlPage" x:Class="ControlCatalog.Pages.OpenGlPage"
xmlns:pages="clr-namespace:ControlCatalog.Pages"> xmlns:pages="using:ControlCatalog.Pages">
<Grid> <Grid>
<pages:OpenGlPageControl x:Name="GL"/> <pages:OpenGlPageControl x:Name="GL"/>
<StackPanel> <StackPanel>

53
samples/ControlCatalog/Pages/PlatformInfoPage.xaml

@ -0,0 +1,53 @@
<UserControl x:Class="ControlCatalog.Pages.PlatformInfoPage"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:ControlCatalog.ViewModels"
d:DesignHeight="800"
d:DesignWidth="400"
mc:Ignorable="d"
x:DataType="viewModels:PlatformInformationViewModel">
<StackPanel Spacing="20">
<TextBlock Text="{Binding PlatformInfo}" />
<StackPanel TextElement.Foreground="White">
<StackPanel Orientation="Horizontal">
<Border Height="100" Width="100" Background="{OnFormFactor Gray, Desktop=Green}">
<TextBlock Text="Desktop" />
</Border>
<Border Height="100" Width="100" Background="{OnFormFactor Gray, Mobile=Green}">
<TextBlock Text="Mobile" />
</Border>
</StackPanel>
<WrapPanel>
<Border Height="100" Width="100" Background="{OnPlatform Gray, Windows=Green}">
<TextBlock Text="Windows" />
</Border>
<Border Height="100" Width="100" Background="{OnPlatform Gray, macOS=Green}">
<TextBlock Text="macOS" />
</Border>
<Border Height="100" Width="100" Background="{OnPlatform Gray, Linux=Green}">
<TextBlock Text="Linux" />
</Border>
<Border Height="100" Width="100" Background="{OnPlatform Gray, Browser=Green}">
<TextBlock Text="Browser" />
</Border>
<Border Height="100" Width="100" Background="{OnPlatform Gray, iOS=Green}">
<TextBlock Text="iOS" />
</Border>
<Border Height="100" Width="100" Background="{OnPlatform Gray, Android=Green}">
<TextBlock Text="Android" />
</Border>
<Border Height="100" Width="100">
<Border.Background>
<OnPlatform Default="Gray" >
<On Options="macOS, Linux, Windows" Content="Green" />
</OnPlatform>
</Border.Background>
<TextBlock Text="Win, Lin or Mac" />
</Border>
</WrapPanel>
</StackPanel>
</StackPanel>
</UserControl>

20
samples/ControlCatalog/Pages/PlatformInfoPage.xaml.cs

@ -0,0 +1,20 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using ControlCatalog.ViewModels;
namespace ControlCatalog.Pages
{
public class PlatformInfoPage : UserControl
{
public PlatformInfoPage()
{
this.InitializeComponent();
DataContext = new PlatformInformationViewModel();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
}
}

2
samples/ControlCatalog/Pages/ProgressBarPage.xaml

@ -31,7 +31,7 @@
<StackPanel Spacing="10"> <StackPanel Spacing="10">
<ProgressBar VerticalAlignment="Center" IsIndeterminate="True" <ProgressBar VerticalAlignment="Center" IsIndeterminate="True"
Minimum="{Binding #minimum.Value}" Maximum="{Binding #maximum.value}"/> Minimum="{Binding #minimum.Value}" Maximum="{Binding #maximum.Value}"/>
<ProgressBar VerticalAlignment="Center" Value="5" Maximum="10" /> <ProgressBar VerticalAlignment="Center" Value="5" Maximum="10" />
<ProgressBar VerticalAlignment="Center" Value="50" /> <ProgressBar VerticalAlignment="Center" Value="50" />
<ProgressBar VerticalAlignment="Center" Value="50" Minimum="25" Maximum="75" /> <ProgressBar VerticalAlignment="Center" Value="50" Minimum="25" Maximum="75" />

4
samples/ControlCatalog/Pages/ScrollViewerPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.ScrollViewerPage"> xmlns:pages="using:ControlCatalog.Pages"
x:Class="ControlCatalog.Pages.ScrollViewerPage"
x:DataType="pages:ScrollViewerPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">Allows for horizontal and vertical content scrolling.</TextBlock> <TextBlock Classes="h2">Allows for horizontal and vertical content scrolling.</TextBlock>

2
samples/ControlCatalog/Pages/SliderPage.xaml

@ -1,6 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard" xmlns:sys="using:System"
x:Class="ControlCatalog.Pages.SliderPage"> x:Class="ControlCatalog.Pages.SliderPage">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">A control that lets the user select from a range of values by moving a Thumb control along a Track.</TextBlock> <TextBlock Classes="h2">A control that lets the user select from a range of values by moving a Thumb control along a Track.</TextBlock>

6
samples/ControlCatalog/Pages/SplitViewPage.xaml

@ -2,8 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:ControlCatalog.ViewModels"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="ControlCatalog.Pages.SplitViewPage"> x:Class="ControlCatalog.Pages.SplitViewPage"
x:DataType="viewModels:SplitViewPageViewModel">
<Border> <Border>
@ -51,7 +53,7 @@
<!--{Binding SelectedItem.Tag, ElementName=PaneBackgroundSelector}--> <!--{Binding SelectedItem.Tag, ElementName=PaneBackgroundSelector}-->
<SplitView Name="SplitView" <SplitView Name="SplitView"
PanePlacement="{Binding PanePlacement}" PanePlacement="{Binding PanePlacement}"
PaneBackground="{Binding SelectedItem.Tag, ElementName=PaneBackgroundSelector}" PaneBackground="{Binding ((Control)SelectedItem).Tag, ElementName=PaneBackgroundSelector, FallbackValue={x:Null}}"
OpenPaneLength="{Binding Value, ElementName=OpenPaneLengthSlider}" OpenPaneLength="{Binding Value, ElementName=OpenPaneLengthSlider}"
CompactPaneLength="{Binding Value, ElementName=CompactPaneLengthSlider}" CompactPaneLength="{Binding Value, ElementName=CompactPaneLengthSlider}"
DisplayMode="{Binding CurrentDisplayMode}"> DisplayMode="{Binding CurrentDisplayMode}">

10
samples/ControlCatalog/Pages/TabControlPage.xaml

@ -1,7 +1,9 @@
<UserControl <UserControl
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.TabControlPage" x:Class="ControlCatalog.Pages.TabControlPage"
xmlns="https://github.com/avaloniaui"> xmlns="https://github.com/avaloniaui"
xmlns:viewModels="using:ControlCatalog.ViewModels"
x:DataType="viewModels:TabControlPageViewModel">
<DockPanel> <DockPanel>
<TextBlock <TextBlock
DockPanel.Dock="Top" DockPanel.Dock="Top"
@ -53,14 +55,14 @@
Margin="0 16" Margin="0 16"
TabStripPlacement="{Binding TabPlacement}"> TabStripPlacement="{Binding TabPlacement}">
<TabControl.ItemTemplate> <TabControl.ItemTemplate>
<DataTemplate> <DataTemplate x:DataType="viewModels:TabControlPageViewModelItem">
<TextBlock <TextBlock
Text="{Binding Header}"> Text="{Binding Header}">
</TextBlock> </TextBlock>
</DataTemplate> </DataTemplate>
</TabControl.ItemTemplate> </TabControl.ItemTemplate>
<TabControl.ContentTemplate> <TabControl.ContentTemplate>
<DataTemplate> <DataTemplate x:DataType="viewModels:TabControlPageViewModelItem">
<StackPanel Orientation="Vertical" Spacing="8"> <StackPanel Orientation="Vertical" Spacing="8">
<TextBlock Text="{Binding Text}"/> <TextBlock Text="{Binding Text}"/>
<Image Source="{Binding Image}" Width="300"/> <Image Source="{Binding Image}" Width="300"/>
@ -68,7 +70,7 @@
</DataTemplate> </DataTemplate>
</TabControl.ContentTemplate> </TabControl.ContentTemplate>
<TabControl.Styles> <TabControl.Styles>
<Style Selector="TabItem"> <Style Selector="TabItem" x:DataType="viewModels:TabControlPageViewModelItem">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/> <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
</Style> </Style>
</TabControl.Styles> </TabControl.Styles>

32
samples/ControlCatalog/Pages/TabControlPage.xaml.cs

@ -5,8 +5,7 @@ using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Media.Imaging; using Avalonia.Media.Imaging;
using Avalonia.Platform; using Avalonia.Platform;
using ControlCatalog.ViewModels;
using MiniMvvm;
namespace ControlCatalog.Pages namespace ControlCatalog.Pages
{ {
@ -18,23 +17,23 @@ namespace ControlCatalog.Pages
{ {
InitializeComponent(); InitializeComponent();
DataContext = new PageViewModel DataContext = new TabControlPageViewModel
{ {
Tabs = new[] Tabs = new[]
{ {
new TabItemViewModel new TabControlPageViewModelItem
{ {
Header = "Arch", Header = "Arch",
Text = "This is the first templated tab page.", Text = "This is the first templated tab page.",
Image = LoadBitmap("avares://ControlCatalog/Assets/delicate-arch-896885_640.jpg"), Image = LoadBitmap("avares://ControlCatalog/Assets/delicate-arch-896885_640.jpg"),
}, },
new TabItemViewModel new TabControlPageViewModelItem
{ {
Header = "Leaf", Header = "Leaf",
Text = "This is the second templated tab page.", Text = "This is the second templated tab page.",
Image = LoadBitmap("avares://ControlCatalog/Assets/maple-leaf-888807_640.jpg"), Image = LoadBitmap("avares://ControlCatalog/Assets/maple-leaf-888807_640.jpg"),
}, },
new TabItemViewModel new TabControlPageViewModelItem
{ {
Header = "Disabled", Header = "Disabled",
Text = "You should not see this.", Text = "You should not see this.",
@ -55,26 +54,5 @@ namespace ControlCatalog.Pages
var assets = AvaloniaLocator.Current!.GetService<IAssetLoader>()!; var assets = AvaloniaLocator.Current!.GetService<IAssetLoader>()!;
return new Bitmap(assets.Open(new Uri(uri))); return new Bitmap(assets.Open(new Uri(uri)));
} }
private class PageViewModel : ViewModelBase
{
private Dock _tabPlacement;
public TabItemViewModel[]? Tabs { get; set; }
public Dock TabPlacement
{
get { return _tabPlacement; }
set { this.RaiseAndSetIfChanged(ref _tabPlacement, value); }
}
}
private class TabItemViewModel
{
public string? Header { get; set; }
public string? Text { get; set; }
public IBitmap? Image { get; set; }
public bool IsEnabled { get; set; } = true;
}
} }
} }

10
samples/ControlCatalog/Pages/TabStripPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" <UserControl xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.TabStripPage" x:Class="ControlCatalog.Pages.TabStripPage"
xmlns="https://github.com/avaloniaui"> xmlns="https://github.com/avaloniaui"
xmlns:viewModels="using:ControlCatalog.ViewModels"
x:DataType="viewModels:TabControlPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">A control which displays a selectable strip of tabs</TextBlock> <TextBlock Classes="h2">A control which displays a selectable strip of tabs</TextBlock>
@ -16,14 +18,14 @@
<Separator Margin="0 16"/> <Separator Margin="0 16"/>
<TextBlock Classes="h1">Dynamically generated</TextBlock> <TextBlock Classes="h1">Dynamically generated</TextBlock>
<TabStrip Items="{Binding}"> <TabStrip Items="{Binding Tabs}">
<TabStrip.Styles> <TabStrip.Styles>
<Style Selector="TabStripItem"> <Style Selector="TabStripItem" x:DataType="viewModels:TabControlPageViewModelItem">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/> <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
</Style> </Style>
</TabStrip.Styles> </TabStrip.Styles>
<TabStrip.ItemTemplate> <TabStrip.ItemTemplate>
<DataTemplate> <DataTemplate x:DataType="viewModels:TabControlPageViewModelItem">
<TextBlock Text="{Binding Header}"/> <TextBlock Text="{Binding Header}"/>
</DataTemplate> </DataTemplate>
</TabStrip.ItemTemplate> </TabStrip.ItemTemplate>

40
samples/ControlCatalog/Pages/TabStripPage.xaml.cs

@ -1,9 +1,6 @@
using System;
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Media.Imaging; using ControlCatalog.ViewModels;
using Avalonia.Platform;
namespace ControlCatalog.Pages namespace ControlCatalog.Pages
{ {
@ -13,21 +10,24 @@ namespace ControlCatalog.Pages
{ {
InitializeComponent(); InitializeComponent();
DataContext = new[] DataContext = new TabControlPageViewModel
{ {
new TabStripItemViewModel Tabs = new []
{ {
Header = "Item 1", new TabControlPageViewModelItem()
}, {
new TabStripItemViewModel Header = "Item 1",
{ },
Header = "Item 2", new TabControlPageViewModelItem
}, {
new TabStripItemViewModel Header = "Item 2",
{ },
Header = "Disabled", new TabControlPageViewModelItem
IsEnabled = false, {
}, Header = "Disabled",
IsEnabled = false,
},
}
}; };
} }
@ -35,11 +35,5 @@ namespace ControlCatalog.Pages
{ {
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
private class TabStripItemViewModel
{
public string? Header { get; set; }
public bool IsEnabled { get; set; } = true;
}
} }
} }

2
samples/ControlCatalog/Pages/TextBoxPage.xaml

@ -1,7 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.TextBoxPage" x:Class="ControlCatalog.Pages.TextBoxPage"
xmlns:sys="clr-namespace:System;assembly=netstandard"> xmlns:sys="using:System">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<Label Classes="h2">A control into which the user can input text</Label> <Label Classes="h2">A control into which the user can input text</Label>

3
samples/ControlCatalog/Pages/TransitioningContentControlPage.axaml

@ -3,11 +3,10 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:ControlCatalog.ViewModels" xmlns:vm="using:ControlCatalog.ViewModels"
xmlns:converter="clr-namespace:ControlCatalog.Converter" xmlns:converter="using:ControlCatalog.Converter"
xmlns:system="using:System" xmlns:system="using:System"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:DataType="vm:TransitioningContentControlPageViewModel" x:DataType="vm:TransitioningContentControlPageViewModel"
x:CompileBindings="True"
x:Class="ControlCatalog.Pages.TransitioningContentControlPage"> x:Class="ControlCatalog.Pages.TransitioningContentControlPage">
<UserControl.DataContext> <UserControl.DataContext>

4
samples/ControlCatalog/Pages/TreeViewPage.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Pages.TreeViewPage"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Pages.TreeViewPage"
x:DataType="viewModels:TreeViewPageViewModel">
<StackPanel Orientation="Vertical" Spacing="4"> <StackPanel Orientation="Vertical" Spacing="4">
<TextBlock Classes="h2">Displays a hierachical tree of data.</TextBlock> <TextBlock Classes="h2">Displays a hierachical tree of data.</TextBlock>

2
samples/ControlCatalog/Pages/ViewboxPage.xaml

@ -1,6 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:collections="clr-namespace:System.Collections;assembly=netstandard" xmlns:collections="using:System.Collections"
x:Class="ControlCatalog.Pages.ViewboxPage"> x:Class="ControlCatalog.Pages.ViewboxPage">
<Grid RowDefinitions="Auto,*,*"> <Grid RowDefinitions="Auto,*,*">

4
samples/ControlCatalog/Pages/WindowCustomizationsPage.xaml

@ -2,8 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:ControlCatalog.ViewModels"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="ControlCatalog.Pages.WindowCustomizationsPage"> x:Class="ControlCatalog.Pages.WindowCustomizationsPage"
x:DataType="viewModels:MainWindowViewModel">
<StackPanel Spacing="10" Margin="25"> <StackPanel Spacing="10" Margin="25">
<CheckBox Content="Extend Client Area to Decorations" IsChecked="{Binding ExtendClientAreaEnabled}" /> <CheckBox Content="Extend Client Area to Decorations" IsChecked="{Binding ExtendClientAreaEnabled}" />
<CheckBox Content="Title Bar" IsChecked="{Binding SystemTitleBarEnabled}" /> <CheckBox Content="Title Bar" IsChecked="{Binding SystemTitleBarEnabled}" />

20
samples/ControlCatalog/ViewModels/CursorPageViewModel.cs

@ -27,18 +27,18 @@ namespace ControlCatalog.ViewModels
public IEnumerable<StandardCursorModel> StandardCursors { get; } public IEnumerable<StandardCursorModel> StandardCursors { get; }
public Cursor CustomCursor { get; } public Cursor CustomCursor { get; }
}
public class StandardCursorModel
public class StandardCursorModel
{
public StandardCursorModel(StandardCursorType type)
{ {
public StandardCursorModel(StandardCursorType type) Type = type;
{ Cursor = new Cursor(type);
Type = type; }
Cursor = new Cursor(type);
}
public StandardCursorType Type { get; } public StandardCursorType Type { get; }
public Cursor Cursor { get; } public Cursor Cursor { get; }
}
} }
} }

44
samples/ControlCatalog/ViewModels/ItemsRepeaterPageViewModel.cs

@ -10,25 +10,25 @@ namespace ControlCatalog.ViewModels
{ {
private int _newItemIndex = 1; private int _newItemIndex = 1;
private int _newGenerationIndex = 0; private int _newGenerationIndex = 0;
private ObservableCollection<Item> _items; private ObservableCollection<ItemsRepeaterPageViewModelItem> _items;
public ItemsRepeaterPageViewModel() public ItemsRepeaterPageViewModel()
{ {
_items = CreateItems(); _items = CreateItems();
} }
public ObservableCollection<Item> Items public ObservableCollection<ItemsRepeaterPageViewModelItem> Items
{ {
get => _items; get => _items;
set => this.RaiseAndSetIfChanged(ref _items, value); set => this.RaiseAndSetIfChanged(ref _items, value);
} }
public Item? SelectedItem { get; set; } public ItemsRepeaterPageViewModelItem? SelectedItem { get; set; }
public void AddItem() public void AddItem()
{ {
var index = SelectedItem != null ? Items.IndexOf(SelectedItem) : -1; var index = SelectedItem != null ? Items.IndexOf(SelectedItem) : -1;
Items.Insert(index + 1, new Item(index + 1, $"New Item {_newItemIndex++}")); Items.Insert(index + 1, new ItemsRepeaterPageViewModelItem(index + 1, $"New Item {_newItemIndex++}"));
} }
public void RemoveItem() public void RemoveItem()
@ -59,33 +59,33 @@ namespace ControlCatalog.ViewModels
Items = CreateItems(); Items = CreateItems();
} }
private ObservableCollection<Item> CreateItems() private ObservableCollection<ItemsRepeaterPageViewModelItem> CreateItems()
{ {
var suffix = _newGenerationIndex == 0 ? string.Empty : $"[{_newGenerationIndex.ToString()}]"; var suffix = _newGenerationIndex == 0 ? string.Empty : $"[{_newGenerationIndex.ToString()}]";
_newGenerationIndex++; _newGenerationIndex++;
return new ObservableCollection<Item>( return new ObservableCollection<ItemsRepeaterPageViewModelItem>(
Enumerable.Range(1, 100000).Select(i => new Item(i, $"Item {i.ToString()} {suffix}"))); Enumerable.Range(1, 100000).Select(i => new ItemsRepeaterPageViewModelItem(i, $"Item {i.ToString()} {suffix}")));
} }
}
public class ItemsRepeaterPageViewModelItem : ViewModelBase
{
private double _height = double.NaN;
public class Item : ViewModelBase public ItemsRepeaterPageViewModelItem(int index, string text)
{ {
private double _height = double.NaN; Index = index;
Text = text;
public Item(int index, string text) }
{ public int Index { get; }
Index = index; public string Text { get; }
Text = text;
}
public int Index { get; }
public string Text { get; }
public double Height public double Height
{ {
get => _height; get => _height;
set => this.RaiseAndSetIfChanged(ref _height, value); set => this.RaiseAndSetIfChanged(ref _height, value);
}
} }
} }
} }

32
samples/ControlCatalog/ViewModels/MainWindowViewModel.cs

@ -24,25 +24,8 @@ namespace ControlCatalog.ViewModels
private bool _preferSystemChromeEnabled; private bool _preferSystemChromeEnabled;
private double _titleBarHeight; private double _titleBarHeight;
public MainWindowViewModel(IManagedNotificationManager notificationManager) public MainWindowViewModel()
{ {
_notificationManager = notificationManager;
ShowCustomManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager.Show(new NotificationViewModel(NotificationManager) { Title = "Hey There!", Message = "Did you know that Avalonia now supports Custom In-Window Notifications?" });
});
ShowManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Welcome", "Avalonia now supports Notifications.", NotificationType.Information));
});
ShowNativeNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Error", "Native Notifications are not quite ready. Coming soon.", NotificationType.Error));
});
AboutCommand = MiniCommand.CreateFromTask(async () => AboutCommand = MiniCommand.CreateFromTask(async () =>
{ {
var dialog = new AboutAvaloniaDialog(); var dialog = new AboutAvaloniaDialog();
@ -52,7 +35,6 @@ namespace ControlCatalog.ViewModels
await dialog.ShowDialog(mainWindow); await dialog.ShowDialog(mainWindow);
} }
}); });
ExitCommand = MiniCommand.Create(() => ExitCommand = MiniCommand.Create(() =>
{ {
(App.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.Shutdown(); (App.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.Shutdown();
@ -143,24 +125,12 @@ namespace ControlCatalog.ViewModels
set { this.RaiseAndSetIfChanged(ref _windowStates, value); } set { this.RaiseAndSetIfChanged(ref _windowStates, value); }
} }
public IManagedNotificationManager NotificationManager
{
get { return _notificationManager; }
set { this.RaiseAndSetIfChanged(ref _notificationManager, value); }
}
public bool IsMenuItemChecked public bool IsMenuItemChecked
{ {
get { return _isMenuItemChecked; } get { return _isMenuItemChecked; }
set { this.RaiseAndSetIfChanged(ref _isMenuItemChecked, value); } set { this.RaiseAndSetIfChanged(ref _isMenuItemChecked, value); }
} }
public MiniCommand ShowCustomManagedNotificationCommand { get; }
public MiniCommand ShowManagedNotificationCommand { get; }
public MiniCommand ShowNativeNotificationCommand { get; }
public MiniCommand AboutCommand { get; } public MiniCommand AboutCommand { get; }
public MiniCommand ExitCommand { get; } public MiniCommand ExitCommand { get; }

29
samples/ControlCatalog/ViewModels/NotificationViewModel.cs

@ -6,16 +6,33 @@ namespace ControlCatalog.ViewModels
{ {
public class NotificationViewModel public class NotificationViewModel
{ {
public NotificationViewModel(INotificationManager manager) public WindowNotificationManager? NotificationManager { get; set; }
public NotificationViewModel()
{ {
ShowCustomManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager?.Show(new NotificationViewModel() { Title = "Hey There!", Message = "Did you know that Avalonia now supports Custom In-Window Notifications?" , NotificationManager = NotificationManager});
});
ShowManagedNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Welcome", "Avalonia now supports Notifications.", NotificationType.Information));
});
ShowNativeNotificationCommand = MiniCommand.Create(() =>
{
NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Error", "Native Notifications are not quite ready. Coming soon.", NotificationType.Error));
});
YesCommand = MiniCommand.Create(() => YesCommand = MiniCommand.Create(() =>
{ {
manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today.")); NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today."));
}); });
NoCommand = MiniCommand.Create(() => NoCommand = MiniCommand.Create(() =>
{ {
manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today. To find out more visit...")); NotificationManager?.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today. To find out more visit..."));
}); });
} }
@ -26,5 +43,11 @@ namespace ControlCatalog.ViewModels
public MiniCommand NoCommand { get; } public MiniCommand NoCommand { get; }
public MiniCommand ShowCustomManagedNotificationCommand { get; }
public MiniCommand ShowManagedNotificationCommand { get; }
public MiniCommand ShowNativeNotificationCommand { get; }
} }
} }

54
samples/ControlCatalog/ViewModels/PlatformInformationViewModel.cs

@ -0,0 +1,54 @@
using Avalonia;
using Avalonia.Platform;
using MiniMvvm;
namespace ControlCatalog.ViewModels;
#nullable enable
public class PlatformInformationViewModel : ViewModelBase
{
public PlatformInformationViewModel()
{
var runtimeInfo = AvaloniaLocator.Current.GetService<IRuntimePlatform>()?.GetRuntimeInfo();
if (runtimeInfo is { } info)
{
if (info.IsBrowser)
{
if (info.IsDesktop)
{
PlatformInfo = "Platform: Desktop (browser)";
}
else if (info.IsMobile)
{
PlatformInfo = "Platform: Mobile (browser)";
}
else
{
PlatformInfo = "Platform: Unknown (browser) - please report";
}
}
else
{
if (info.IsDesktop)
{
PlatformInfo = "Platform: Desktop (native)";
}
else if (info.IsMobile)
{
PlatformInfo = "Platform: Mobile (native)";
}
else
{
PlatformInfo = "Platform: Unknown (native) - please report";
}
}
}
else
{
}
}
public string PlatformInfo { get; }
}

26
samples/ControlCatalog/ViewModels/TabControlPageViewModel.cs

@ -0,0 +1,26 @@
using Avalonia.Controls;
using Avalonia.Media.Imaging;
using MiniMvvm;
namespace ControlCatalog.ViewModels;
public class TabControlPageViewModel : ViewModelBase
{
private Dock _tabPlacement;
public TabControlPageViewModelItem[]? Tabs { get; set; }
public Dock TabPlacement
{
get { return _tabPlacement; }
set { this.RaiseAndSetIfChanged(ref _tabPlacement, value); }
}
}
public class TabControlPageViewModelItem
{
public string? Header { get; set; }
public string? Text { get; set; }
public IBitmap? Image { get; set; }
public bool IsEnabled { get; set; } = true;
}

4
samples/ControlCatalog/Views/CustomNotificationView.xaml

@ -1,6 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ControlCatalog.Views.CustomNotificationView"> xmlns:viewModels="using:ControlCatalog.ViewModels"
x:Class="ControlCatalog.Views.CustomNotificationView"
x:DataType="viewModels:NotificationViewModel">
<Border Padding="12" MinHeight="20" Background="DodgerBlue"> <Border Padding="12" MinHeight="20" Background="DodgerBlue">
<Grid ColumnDefinitions="Auto,*"> <Grid ColumnDefinitions="Auto,*">
<Panel Margin="0,0,12,0" Width="25" Height="25" VerticalAlignment="Top"> <Panel Margin="0,0,12,0" Width="25" Height="25" VerticalAlignment="Top">

2
samples/IntegrationTestApp/IntegrationTestApp.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>

10
samples/IntegrationTestApp/MainWindow.axaml

@ -2,10 +2,12 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:integrationTestApp="using:IntegrationTestApp"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="IntegrationTestApp.MainWindow" x:Class="IntegrationTestApp.MainWindow"
Name="MainWindow" Name="MainWindow"
Title="IntegrationTestApp"> Title="IntegrationTestApp"
x:DataType="integrationTestApp:MainWindow">
<NativeMenu.Menu> <NativeMenu.Menu>
<NativeMenu> <NativeMenu>
<NativeMenuItem Header="File"> <NativeMenuItem Header="File">
@ -126,6 +128,12 @@
<ComboBoxItem>CenterScreen</ComboBoxItem> <ComboBoxItem>CenterScreen</ComboBoxItem>
<ComboBoxItem>CenterOwner</ComboBoxItem> <ComboBoxItem>CenterOwner</ComboBoxItem>
</ComboBox> </ComboBox>
<ComboBox Name="ShowWindowState" SelectedIndex="0">
<ComboBoxItem>Normal</ComboBoxItem>
<ComboBoxItem>Minimized</ComboBoxItem>
<ComboBoxItem>Maximized</ComboBoxItem>
<ComboBoxItem>FullScreen</ComboBoxItem>
</ComboBox>
<Button Name="ShowWindow">Show Window</Button> <Button Name="ShowWindow">Show Window</Button>
<Button Name="SendToBack">Send to Back</Button> <Button Name="SendToBack">Send to Back</Button>
<Button Name="ExitFullscreen">Exit Fullscreen</Button> <Button Name="ExitFullscreen">Exit Fullscreen</Button>

2
samples/IntegrationTestApp/MainWindow.axaml.cs

@ -59,6 +59,7 @@ namespace IntegrationTestApp
var sizeTextBox = this.GetControl<TextBox>("ShowWindowSize"); var sizeTextBox = this.GetControl<TextBox>("ShowWindowSize");
var modeComboBox = this.GetControl<ComboBox>("ShowWindowMode"); var modeComboBox = this.GetControl<ComboBox>("ShowWindowMode");
var locationComboBox = this.GetControl<ComboBox>("ShowWindowLocation"); var locationComboBox = this.GetControl<ComboBox>("ShowWindowLocation");
var stateComboBox = this.GetControl<ComboBox>("ShowWindowState");
var size = !string.IsNullOrWhiteSpace(sizeTextBox.Text) ? Size.Parse(sizeTextBox.Text) : (Size?)null; var size = !string.IsNullOrWhiteSpace(sizeTextBox.Text) ? Size.Parse(sizeTextBox.Text) : (Size?)null;
var owner = (Window)this.GetVisualRoot()!; var owner = (Window)this.GetVisualRoot()!;
@ -85,6 +86,7 @@ namespace IntegrationTestApp
} }
sizeTextBox.Text = string.Empty; sizeTextBox.Text = string.Empty;
window.WindowState = (WindowState)stateComboBox.SelectedIndex;
switch (modeComboBox.SelectedIndex) switch (modeComboBox.SelectedIndex)
{ {

3
samples/IntegrationTestApp/ShowWindowTest.axaml

@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="IntegrationTestApp.ShowWindowTest" x:Class="IntegrationTestApp.ShowWindowTest"
Name="SecondaryWindow" Name="SecondaryWindow"
x:DataType="Window"
Title="Show Window Test"> Title="Show Window Test">
<Grid ColumnDefinitions="Auto,Auto" RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto"> <Grid ColumnDefinitions="Auto,Auto" RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
<Label Grid.Column="0" Grid.Row="1">Client Size</Label> <Label Grid.Column="0" Grid.Row="1">Client Size</Label>
@ -29,7 +30,7 @@
<ComboBoxItem>Normal</ComboBoxItem> <ComboBoxItem>Normal</ComboBoxItem>
<ComboBoxItem>Minimized</ComboBoxItem> <ComboBoxItem>Minimized</ComboBoxItem>
<ComboBoxItem>Maximized</ComboBoxItem> <ComboBoxItem>Maximized</ComboBoxItem>
<ComboBoxItem>Fullscreen</ComboBoxItem> <ComboBoxItem>FullScreen</ComboBoxItem>
</ComboBox> </ComboBox>
<Label Grid.Column="0" Grid.Row="8">Order (mac)</Label> <Label Grid.Column="0" Grid.Row="8">Order (mac)</Label>

1
samples/MobileSandbox/App.xaml

@ -1,6 +1,5 @@
<Application xmlns="https://github.com/avaloniaui" <Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True"
Name="Mobile Sandbox" Name="Mobile Sandbox"
x:Class="MobileSandbox.App"> x:Class="MobileSandbox.App">
<Application.Styles> <Application.Styles>

4
samples/MobileSandbox/MainView.xaml

@ -1,6 +1,8 @@
<UserControl x:Class="MobileSandbox.MainView" <UserControl x:Class="MobileSandbox.MainView"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mobileSandbox="using:MobileSandbox"
x:DataType="mobileSandbox:MainView">
<StackPanel Margin="100 50" Spacing="50"> <StackPanel Margin="100 50" Spacing="50">
<TextBlock Text="Login" Foreground="White" /> <TextBlock Text="Login" Foreground="White" />
<TextBox Watermark="Text" /> <TextBox Watermark="Text" />

8
samples/MobileSandbox/Views/CustomNotificationView.xaml

@ -7,12 +7,12 @@
<TextBlock Text="&#xE115;" FontFamily="Segoe UI Symbol" FontSize="20" TextAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="&#xE115;" FontFamily="Segoe UI Symbol" FontSize="20" TextAlignment="Center" VerticalAlignment="Center"/>
</Panel> </Panel>
<DockPanel Grid.Column="1"> <DockPanel Grid.Column="1">
<TextBlock DockPanel.Dock="Top" Text="{Binding Title}" FontWeight="Medium" /> <TextBlock DockPanel.Dock="Top" Text="{ReflectionBinding Title}" FontWeight="Medium" />
<StackPanel Spacing="20" DockPanel.Dock="Bottom" Margin="0,8,0,0" Orientation="Horizontal"> <StackPanel Spacing="20" DockPanel.Dock="Bottom" Margin="0,8,0,0" Orientation="Horizontal">
<Button Content="No" DockPanel.Dock="Right" NotificationCard.CloseOnClick="True" Command="{Binding NoCommand}" Margin="0,0,8,0" /> <Button Content="No" DockPanel.Dock="Right" NotificationCard.CloseOnClick="True" Command="{ReflectionBinding NoCommand}" Margin="0,0,8,0" />
<Button Content="Yes" DockPanel.Dock="Right" NotificationCard.CloseOnClick="True" Command="{Binding YesCommand}" /> <Button Content="Yes" DockPanel.Dock="Right" NotificationCard.CloseOnClick="True" Command="{ReflectionBinding YesCommand}" />
</StackPanel> </StackPanel>
<TextBlock Text="{Binding Message}" TextWrapping="Wrap" Opacity=".8" Margin="0,8,0,0"/> <TextBlock Text="{ReflectionBinding Message}" TextWrapping="Wrap" Opacity=".8" Margin="0,8,0,0"/>
</DockPanel> </DockPanel>
</Grid> </Grid>
</Border> </Border>

6
samples/RenderDemo/MainWindow.xaml

@ -1,9 +1,11 @@
<Window x:Class="RenderDemo.MainWindow" <Window x:Class="RenderDemo.MainWindow"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:ControlSamples;assembly=ControlSamples" xmlns:controls="using:ControlSamples"
xmlns:pages="clr-namespace:RenderDemo.Pages" xmlns:pages="using:RenderDemo.Pages"
xmlns:viewModels="using:RenderDemo.ViewModels"
Title="AvaloniaUI Rendering Test" Title="AvaloniaUI Rendering Test"
x:DataType="viewModels:MainWindowViewModel"
Width="{Binding Width, Mode=TwoWay}" Width="{Binding Width, Mode=TwoWay}"
Height="{Binding Height, Mode=TwoWay}"> Height="{Binding Height, Mode=TwoWay}">
<controls:HamburgerMenu ExpandedModeThresholdWidth="760"> <controls:HamburgerMenu ExpandedModeThresholdWidth="760">

4
samples/RenderDemo/Pages/AnimationsPage.xaml

@ -1,7 +1,9 @@
<UserControl <UserControl
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="using:RenderDemo.ViewModels"
x:Class="RenderDemo.Pages.AnimationsPage" x:Class="RenderDemo.Pages.AnimationsPage"
x:DataType="viewModels:AnimationsPageViewModel"
MaxWidth="600"> MaxWidth="600">
<UserControl.Styles> <UserControl.Styles>
<Styles> <Styles>

2
samples/RenderDemo/Pages/CustomAnimatorPage.xaml

@ -1,7 +1,7 @@
<UserControl <UserControl
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pages="clr-namespace:RenderDemo.Pages" xmlns:pages="using:RenderDemo.Pages"
x:Class="RenderDemo.Pages.CustomAnimatorPage" x:Class="RenderDemo.Pages.CustomAnimatorPage"
MaxWidth="600"> MaxWidth="600">
<Grid> <Grid>

2
samples/RenderDemo/Pages/GlyphRunPage.xaml

@ -2,7 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:RenderDemo.Pages" xmlns:local="using:RenderDemo.Pages"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="RenderDemo.Pages.GlyphRunPage"> x:Class="RenderDemo.Pages.GlyphRunPage">
<Grid <Grid

2
samples/RenderDemo/Pages/LineBoundsPage.xaml

@ -3,7 +3,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
xmlns:controls="clr-namespace:RenderDemo.Controls" xmlns:controls="using:RenderDemo.Controls"
x:Class="RenderDemo.Pages.LineBoundsPage"> x:Class="RenderDemo.Pages.LineBoundsPage">
<controls:LineBoundsDemoControl /> <controls:LineBoundsDemoControl />
</UserControl> </UserControl>

4
samples/RenderDemo/Pages/Transform3DPage.axaml

@ -2,8 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:RenderDemo.ViewModels"
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="700" mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="700"
x:Class="RenderDemo.Pages.Transform3DPage"> x:Class="RenderDemo.Pages.Transform3DPage"
x:DataType="viewModels:Transform3DPageViewModel">
<UserControl.Styles> <UserControl.Styles>
<Styles> <Styles>
<Styles.Resources> <Styles.Resources>

2
samples/RenderDemo/Pages/TransitionsPage.xaml

@ -1,7 +1,9 @@
<UserControl <UserControl
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="using:RenderDemo.ViewModels"
x:Class="RenderDemo.Pages.TransitionsPage" x:Class="RenderDemo.Pages.TransitionsPage"
x:DataType="viewModels:AnimationsPageViewModel"
MaxWidth="600"> MaxWidth="600">
<UserControl.Styles> <UserControl.Styles>
<Styles> <Styles>

6
samples/SampleControls/HamburgerMenu/HamburgerMenu.xaml

@ -194,7 +194,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
Classes="h1" Classes="h1"
Margin="{StaticResource HeaderMarginExpandedPane}" Margin="{StaticResource HeaderMarginExpandedPane}"
Text="{Binding $parent[TabControl].SelectedItem.Header, FallbackValue=''}"> Text="{Binding $parent[TabControl].SelectedItem.(TabItem.Header), FallbackValue=''}">
<TextBlock.Transitions> <TextBlock.Transitions>
<Transitions> <Transitions>
<ThicknessTransition Easing="{StaticResource SplitViewPaneAnimationEasing}" <ThicknessTransition Easing="{StaticResource SplitViewPaneAnimationEasing}"
@ -250,10 +250,10 @@
<Setter Property="PaneBackground" Value="{TemplateBinding PaneBackground}" /> <Setter Property="PaneBackground" Value="{TemplateBinding PaneBackground}" />
</Style> </Style>
<Style Selector="^ /template/ SplitView[DisplayMode=Overlay]"> <Style Selector="^ /template/ SplitView[DisplayMode=Overlay]">
<Setter Property="Background" Value="{Binding $parent[TabControl].ContentBackground}" /> <Setter Property="Background" Value="{Binding $parent[catalog:HamburgerMenu].ContentBackground}" />
</Style> </Style>
<Style Selector="^ /template/ SplitView[DisplayMode=Inline] Border#BackgroundBorder"> <Style Selector="^ /template/ SplitView[DisplayMode=Inline] Border#BackgroundBorder">
<Setter Property="Background" Value="{Binding $parent[TabControl].ContentBackground}" /> <Setter Property="Background" Value="{Binding $parent[catalog:HamburgerMenu].ContentBackground}" />
<Setter Property="BoxShadow" Value="{StaticResource NavigationContentShadow}" /> <Setter Property="BoxShadow" Value="{StaticResource NavigationContentShadow}" />
</Style> </Style>
<Style Selector="^ /template/ SplitView[DisplayMode=Inline][IsPaneOpen=True] Border#BackgroundBorder"> <Style Selector="^ /template/ SplitView[DisplayMode=Inline][IsPaneOpen=True] Border#BackgroundBorder">

4
samples/VirtualizationDemo/MainWindow.xaml

@ -1,9 +1,11 @@
<Window xmlns="https://github.com/avaloniaui" <Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="using:VirtualizationDemo.ViewModels"
x:Class="VirtualizationDemo.MainWindow" x:Class="VirtualizationDemo.MainWindow"
Title="AvaloniaUI Virtualization Test" Title="AvaloniaUI Virtualization Test"
Width="800" Width="800"
Height="600"> Height="600"
x:DataType="viewModels:MainWindowViewModel">
<DockPanel LastChildFill="True" Margin="16"> <DockPanel LastChildFill="True" Margin="16">
<StackPanel DockPanel.Dock="Right" <StackPanel DockPanel.Dock="Right"
Margin="16 0 0 0" Margin="16 0 0 0"

7
src/Avalonia.Base/Avalonia.Base.csproj

@ -47,6 +47,13 @@
<InternalsVisibleTo Include="Avalonia.Diagnostics, PublicKey=$(AvaloniaPublicKey)" /> <InternalsVisibleTo Include="Avalonia.Diagnostics, PublicKey=$(AvaloniaPublicKey)" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7" /> <InternalsVisibleTo Include="DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7" />
</ItemGroup> </ItemGroup>
<ItemGroup Label="Build dependency">
<ProjectReference Include="$(MSBuildThisFileDirectory)\..\Avalonia.Build.Tasks\Avalonia.Build.Tasks.csproj"
SetTargetFramework="TargetFramework=netstandard2.0"
ReferenceOutputAssembly="false"
SkipGetTargetFrameworkProperties="true" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Compatibility\" /> <Folder Include="Compatibility\" />

8
src/Avalonia.Base/Input/MouseDevice.cs

@ -196,18 +196,12 @@ namespace Avalonia.Input
PointerPointProperties props, PointerPointProperties props,
Vector delta, KeyModifiers inputModifiers, IInputElement? hitTest) Vector delta, KeyModifiers inputModifiers, IInputElement? hitTest)
{ {
var rawDelta = delta;
device = device ?? throw new ArgumentNullException(nameof(device)); device = device ?? throw new ArgumentNullException(nameof(device));
root = root ?? throw new ArgumentNullException(nameof(root)); root = root ?? throw new ArgumentNullException(nameof(root));
var source = _pointer.Captured ?? hitTest; var source = _pointer.Captured ?? hitTest;
// KeyModifiers.Shift should scroll in horizontal direction. This does not work on every platform.
// If Shift-Key is pressed and X is close to 0 we swap the Vector.
if (inputModifiers == KeyModifiers.Shift && MathUtilities.IsZero(delta.X))
{
delta = new Vector(delta.Y, delta.X);
}
if (source is not null) if (source is not null)
{ {
var e = new PointerWheelEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers, delta); var e = new PointerWheelEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers, delta);

2
src/Avalonia.Base/Input/PointerWheelEventArgs.cs

@ -9,7 +9,7 @@ namespace Avalonia.Input
internal PointerWheelEventArgs(IInteractive source, IPointer pointer, IVisual rootVisual, internal PointerWheelEventArgs(IInteractive source, IPointer pointer, IVisual rootVisual,
Point rootVisualPosition, ulong timestamp, Point rootVisualPosition, ulong timestamp,
PointerPointProperties properties, KeyModifiers modifiers, Vector delta) PointerPointProperties properties, KeyModifiers modifiers, Vector delta)
: base(InputElement.PointerWheelChangedEvent, source, pointer, rootVisual, rootVisualPosition, : base(InputElement.PointerWheelChangedEvent, source, pointer, rootVisual, rootVisualPosition,
timestamp, properties, modifiers) timestamp, properties, modifiers)
{ {

22
src/Avalonia.Base/Metadata/MarkupExtensionOption.cs

@ -0,0 +1,22 @@
using System;
namespace Avalonia.Metadata;
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class MarkupExtensionOptionAttribute : Attribute
{
public MarkupExtensionOptionAttribute(object value)
{
Value = value;
}
public object Value { get; }
public int Priority { get; set; } = 0;
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class MarkupExtensionDefaultOptionAttribute : Attribute
{
}

13
src/Avalonia.Base/Platform/IRuntimePlatform.cs

@ -17,13 +17,16 @@ namespace Avalonia.Platform
IntPtr Address { get; } IntPtr Address { get; }
int Size { get; } int Size { get; }
bool IsDisposed { get; } bool IsDisposed { get; }
} }
[Unstable] [Unstable]
public struct RuntimePlatformInfo public struct RuntimePlatformInfo
{ {
public OperatingSystemType OperatingSystem { get; set; } public OperatingSystemType OperatingSystem { get; set; }
public FormFactorType FormFactor => IsDesktop ? FormFactorType.Desktop :
IsMobile ? FormFactorType.Mobile : FormFactorType.Unknown;
public bool IsDesktop { get; set; } public bool IsDesktop { get; set; }
public bool IsMobile { get; set; } public bool IsMobile { get; set; }
public bool IsBrowser { get; set; } public bool IsBrowser { get; set; }
@ -44,4 +47,12 @@ namespace Avalonia.Platform
iOS, iOS,
Browser Browser
} }
[Unstable]
public enum FormFactorType
{
Unknown,
Desktop,
Mobile
}
} }

2
src/Avalonia.Build.Tasks/BuildEngineErrorCode.cs

@ -5,5 +5,7 @@ namespace Avalonia.Build.Tasks
InvalidXAML = 1, InvalidXAML = 1,
DuplicateXClass = 2, DuplicateXClass = 2,
LegacyResmScheme = 3, LegacyResmScheme = 3,
Unknown = 9999
} }
} }

5
src/Avalonia.Build.Tasks/CompileAvaloniaXamlTask.cs

@ -36,7 +36,7 @@ namespace Avalonia.Build.Tasks
var res = XamlCompilerTaskExecutor.Compile(BuildEngine, input, var res = XamlCompilerTaskExecutor.Compile(BuildEngine, input,
File.ReadAllLines(ReferencesFilePath).Where(l => !string.IsNullOrWhiteSpace(l)).ToArray(), File.ReadAllLines(ReferencesFilePath).Where(l => !string.IsNullOrWhiteSpace(l)).ToArray(),
ProjectDirectory, OutputPath, VerifyIl, outputImportance, ProjectDirectory, OutputPath, VerifyIl, DefaultCompileBindings, outputImportance,
(SignAssembly && !DelaySign) ? AssemblyOriginatorKeyFile : null, SkipXamlCompilation, DebuggerLaunch); (SignAssembly && !DelaySign) ? AssemblyOriginatorKeyFile : null, SkipXamlCompilation, DebuggerLaunch);
if (!res.Success) if (!res.Success)
return false; return false;
@ -71,6 +71,9 @@ namespace Avalonia.Build.Tasks
public string OutputPath { get; set; } public string OutputPath { get; set; }
public bool VerifyIl { get; set; } public bool VerifyIl { get; set; }
public bool DefaultCompileBindings { get; set; }
public bool SkipXamlCompilation { get; set; } public bool SkipXamlCompilation { get; set; }
public string AssemblyOriginatorKeyFile { get; set; } public string AssemblyOriginatorKeyFile { get; set; }

72
src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs

@ -39,43 +39,52 @@ namespace Avalonia.Build.Tasks
public static CompileResult Compile(IBuildEngine engine, string input, string[] references, public static CompileResult Compile(IBuildEngine engine, string input, string[] references,
string projectDirectory, string projectDirectory,
string output, bool verifyIl, MessageImportance logImportance, string strongNameKey, string output, bool verifyIl, bool defaultCompileBindings, MessageImportance logImportance, string strongNameKey,
bool skipXamlCompilation) bool skipXamlCompilation)
{ {
return Compile(engine, input, references, projectDirectory, output, verifyIl, logImportance, strongNameKey, skipXamlCompilation, debuggerLaunch:false); return Compile(engine, input, references, projectDirectory, output, verifyIl, defaultCompileBindings, logImportance, strongNameKey, skipXamlCompilation, debuggerLaunch:false);
} }
internal static CompileResult Compile(IBuildEngine engine, string input, string[] references, internal static CompileResult Compile(IBuildEngine engine, string input, string[] references,
string projectDirectory, string projectDirectory,
string output, bool verifyIl, MessageImportance logImportance, string strongNameKey, bool skipXamlCompilation, bool debuggerLaunch) string output, bool verifyIl, bool defaultCompileBindings, MessageImportance logImportance, string strongNameKey, bool skipXamlCompilation, bool debuggerLaunch)
{ {
var typeSystem = new CecilTypeSystem( try
references.Where(r => !r.ToLowerInvariant().EndsWith("avalonia.build.tasks.dll")),
input);
var asm = typeSystem.TargetAssemblyDefinition;
if (!skipXamlCompilation)
{ {
var compileRes = CompileCore(engine, typeSystem, projectDirectory, verifyIl, logImportance, debuggerLaunch); var typeSystem = new CecilTypeSystem(
if (compileRes == null) references.Where(r => !r.ToLowerInvariant().EndsWith("avalonia.build.tasks.dll")),
return new CompileResult(true); input);
if (compileRes == false)
return new CompileResult(false);
}
var writerParameters = new WriterParameters { WriteSymbols = asm.MainModule.HasSymbols }; var asm = typeSystem.TargetAssemblyDefinition;
if (!string.IsNullOrWhiteSpace(strongNameKey))
writerParameters.StrongNameKeyBlob = File.ReadAllBytes(strongNameKey); if (!skipXamlCompilation)
{
var compileRes = CompileCore(engine, typeSystem, projectDirectory, verifyIl, defaultCompileBindings,
logImportance, debuggerLaunch);
if (compileRes == null)
return new CompileResult(true);
if (compileRes == false)
return new CompileResult(false);
}
asm.Write(output, writerParameters); var writerParameters = new WriterParameters { WriteSymbols = asm.MainModule.HasSymbols };
if (!string.IsNullOrWhiteSpace(strongNameKey))
writerParameters.StrongNameKeyBlob = File.ReadAllBytes(strongNameKey);
return new CompileResult(true, true); asm.Write(output, writerParameters);
return new CompileResult(true, true);
}
catch (Exception ex)
{
engine.LogError(BuildEngineErrorCode.Unknown, "", ex.Message);
return new CompileResult(false);
}
} }
static bool? CompileCore(IBuildEngine engine, CecilTypeSystem typeSystem, static bool? CompileCore(IBuildEngine engine, CecilTypeSystem typeSystem,
string projectDirectory, bool verifyIl, string projectDirectory, bool verifyIl,
bool defaultCompileBindings,
MessageImportance logImportance MessageImportance logImportance
, bool debuggerLaunch = false) , bool debuggerLaunch = false)
{ {
@ -113,7 +122,16 @@ namespace Avalonia.Build.Tasks
if (avares.Resources.Count(CheckXamlName) == 0) if (avares.Resources.Count(CheckXamlName) == 0)
// Nothing to do // Nothing to do
return null; return null;
if (typeSystem.FindType("System.Reflection.AssemblyMetadataAttribute") is {} asmMetadata)
{
var ctor = asm.MainModule.ImportReference(typeSystem.GetTypeReference(asmMetadata).Resolve()
.GetConstructors().First(c => c.Parameters.Count == 2).Resolve());
var strType = asm.MainModule.ImportReference(typeof(string));
var arg1 = new CustomAttributeArgument(strType, "AvaloniaUseCompiledBindingsByDefault");
var arg2 = new CustomAttributeArgument(strType, defaultCompileBindings.ToString());
asm.CustomAttributes.Add(new CustomAttribute(ctor) { ConstructorArguments = { arg1, arg2 } });
}
var clrPropertiesDef = new TypeDefinition("CompiledAvaloniaXaml", "XamlIlHelpers", var clrPropertiesDef = new TypeDefinition("CompiledAvaloniaXaml", "XamlIlHelpers",
TypeAttributes.Class, asm.MainModule.TypeSystem.Object); TypeAttributes.Class, asm.MainModule.TypeSystem.Object);
asm.MainModule.Types.Add(clrPropertiesDef); asm.MainModule.Types.Add(clrPropertiesDef);
@ -143,7 +161,7 @@ namespace Avalonia.Build.Tasks
var contextClass = XamlILContextDefinition.GenerateContextClass(typeSystem.CreateTypeBuilder(contextDef), typeSystem, var contextClass = XamlILContextDefinition.GenerateContextClass(typeSystem.CreateTypeBuilder(contextDef), typeSystem,
xamlLanguage, emitConfig); xamlLanguage, emitConfig);
var compiler = new AvaloniaXamlIlCompiler(compilerConfig, emitConfig, contextClass) { EnableIlVerification = verifyIl }; var compiler = new AvaloniaXamlIlCompiler(compilerConfig, emitConfig, contextClass) { EnableIlVerification = verifyIl, DefaultCompileBindings = defaultCompileBindings };
var editorBrowsableAttribute = typeSystem var editorBrowsableAttribute = typeSystem
.GetTypeReference(typeSystem.FindType("System.ComponentModel.EditorBrowsableAttribute")) .GetTypeReference(typeSystem.FindType("System.ComponentModel.EditorBrowsableAttribute"))
@ -178,10 +196,11 @@ namespace Avalonia.Build.Tasks
var stringEquals = asm.MainModule.ImportReference(asm.MainModule.TypeSystem.String.Resolve().Methods.First( var stringEquals = asm.MainModule.ImportReference(asm.MainModule.TypeSystem.String.Resolve().Methods.First(
m => m =>
m.IsStatic && m.Name == "Equals" && m.Parameters.Count == 2 && m.IsStatic && m.Name == "Equals" && m.Parameters.Count == 3 &&
m.ReturnType.FullName == "System.Boolean" m.ReturnType.FullName == "System.Boolean"
&& m.Parameters[0].ParameterType.FullName == "System.String" && m.Parameters[0].ParameterType.FullName == "System.String"
&& m.Parameters[1].ParameterType.FullName == "System.String")); && m.Parameters[1].ParameterType.FullName == "System.String"
&& m.Parameters[2].ParameterType.FullName == "System.StringComparison"));
bool CompileGroup(IResourceGroup group) bool CompileGroup(IResourceGroup group)
{ {
@ -384,6 +403,7 @@ namespace Avalonia.Build.Tasks
var nop = Instruction.Create(OpCodes.Nop); var nop = Instruction.Create(OpCodes.Nop);
i.Add(Instruction.Create(OpCodes.Ldarg_0)); i.Add(Instruction.Create(OpCodes.Ldarg_0));
i.Add(Instruction.Create(OpCodes.Ldstr, res.Uri)); i.Add(Instruction.Create(OpCodes.Ldstr, res.Uri));
i.Add(Instruction.Create(OpCodes.Ldc_I4, (int)StringComparison.OrdinalIgnoreCase));
i.Add(Instruction.Create(OpCodes.Call, stringEquals)); i.Add(Instruction.Create(OpCodes.Call, stringEquals));
i.Add(Instruction.Create(OpCodes.Brfalse, nop)); i.Add(Instruction.Create(OpCodes.Brfalse, nop));
if (parameterlessConstructor != null) if (parameterlessConstructor != null)

5
src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorPicker.xaml

@ -1,10 +1,7 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Avalonia.Controls" xmlns:controls="using:Avalonia.Controls"
xmlns:converters="using:Avalonia.Controls.Converters" xmlns:primitives="using:Avalonia.Controls.Primitives">
xmlns:primitives="using:Avalonia.Controls.Primitives"
xmlns:pc="clr-namespace:Avalonia.Controls.Primitives.Converters;assembly=Avalonia.Controls.ColorPicker"
x:CompileBindings="True">
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="avares://Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml" /> <ResourceInclude Source="avares://Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml" />

3
src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorPreviewer.xaml

@ -1,7 +1,6 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pc="using:Avalonia.Controls.Primitives.Converters" xmlns:pc="using:Avalonia.Controls.Primitives.Converters">
x:CompileBindings="True">
<pc:AccentColorConverter x:Key="AccentColorConverter" /> <pc:AccentColorConverter x:Key="AccentColorConverter" />
<x:Double x:Key="ColorPreviewerAccentSectionWidth">80</x:Double> <x:Double x:Key="ColorPreviewerAccentSectionWidth">80</x:Double>

3
src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorSlider.xaml

@ -1,6 +1,5 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
x:CompileBindings="True">
<ControlTheme x:Key="ColorSliderThumbTheme" <ControlTheme x:Key="ColorSliderThumbTheme"
TargetType="Thumb"> TargetType="Thumb">

3
src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorSpectrum.xaml

@ -1,7 +1,6 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Avalonia.Controls" xmlns:controls="using:Avalonia.Controls">
x:CompileBindings="True">
<ControlTheme x:Key="{x:Type ColorSpectrum}" <ControlTheme x:Key="{x:Type ColorSpectrum}"
TargetType="ColorSpectrum"> TargetType="ColorSpectrum">

5
src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml

@ -3,9 +3,8 @@
xmlns:controls="using:Avalonia.Controls" xmlns:controls="using:Avalonia.Controls"
xmlns:converters="using:Avalonia.Controls.Converters" xmlns:converters="using:Avalonia.Controls.Converters"
xmlns:primitives="using:Avalonia.Controls.Primitives" xmlns:primitives="using:Avalonia.Controls.Primitives"
xmlns:pc="clr-namespace:Avalonia.Controls.Primitives.Converters;assembly=Avalonia.Controls.ColorPicker" xmlns:pc="using:Avalonia.Controls.Primitives.Converters"
xmlns:globalization="clr-namespace:System.Globalization;assembly=mscorlib" xmlns:globalization="using:System.Globalization">
x:CompileBindings="True">
<pc:ContrastBrushConverter x:Key="ContrastBrushConverter" /> <pc:ContrastBrushConverter x:Key="ContrastBrushConverter" />
<converters:ColorToDisplayNameConverter x:Key="ColorToDisplayNameConverter" /> <converters:ColorToDisplayNameConverter x:Key="ColorToDisplayNameConverter" />

3
src/Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml

@ -1,7 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="using:Avalonia.Controls.Converters" xmlns:converters="using:Avalonia.Controls.Converters">
x:CompileBindings="True">
<Styles.Resources> <Styles.Resources>
<ResourceDictionary> <ResourceDictionary>

5
src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorPicker.xaml

@ -1,10 +1,7 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Avalonia.Controls" xmlns:controls="using:Avalonia.Controls"
xmlns:converters="using:Avalonia.Controls.Converters" xmlns:primitives="using:Avalonia.Controls.Primitives">
xmlns:primitives="using:Avalonia.Controls.Primitives"
xmlns:pc="clr-namespace:Avalonia.Controls.Primitives.Converters;assembly=Avalonia.Controls.ColorPicker"
x:CompileBindings="True">
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="avares://Avalonia.Controls.ColorPicker/Themes/Simple/ColorView.xaml" /> <ResourceInclude Source="avares://Avalonia.Controls.ColorPicker/Themes/Simple/ColorView.xaml" />

3
src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorPreviewer.xaml

@ -1,7 +1,6 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pc="using:Avalonia.Controls.Primitives.Converters" xmlns:pc="using:Avalonia.Controls.Primitives.Converters">
x:CompileBindings="True">
<pc:AccentColorConverter x:Key="AccentColorConverter" /> <pc:AccentColorConverter x:Key="AccentColorConverter" />
<x:Double x:Key="ColorPreviewerAccentSectionWidth">80</x:Double> <x:Double x:Key="ColorPreviewerAccentSectionWidth">80</x:Double>

3
src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorSlider.xaml

@ -1,6 +1,5 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
x:CompileBindings="True">
<ControlTheme x:Key="ColorSliderThumbTheme" <ControlTheme x:Key="ColorSliderThumbTheme"
TargetType="Thumb"> TargetType="Thumb">

3
src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorSpectrum.xaml

@ -1,7 +1,6 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Avalonia.Controls" xmlns:controls="using:Avalonia.Controls">
x:CompileBindings="True">
<ControlTheme x:Key="{x:Type ColorSpectrum}" <ControlTheme x:Key="{x:Type ColorSpectrum}"
TargetType="ColorSpectrum"> TargetType="ColorSpectrum">

5
src/Avalonia.Controls.ColorPicker/Themes/Simple/ColorView.xaml

@ -3,9 +3,8 @@
xmlns:controls="using:Avalonia.Controls" xmlns:controls="using:Avalonia.Controls"
xmlns:converters="using:Avalonia.Controls.Converters" xmlns:converters="using:Avalonia.Controls.Converters"
xmlns:primitives="using:Avalonia.Controls.Primitives" xmlns:primitives="using:Avalonia.Controls.Primitives"
xmlns:pc="clr-namespace:Avalonia.Controls.Primitives.Converters;assembly=Avalonia.Controls.ColorPicker" xmlns:pc="using:Avalonia.Controls.Primitives.Converters"
xmlns:globalization="clr-namespace:System.Globalization;assembly=mscorlib" xmlns:globalization="using:System.Globalization">
x:CompileBindings="True">
<pc:ContrastBrushConverter x:Key="ContrastBrushConverter" /> <pc:ContrastBrushConverter x:Key="ContrastBrushConverter" />
<converters:ColorToDisplayNameConverter x:Key="ColorToDisplayNameConverter" /> <converters:ColorToDisplayNameConverter x:Key="ColorToDisplayNameConverter" />

3
src/Avalonia.Controls.ColorPicker/Themes/Simple/Simple.xaml

@ -1,7 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="using:Avalonia.Controls.Converters" xmlns:converters="using:Avalonia.Controls.Converters">
x:CompileBindings="True">
<Styles.Resources> <Styles.Resources>
<ResourceDictionary> <ResourceDictionary>

6
src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml

@ -1,5 +1,5 @@
<Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" <Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="True"> xmlns:collections="using:Avalonia.Collections">
<Styles.Resources> <Styles.Resources>
<x:Double x:Key="ListAccentLowOpacity">0.6</x:Double> <x:Double x:Key="ListAccentLowOpacity">0.6</x:Double>
<x:Double x:Key="ListAccentMediumOpacity">0.8</x:Double> <x:Double x:Key="ListAccentMediumOpacity">0.8</x:Double>
@ -402,7 +402,7 @@
<Setter Property="FontSize" Value="15" /> <Setter Property="FontSize" Value="15" />
<Setter Property="MinHeight" Value="32" /> <Setter Property="MinHeight" Value="32" />
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate x:DataType="collections:DataGridCollectionViewGroup">
<DataGridFrozenGrid Name="PART_Root" <DataGridFrozenGrid Name="PART_Root"
Background="{TemplateBinding Background}" Background="{TemplateBinding Background}"
MinHeight="{TemplateBinding MinHeight}" MinHeight="{TemplateBinding MinHeight}"
@ -433,7 +433,7 @@
IsVisible="{TemplateBinding IsPropertyNameVisible}" IsVisible="{TemplateBinding IsPropertyNameVisible}"
Foreground="{TemplateBinding Foreground}" /> Foreground="{TemplateBinding Foreground}" />
<TextBlock Margin="4,0,0,0" <TextBlock Margin="4,0,0,0"
Text="{ReflectionBinding Key}" Text="{Binding Key}"
Foreground="{TemplateBinding Foreground}" /> Foreground="{TemplateBinding Foreground}" />
<TextBlock Name="PART_ItemCountElement" <TextBlock Name="PART_ItemCountElement"
Margin="4,0,0,0" Margin="4,0,0,0"

5
src/Avalonia.Controls.DataGrid/Themes/Simple.xaml

@ -1,5 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:collections="using:Avalonia.Collections">
<Styles.Resources> <Styles.Resources>
<Thickness x:Key="DataGridTextColumnCellTextBlockMargin">4</Thickness> <Thickness x:Key="DataGridTextColumnCellTextBlockMargin">4</Thickness>
<ControlTheme x:Key="DataGridCellTextBlockTheme" <ControlTheme x:Key="DataGridCellTextBlockTheme"
@ -253,7 +254,7 @@
<Setter Property="Background" Value="{DynamicResource ThemeControlMidHighBrush}" /> <Setter Property="Background" Value="{DynamicResource ThemeControlMidHighBrush}" />
<Setter Property="Height" Value="20" /> <Setter Property="Height" Value="20" />
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate x:DataType="collections:DataGridCollectionViewGroup">
<DataGridFrozenGrid Name="Root" <DataGridFrozenGrid Name="Root"
ColumnDefinitions="Auto,Auto,Auto,Auto" ColumnDefinitions="Auto,Auto,Auto,Auto"
RowDefinitions="Auto,*,Auto"> RowDefinitions="Auto,*,Auto">

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

Loading…
Cancel
Save