port over the newest controlcatalog
|
@ -1,10 +1,10 @@
|
|||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# No DotSettings Please
|
||||
*.DotSettings
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
|
@ -13,6 +13,9 @@
|
|||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
|
@ -20,39 +23,65 @@
|
|||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
build/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# DNX
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# Tye
|
||||
.tye/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
|
@ -62,6 +91,7 @@ artifacts/
|
|||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
|
@ -77,14 +107,21 @@ _Chutzpah*
|
|||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
@ -97,18 +134,29 @@ _ReSharper*/
|
|||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
|
@ -136,47 +184,72 @@ publish/
|
|||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
## TODO: Comment the next line if you want to checkin your
|
||||
## web deploy settings but do note that will include unencrypted
|
||||
## passwords
|
||||
#*.pubxml
|
||||
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Windows Azure Build Output
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
node_modules/
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
|
@ -187,21 +260,32 @@ _UpgradeReport_Files/
|
|||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
@ -209,9 +293,162 @@ FakesAssemblies/
|
|||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# LightSwitch generated files
|
||||
GeneratedArtifacts/
|
||||
_Pvt_Extensions/
|
||||
ModelManifest.xml
|
||||
.as
|
||||
.idea
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
##
|
||||
## Visual studio for Mac
|
||||
##
|
||||
|
||||
|
||||
# globs
|
||||
Makefile.in
|
||||
*.userprefs
|
||||
*.usertasks
|
||||
config.make
|
||||
config.status
|
||||
aclocal.m4
|
||||
install-sh
|
||||
autom4te.cache/
|
||||
*.tar.gz
|
||||
tarballs/
|
||||
test-results/
|
||||
|
||||
# Mac bundle stuff
|
||||
*.dmg
|
||||
*.app
|
||||
|
||||
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
##
|
||||
## Visual Studio Code
|
||||
##
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia.LinuxFramebuffer" Version="0.9.0" />
|
||||
<ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="0.9.0" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,83 +0,0 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Avalonia;
|
||||
using Avalonia.ReactiveUI;
|
||||
using Avalonia.Dialogs;
|
||||
|
||||
namespace ControlCatalog.NetCore
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
[STAThread]
|
||||
static int Main(string[] args)
|
||||
{
|
||||
if (args.Contains("--wait-for-attach"))
|
||||
{
|
||||
Console.WriteLine("Attach debugger and use 'Set next statement'");
|
||||
while (true)
|
||||
{
|
||||
Thread.Sleep(100);
|
||||
if (Debugger.IsAttached)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var builder = BuildAvaloniaApp();
|
||||
|
||||
double GetScaling()
|
||||
{
|
||||
var idx = Array.IndexOf(args, "--scaling");
|
||||
if (idx != 0 && args.Length > idx + 1 &&
|
||||
double.TryParse(args[idx + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out var scaling))
|
||||
return scaling;
|
||||
return 1;
|
||||
}
|
||||
if (args.Contains("--fbdev"))
|
||||
{
|
||||
SilenceConsole();
|
||||
return builder.StartLinuxFbDev(args, scaling: GetScaling());
|
||||
}
|
||||
else if (args.Contains("--drm"))
|
||||
{
|
||||
SilenceConsole();
|
||||
return builder.StartLinuxDrm(args, scaling: GetScaling());
|
||||
}
|
||||
else
|
||||
return builder.StartWithClassicDesktopLifetime(args);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This method is needed for IDE previewer infrastructure
|
||||
/// </summary>
|
||||
public static AppBuilder BuildAvaloniaApp()
|
||||
=> AppBuilder.Configure<App>()
|
||||
.UsePlatformDetect()
|
||||
.With(new X11PlatformOptions
|
||||
{
|
||||
EnableMultiTouch = true,
|
||||
UseDBusMenu = true
|
||||
})
|
||||
.With(new Win32PlatformOptions
|
||||
{
|
||||
EnableMultitouch = true,
|
||||
AllowEglInitialization = true
|
||||
})
|
||||
.UseSkia()
|
||||
.UseReactiveUI()
|
||||
.UseManagedSystemDialogs();
|
||||
|
||||
static void SilenceConsole()
|
||||
{
|
||||
new Thread(() =>
|
||||
{
|
||||
Console.CursorVisible = false;
|
||||
while (true)
|
||||
Console.ReadKey(true);
|
||||
})
|
||||
{ IsBackground = true }.Start();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia.LinuxFramebuffer" Version="0.9.0" />
|
||||
<ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="0.9.0" />
|
||||
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0-preview.2" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,40 +0,0 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Avalonia;
|
||||
using Avalonia.ReactiveUI;
|
||||
using Avalonia.Dialogs;
|
||||
|
||||
namespace ControlCatalog.NetCore
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
[STAThread]
|
||||
static int Main(string[] args)
|
||||
{
|
||||
return BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This method is needed for IDE previewer infrastructure
|
||||
/// </summary>
|
||||
public static AppBuilder BuildAvaloniaApp()
|
||||
=> AppBuilder.Configure<App>()
|
||||
.UsePlatformDetect()
|
||||
.With(new X11PlatformOptions
|
||||
{
|
||||
EnableMultiTouch = true,
|
||||
UseDBusMenu = true
|
||||
})
|
||||
.With(new Win32PlatformOptions
|
||||
{
|
||||
EnableMultitouch = true,
|
||||
AllowEglInitialization = true
|
||||
})
|
||||
.UseSkia()
|
||||
.UseReactiveUI()
|
||||
.UseManagedSystemDialogs();
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
<Application xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.App">
|
||||
<Application.Styles>
|
||||
<StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/>
|
||||
<StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/>
|
||||
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Default.xaml"/>
|
||||
<Style Selector="TextBlock.h1">
|
||||
<Setter Property="FontSize" Value="{DynamicResource FontSizeLarge}"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
</Style>
|
||||
<Style Selector="TextBlock.h2">
|
||||
<Setter Property="FontSize" Value="{DynamicResource FontSizeNormal}"/>
|
||||
</Style>
|
||||
<Style Selector="TextBlock.h3">
|
||||
<Setter Property="FontSize" Value="{DynamicResource FontSizeSmall}"/>
|
||||
</Style>
|
||||
<StyleInclude Source="/SideBar.xaml"/>
|
||||
</Application.Styles>
|
||||
</Application>
|
|
@ -1,24 +0,0 @@
|
|||
using Avalonia;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Markup.Xaml;
|
||||
|
||||
namespace ControlCatalog
|
||||
{
|
||||
public class App : Application
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
public override void OnFrameworkInitializationCompleted()
|
||||
{
|
||||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
|
||||
desktopLifetime.MainWindow = new MainWindow();
|
||||
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime)
|
||||
singleViewLifetime.MainView = new MainView();
|
||||
|
||||
base.OnFrameworkInitializationCompleted();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Update="**\*.xaml.cs">
|
||||
<DependentUpon>%(Filename)</DependentUpon>
|
||||
</Compile>
|
||||
<AvaloniaResource Include="**\*.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</AvaloniaResource>
|
||||
<AvaloniaResource Include="Assets\*" />
|
||||
<AvaloniaResource Include="Assets\Fonts\*" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-Bold.ttf" />
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-BoldItalic.ttf" />
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-Italic.ttf" />
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-Regular.ttf" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia" Version="0.9.0" />
|
||||
<PackageReference Include="Avalonia.ReactiveUI" Version="0.9.0" />
|
||||
<PackageReference Include="Avalonia.Controls.DataGrid" Version="0.9.0" />
|
||||
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,64 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:pages="clr-namespace:ControlCatalog.Pages"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.MainView"
|
||||
Background="{DynamicResource ThemeBackgroundBrush}"
|
||||
Foreground="{DynamicResource ThemeForegroundBrush}"
|
||||
FontSize="{DynamicResource FontSizeNormal}">
|
||||
<Grid>
|
||||
<Grid.Styles>
|
||||
<Style Selector="TextBlock.h2">
|
||||
<Setter Property="TextWrapping" Value="Wrap"/>
|
||||
<Setter Property="MaxWidth" Value="400"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||
</Style>
|
||||
</Grid.Styles>
|
||||
<TabControl Classes="sidebar" Name="Sidebar">
|
||||
<TabItem Header="AutoCompleteBox"><pages:AutoCompleteBoxPage/></TabItem>
|
||||
<TabItem Header="Border"><pages:BorderPage/></TabItem>
|
||||
<TabItem Header="Button"><pages:ButtonPage/></TabItem>
|
||||
<TabItem Header="ButtonSpinner"><pages:ButtonSpinnerPage/></TabItem>
|
||||
<TabItem Header="Calendar"><pages:CalendarPage/></TabItem>
|
||||
<TabItem Header="Canvas"><pages:CanvasPage/></TabItem>
|
||||
<TabItem Header="Carousel"><pages:CarouselPage/></TabItem>
|
||||
<TabItem Header="CheckBox"><pages:CheckBoxPage/></TabItem>
|
||||
<TabItem Header="ComboBox"><pages:ComboBoxPage/></TabItem>
|
||||
<TabItem Header="ContextMenu"><pages:ContextMenuPage/></TabItem>
|
||||
<TabItem Header="DataGrid"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Disabled"
|
||||
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
|
||||
<pages:DataGridPage/>
|
||||
</TabItem>
|
||||
<TabItem Header="DatePicker"><pages:DatePickerPage/></TabItem>
|
||||
<TabItem Header="Drag+Drop"><pages:DragAndDropPage/></TabItem>
|
||||
<TabItem Header="Expander"><pages:ExpanderPage/></TabItem>
|
||||
<TabItem Header="Image"><pages:ImagePage/></TabItem>
|
||||
<TabItem Header="ItemsRepeater"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Disabled"
|
||||
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
|
||||
<pages:ItemsRepeaterPage/>
|
||||
</TabItem>
|
||||
<TabItem Header="LayoutTransformControl"><pages:LayoutTransformControlPage/></TabItem>
|
||||
<TabItem Header="ListBox"><pages:ListBoxPage/></TabItem>
|
||||
<TabItem Header="Menu"><pages:MenuPage/></TabItem>
|
||||
<TabItem Header="Notifications"><pages:NotificationsPage/></TabItem>
|
||||
<TabItem Header="NumericUpDown"><pages:NumericUpDownPage/></TabItem>
|
||||
<TabItem Header="Pointers (Touch)"><pages:PointersPage/></TabItem>
|
||||
<TabItem Header="ProgressBar"><pages:ProgressBarPage/></TabItem>
|
||||
<TabItem Header="RadioButton"><pages:RadioButtonPage/></TabItem>
|
||||
<TabItem Header="Slider"><pages:SliderPage/></TabItem>
|
||||
<TabItem Header="TabControl"><pages:TabControlPage/></TabItem>
|
||||
<TabItem Header="TabStrip"><pages:TabStripPage/></TabItem>
|
||||
<TabItem Header="TextBox"><pages:TextBoxPage/></TabItem>
|
||||
<TabItem Header="ToolTip"><pages:ToolTipPage/></TabItem>
|
||||
<TabItem Header="TreeView"><pages:TreeViewPage/></TabItem>
|
||||
<TabItem Header="Viewbox"><pages:ViewboxPage/></TabItem>
|
||||
<TabControl.Tag>
|
||||
<ComboBox x:Name="Themes" SelectedIndex="0" Width="100" Margin="8" HorizontalAlignment="Right" VerticalAlignment="Bottom">
|
||||
<ComboBoxItem>Light</ComboBoxItem>
|
||||
<ComboBoxItem>Dark</ComboBoxItem>
|
||||
</ComboBox>
|
||||
</TabControl.Tag>
|
||||
</TabControl>
|
||||
</Grid>
|
||||
</UserControl>
|
|
@ -1,61 +0,0 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Markup.Xaml.MarkupExtensions;
|
||||
using Avalonia.Markup.Xaml.Styling;
|
||||
using Avalonia.Markup.Xaml.XamlIl;
|
||||
using Avalonia.Platform;
|
||||
using ControlCatalog.Pages;
|
||||
|
||||
namespace ControlCatalog
|
||||
{
|
||||
public class MainView : UserControl
|
||||
{
|
||||
public MainView()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
if (AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetRuntimeInfo().IsDesktop)
|
||||
{
|
||||
IList tabItems = ((IList)this.FindControl<TabControl>("Sidebar").Items);
|
||||
tabItems.Add(new TabItem()
|
||||
{
|
||||
Header = "Dialogs",
|
||||
Content = new DialogsPage()
|
||||
});
|
||||
tabItems.Add(new TabItem()
|
||||
{
|
||||
Header = "Screens",
|
||||
Content = new ScreenPage()
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
var light = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
|
||||
{
|
||||
Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default")
|
||||
};
|
||||
var dark = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
|
||||
{
|
||||
Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseDark.xaml?assembly=Avalonia.Themes.Default")
|
||||
};
|
||||
|
||||
|
||||
var themes = this.Find<ComboBox>("Themes");
|
||||
themes.SelectionChanged += (sender, e) =>
|
||||
{
|
||||
switch (themes.SelectedIndex)
|
||||
{
|
||||
case 0:
|
||||
Styles[0] = light;
|
||||
break;
|
||||
case 1:
|
||||
Styles[0] = dark;
|
||||
break;
|
||||
}
|
||||
};
|
||||
Styles.Add(light);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
<Window xmlns="https://github.com/avaloniaui" MinWidth="500" MinHeight="300"
|
||||
Width="1024" Height="800"
|
||||
xmlns:pages="clr-namespace:ControlCatalog.Pages"
|
||||
Title="Avalonia Control Gallery"
|
||||
Icon="/Assets/test_icon.ico"
|
||||
xmlns:local="clr-namespace:ControlCatalog"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:vm="clr-namespace:ControlCatalog.ViewModels"
|
||||
xmlns:v="clr-namespace:ControlCatalog.Views"
|
||||
x:Class="ControlCatalog.MainWindow">
|
||||
|
||||
<NativeMenu.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="File">
|
||||
<NativeMenuItem.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Open" Clicked="OnOpenClicked"/>
|
||||
<NativeMenuItemSeperator/>
|
||||
<NativeMenuItem Header="Recent">
|
||||
<NativeMenuItem.Menu>
|
||||
<NativeMenu/>
|
||||
</NativeMenuItem.Menu>
|
||||
</NativeMenuItem>
|
||||
<NativeMenuItemSeperator/>
|
||||
<NativeMenuItem Header="Quit Avalonia" Clicked="OnCloseClicked" Gesture="CMD+Q"/>
|
||||
</NativeMenu>
|
||||
</NativeMenuItem.Menu>
|
||||
</NativeMenuItem>
|
||||
<NativeMenuItem Header="Edit">
|
||||
<NativeMenuItem.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Copy"/>
|
||||
<NativeMenuItem Header="Paste"/>
|
||||
</NativeMenu>
|
||||
</NativeMenuItem.Menu>
|
||||
</NativeMenuItem>
|
||||
</NativeMenu>
|
||||
</NativeMenu.Menu>
|
||||
|
||||
<Window.DataTemplates>
|
||||
<DataTemplate DataType="vm:NotificationViewModel">
|
||||
<v:CustomNotificationView />
|
||||
</DataTemplate>
|
||||
</Window.DataTemplates>
|
||||
<DockPanel LastChildFill="True">
|
||||
<Menu Name="MainMenu" DockPanel.Dock="Top">
|
||||
<MenuItem Header="File">
|
||||
<MenuItem Header="Exit" Command="{Binding ExitCommand}" />
|
||||
</MenuItem>
|
||||
<MenuItem Header="Help">
|
||||
<MenuItem Header="About" Command="{Binding AboutCommand}" />
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
<local:MainView />
|
||||
</DockPanel>
|
||||
</Window>
|
|
@ -1,66 +0,0 @@
|
|||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.Notifications;
|
||||
using Avalonia.Controls.Primitives;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Threading;
|
||||
using ControlCatalog.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ControlCatalog
|
||||
{
|
||||
public class MainWindow : Window
|
||||
{
|
||||
private WindowNotificationManager _notificationArea;
|
||||
private NativeMenu _recentMenu;
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
this.AttachDevTools();
|
||||
//Renderer.DrawFps = true;
|
||||
//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;
|
||||
var mainMenu = this.FindControl<Menu>("MainMenu");
|
||||
mainMenu.AttachedToVisualTree += MenuAttached;
|
||||
}
|
||||
|
||||
public void MenuAttached(object sender, VisualTreeAttachmentEventArgs e)
|
||||
{
|
||||
if (NativeMenu.GetIsNativeMenuExported(this) && sender is Menu mainMenu)
|
||||
{
|
||||
mainMenu.IsVisible = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnOpenClicked(object sender, EventArgs args)
|
||||
{
|
||||
_recentMenu.Items.Insert(0, new NativeMenuItem("Item " + (_recentMenu.Items.Count + 1)));
|
||||
}
|
||||
|
||||
public void OnCloseClicked(object sender, EventArgs args)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
// TODO: iOS does not support dynamically loading assemblies
|
||||
// so we must refer to this resource DLL statically. For
|
||||
// now I am doing that here. But we need a better solution!!
|
||||
var theme = new Avalonia.Themes.Default.DefaultTheme();
|
||||
theme.TryGetResource("Button", out _);
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.AutoCompleteBoxPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">AutoCompleteBox</TextBlock>
|
||||
<TextBlock Classes="h2">A control into which the user can input text</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="8">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock Text="MinimumPrefixLength: 1"/>
|
||||
<AutoCompleteBox Width="200"
|
||||
Margin="0,0,0,8"
|
||||
MinimumPrefixLength="1"/>
|
||||
<TextBlock Text="MinimumPrefixLength: 3"/>
|
||||
<AutoCompleteBox Width="200"
|
||||
Margin="0,0,0,8"
|
||||
MinimumPrefixLength="3"/>
|
||||
<TextBlock Text="MinimumPopulateDelay: 1 Second"/>
|
||||
<AutoCompleteBox Width="200"
|
||||
Margin="0,0,0,8"
|
||||
MinimumPopulateDelay="1"/>
|
||||
<TextBlock Text="MaxDropDownHeight: 60"/>
|
||||
<AutoCompleteBox Width="200"
|
||||
Margin="0,0,0,8"
|
||||
MaxDropDownHeight="60"/>
|
||||
<AutoCompleteBox Width="200"
|
||||
Margin="0,0,0,8"
|
||||
Watermark="Watermark"/>
|
||||
<TextBlock Text="Disabled"/>
|
||||
<AutoCompleteBox Width="200"
|
||||
IsEnabled="False"/>
|
||||
</StackPanel>
|
||||
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
|
||||
<TextBlock Text="ValueMemberBinding"/>
|
||||
<AutoCompleteBox Width="200"
|
||||
Margin="0,0,0,8"
|
||||
ValueMemberBinding="{Binding Capital}"/>
|
||||
<TextBlock Text="Multi-Binding"/>
|
||||
<AutoCompleteBox Name="MultiBindingBox"
|
||||
Width="200"
|
||||
Margin="0,0,0,8"
|
||||
FilterMode="Contains"/>
|
||||
<TextBlock Text="Async Populate"/>
|
||||
<AutoCompleteBox Name="AsyncBox"
|
||||
Width="200"
|
||||
Margin="0,0,0,8"
|
||||
FilterMode="None"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,37 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ButtonPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Button</TextBlock>
|
||||
<TextBlock Classes="h2">A button control</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<StackPanel Orientation="Vertical" Spacing="8" Width="150">
|
||||
<Button>Button</Button>
|
||||
<Button Foreground="White">Foreground</Button>
|
||||
<Button Background="{DynamicResource ThemeAccentBrush}">Background</Button>
|
||||
<Button IsEnabled="False">Disabled</Button>
|
||||
<Button Content="Re-themed">
|
||||
<Button.Styles>
|
||||
<Style>
|
||||
<Style.Resources>
|
||||
<SolidColorBrush x:Key="ThemeBorderMidBrush">Red</SolidColorBrush>
|
||||
<SolidColorBrush x:Key="ThemeControlHighBrush">DarkRed</SolidColorBrush>
|
||||
</Style.Resources>
|
||||
</Style>
|
||||
</Button.Styles>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical" Spacing="8" Width="150">
|
||||
<Button BorderThickness="0">No Border</Button>
|
||||
<Button BorderBrush="{DynamicResource ThemeAccentBrush}">Border Color</Button>
|
||||
<Button BorderBrush="{DynamicResource ThemeAccentBrush}" BorderThickness="4">Thick Border</Button>
|
||||
<Button BorderBrush="{DynamicResource ThemeAccentBrush}" BorderThickness="4" IsEnabled="False">Disabled</Button>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,9 +0,0 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class ButtonPage : UserControl
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.CalendarPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Calendar</TextBlock>
|
||||
<TextBlock Classes="h2">A calendar control for selecting dates</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock Text="SelectionMode: None"/>
|
||||
<Calendar SelectionMode="None"
|
||||
Margin="0,0,0,8"/>
|
||||
|
||||
<TextBlock Text="SelectionMode: SingleDate"/>
|
||||
<Calendar SelectionMode="SingleDate"
|
||||
Margin="0,0,0,8"/>
|
||||
|
||||
<TextBlock Text="Disabled"/>
|
||||
<Calendar IsEnabled="False"
|
||||
SelectionMode="SingleDate"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock Text="SelectionMode: SingleRange"/>
|
||||
<Calendar SelectionMode="SingleRange"
|
||||
Margin="0,0,0,8"/>
|
||||
|
||||
<TextBlock Text="SelectionMode: MultipleRange"/>
|
||||
<Calendar SelectionMode="MultipleRange"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock Text="DisplayDates"/>
|
||||
<Calendar Name="DisplayDatesCalendar"
|
||||
SelectionMode="SingleDate"
|
||||
Margin="0,0,0,8"/>
|
||||
|
||||
<TextBlock Text="BlackoutDates"/>
|
||||
<Calendar Name="BlackoutDatesCalendar"
|
||||
SelectionMode="SingleDate" />
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,51 +0,0 @@
|
|||
using System;
|
||||
using Avalonia.Animation;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class CarouselPage : UserControl
|
||||
{
|
||||
private Carousel _carousel;
|
||||
private Button _left;
|
||||
private Button _right;
|
||||
private ComboBox _transition;
|
||||
private ComboBox _orientation;
|
||||
|
||||
public CarouselPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
_left.Click += (s, e) => _carousel.Previous();
|
||||
_right.Click += (s, e) => _carousel.Next();
|
||||
_transition.SelectionChanged += TransitionChanged;
|
||||
_orientation.SelectionChanged += TransitionChanged;
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
_carousel = this.FindControl<Carousel>("carousel");
|
||||
_left = this.FindControl<Button>("left");
|
||||
_right = this.FindControl<Button>("right");
|
||||
_transition = this.FindControl<ComboBox>("transition");
|
||||
_orientation = this.FindControl<ComboBox>("orientation");
|
||||
}
|
||||
|
||||
private void TransitionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
switch (_transition.SelectedIndex)
|
||||
{
|
||||
case 0:
|
||||
_carousel.PageTransition = null;
|
||||
break;
|
||||
case 1:
|
||||
_carousel.PageTransition = new PageSlide(TimeSpan.FromSeconds(0.25), _orientation.SelectedIndex == 0 ? PageSlide.SlideAxis.Horizontal : PageSlide.SlideAxis.Vertical);
|
||||
break;
|
||||
case 2:
|
||||
_carousel.PageTransition = new CrossFade(TimeSpan.FromSeconds(0.25));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ComboBoxPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">ComboBox</TextBlock>
|
||||
<TextBlock Classes="h2">A drop-down list.</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0 16 0 0" Spacing="8">
|
||||
<ComboBox SelectedIndex="0">
|
||||
<ComboBoxItem>Inline Items</ComboBoxItem>
|
||||
<ComboBoxItem>Inline Item 2</ComboBoxItem>
|
||||
<ComboBoxItem>Inline Item 3</ComboBoxItem>
|
||||
<ComboBoxItem>Inline Item 4</ComboBoxItem>
|
||||
</ComboBox>
|
||||
|
||||
<ComboBox SelectedIndex="0">
|
||||
<ComboBoxItem>
|
||||
<Panel>
|
||||
<Rectangle Fill="{DynamicResource ThemeAccentBrush}"/>
|
||||
<TextBlock Margin="8">Control Items</TextBlock>
|
||||
</Panel>
|
||||
</ComboBoxItem>
|
||||
<ComboBoxItem>
|
||||
<Ellipse Width="50" Height="50" Fill="Yellow"/>
|
||||
</ComboBoxItem>
|
||||
<ComboBoxItem>
|
||||
<TextBox Text="TextBox"/>
|
||||
</ComboBoxItem>
|
||||
</ComboBox>
|
||||
|
||||
<ComboBox x:Name="fontComboBox" SelectedIndex="0">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Name}" FontFamily="{Binding}" />
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,21 +0,0 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class ComboBoxPage : UserControl
|
||||
{
|
||||
public ComboBoxPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
var fontComboBox = this.Find<ComboBox>("fontComboBox");
|
||||
fontComboBox.Items = Avalonia.Media.FontFamily.SystemFontFamilies;
|
||||
fontComboBox.SelectedIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ContextMenuPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Context Menu</TextBlock>
|
||||
<TextBlock Classes="h2">A right click menu that can be applied to any control.</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<Border Background="{DynamicResource ThemeAccentBrush}"
|
||||
Margin="16"
|
||||
Padding="48,48,48,48">
|
||||
<Border.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem Header="Standard _Menu Item"/>
|
||||
<Separator/>
|
||||
<MenuItem Header="Menu with _Submenu">
|
||||
<MenuItem Header="Submenu _1"/>
|
||||
<MenuItem Header="Submenu _2"/>
|
||||
</MenuItem>
|
||||
<MenuItem Header="Menu Item with _Icon">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="/Assets/github_icon.png"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
<MenuItem Header="Menu Item with _Checkbox">
|
||||
<MenuItem.Icon>
|
||||
<CheckBox BorderThickness="0" IsHitTestVisible="False" IsChecked="True"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
</ContextMenu>
|
||||
</Border.ContextMenu>
|
||||
<TextBlock Text="Defined in XAML"/>
|
||||
</Border>
|
||||
<Border Background="{DynamicResource ThemeAccentBrush}"
|
||||
Margin="16"
|
||||
Padding="48,48,48,48">
|
||||
<Border.ContextMenu>
|
||||
<ContextMenu Items="{Binding MenuItems}">
|
||||
<ContextMenu.Styles>
|
||||
<Style Selector="MenuItem">
|
||||
<Setter Property="Header" Value="{Binding Header}"/>
|
||||
<Setter Property="Items" Value="{Binding Items}"/>
|
||||
<Setter Property="Command" Value="{Binding Command}"/>
|
||||
<Setter Property="CommandParameter" Value="{Binding CommandParameter}"/>
|
||||
</Style>
|
||||
</ContextMenu.Styles>
|
||||
</ContextMenu>
|
||||
</Border.ContextMenu>
|
||||
<TextBlock Text="Dynamically Generated"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,33 +0,0 @@
|
|||
using System;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using ControlCatalog.ViewModels;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class ContextMenuPage : UserControl
|
||||
{
|
||||
public ContextMenuPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
DataContext = new ContextMenuPageViewModel();
|
||||
}
|
||||
|
||||
private ContextMenuPageViewModel _model;
|
||||
protected override void OnDataContextChanged(EventArgs e)
|
||||
{
|
||||
if (_model != null)
|
||||
_model.View = null;
|
||||
_model = DataContext as ContextMenuPageViewModel;
|
||||
if (_model != null)
|
||||
_model.View = this;
|
||||
|
||||
base.OnDataContextChanged(e);
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:local="clr-namespace:ControlCatalog.Models;assembly=ControlCatalog"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.DataGridPage">
|
||||
<UserControl.Resources>
|
||||
<local:GDPValueConverter x:Key="GDPConverter" />
|
||||
</UserControl.Resources>
|
||||
<UserControl.Styles>
|
||||
<Style Selector="DataGridCell.gdp">
|
||||
<Setter Property="FontWeight" Value="Bold" />
|
||||
<Setter Property="Background" Value="{Binding Path=GDP, Mode=OneWay, Converter={StaticResource GDPConverter}}" />
|
||||
</Style>
|
||||
</UserControl.Styles>
|
||||
<Grid RowDefinitions="Auto,*">
|
||||
<StackPanel Orientation="Vertical" Spacing="4" Grid.Row="0">
|
||||
<TextBlock Classes="h1">DataGrid</TextBlock>
|
||||
<TextBlock Classes="h2">A control for displaying and interacting with a data source.</TextBlock>
|
||||
</StackPanel>
|
||||
<TabControl Grid.Row="1">
|
||||
<TabItem Header="DataGrid">
|
||||
<DataGrid Name="dataGrid1" Margin="12" CanUserResizeColumns="True" CanUserReorderColumns="True">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Country" Binding="{Binding Name}" Width="6*" />
|
||||
<DataGridTextColumn Header="Region" Binding="{Binding Region}" Width="4*" />
|
||||
<DataGridTextColumn Header="Population" Binding="{Binding Population}" Width="3*" />
|
||||
<DataGridTextColumn Header="Area" Binding="{Binding Area}" Width="3*" />
|
||||
<DataGridTextColumn Header="GDP" Binding="{Binding GDP}" Width="3*" CellStyleClasses="gdp" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</TabItem>
|
||||
<TabItem Header="Grouping">
|
||||
<DataGrid Name="dataGridGrouping" Margin="12">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Country" Binding="{Binding Name}" Width="6*" />
|
||||
<DataGridTextColumn Header="Region" Binding="{Binding Region}" Width="4*" />
|
||||
<DataGridTextColumn Header="Population" Binding="{Binding Population}" Width="3*" />
|
||||
<DataGridTextColumn Header="Area" Binding="{Binding Area}" Width="3*" />
|
||||
<DataGridTextColumn Header="GDP" Binding="{Binding GDP}" Width="3*" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</TabItem>
|
||||
<TabItem Header="Editable">
|
||||
<Grid RowDefinitions="*,Auto">
|
||||
<DataGrid Name="dataGridEdit" Margin="12" Grid.Row="0">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" Width="2*" />
|
||||
<DataGridTextColumn Header="Last" Binding="{Binding LastName}" Width="*" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
<Button Grid.Row="1" Name="btnAdd" Margin="12,0,12,12" Content="Add" HorizontalAlignment="Right" />
|
||||
</Grid>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
</Grid>
|
||||
</UserControl>
|
|
@ -1,52 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using ControlCatalog.Models;
|
||||
using Avalonia.Collections;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class DataGridPage : UserControl
|
||||
{
|
||||
public DataGridPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
var dg1 = this.FindControl<DataGrid>("dataGrid1");
|
||||
dg1.IsReadOnly = true;
|
||||
|
||||
var collectionView1 = new DataGridCollectionView(Countries.All);
|
||||
//collectionView.GroupDescriptions.Add(new PathGroupDescription("Region"));
|
||||
|
||||
dg1.Items = collectionView1;
|
||||
|
||||
var dg2 = this.FindControl<DataGrid>("dataGridGrouping");
|
||||
dg2.IsReadOnly = true;
|
||||
|
||||
var collectionView2 = new DataGridCollectionView(Countries.All);
|
||||
collectionView2.GroupDescriptions.Add(new DataGridPathGroupDescription("Region"));
|
||||
|
||||
dg2.Items = collectionView2;
|
||||
|
||||
var dg3 = this.FindControl<DataGrid>("dataGridEdit");
|
||||
dg3.IsReadOnly = false;
|
||||
|
||||
var items = new List<Person>
|
||||
{
|
||||
new Person { FirstName = "John", LastName = "Doe" },
|
||||
new Person { FirstName = "Elizabeth", LastName = "Thomas" },
|
||||
new Person { FirstName = "Zack", LastName = "Ward" }
|
||||
};
|
||||
var collectionView3 = new DataGridCollectionView(items);
|
||||
|
||||
dg3.Items = collectionView3;
|
||||
|
||||
var addButton = this.FindControl<Button>("btnAdd");
|
||||
addButton.Click += (a, b) => collectionView3.AddNew();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.DialogsPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4" Margin="4">
|
||||
<CheckBox Name="UseFilters">Use filters</CheckBox>
|
||||
<Button Name="OpenFile">Open File</Button>
|
||||
<Button Name="SaveFile">Save File</Button>
|
||||
<Button Name="SelectFolder">Select Folder</Button>
|
||||
<Button Name="DecoratedWindow">Decorated window</Button>
|
||||
<Button Name="DecoratedWindowDialog">Decorated window (dialog)</Button>
|
||||
<Button Name="Dialog">Dialog</Button>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,81 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
#pragma warning disable 4014
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class DialogsPage : UserControl
|
||||
{
|
||||
public DialogsPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
|
||||
List<FileDialogFilter> GetFilters()
|
||||
{
|
||||
if (this.FindControl<CheckBox>("UseFilters").IsChecked != true)
|
||||
return null;
|
||||
return new List<FileDialogFilter>
|
||||
{
|
||||
new FileDialogFilter
|
||||
{
|
||||
Name = "Text files (.txt)", Extensions = new List<string> {"txt"}
|
||||
},
|
||||
new FileDialogFilter
|
||||
{
|
||||
Name = "All files",
|
||||
Extensions = new List<string> {"*"}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
this.FindControl<Button>("OpenFile").Click += delegate
|
||||
{
|
||||
new OpenFileDialog()
|
||||
{
|
||||
Title = "Open file",
|
||||
Filters = GetFilters()
|
||||
}.ShowAsync(GetWindow());
|
||||
};
|
||||
this.FindControl<Button>("SaveFile").Click += delegate
|
||||
{
|
||||
new SaveFileDialog()
|
||||
{
|
||||
Title = "Save file",
|
||||
Filters = GetFilters()
|
||||
}.ShowAsync(GetWindow());
|
||||
};
|
||||
this.FindControl<Button>("SelectFolder").Click += delegate
|
||||
{
|
||||
new OpenFolderDialog()
|
||||
{
|
||||
Title = "Select folder"
|
||||
}.ShowAsync(GetWindow());
|
||||
};
|
||||
this.FindControl<Button>("DecoratedWindow").Click += delegate
|
||||
{
|
||||
new DecoratedWindow().Show();
|
||||
};
|
||||
this.FindControl<Button>("DecoratedWindowDialog").Click += delegate
|
||||
{
|
||||
new DecoratedWindow().ShowDialog(GetWindow());
|
||||
};
|
||||
this.FindControl<Button>("Dialog").Click += delegate
|
||||
{
|
||||
var window = new Window();
|
||||
window.Height = 200;
|
||||
window.Width = 200;
|
||||
window.Content = new TextBlock { Text = "Hello world!" };
|
||||
window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
||||
window.ShowDialog(GetWindow());
|
||||
};
|
||||
}
|
||||
|
||||
Window GetWindow() => (Window)this.VisualRoot;
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.DragAndDropPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Drag+Drop</TextBlock>
|
||||
<TextBlock Classes="h2">Example of Drag+Drop capabilities</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<Border BorderBrush="{DynamicResource ThemeAccentBrush}" BorderThickness="2" Padding="16" Name="DragMe">
|
||||
<TextBlock Name="DragState">Drag Me</TextBlock>
|
||||
</Border>
|
||||
<Border Background="{DynamicResource ThemeAccentBrush2}" Padding="16"
|
||||
DragDrop.AllowDrop="True">
|
||||
<TextBlock Name="DropState">Drop some text or files here</TextBlock>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,71 +0,0 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class DragAndDropPage : UserControl
|
||||
{
|
||||
private TextBlock _DropState;
|
||||
private TextBlock _DragState;
|
||||
private Border _DragMe;
|
||||
private int DragCount = 0;
|
||||
|
||||
public DragAndDropPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
|
||||
_DragMe.PointerPressed += DoDrag;
|
||||
|
||||
AddHandler(DragDrop.DropEvent, Drop);
|
||||
AddHandler(DragDrop.DragOverEvent, DragOver);
|
||||
}
|
||||
|
||||
private async void DoDrag(object sender, Avalonia.Input.PointerPressedEventArgs e)
|
||||
{
|
||||
DataObject dragData = new DataObject();
|
||||
dragData.Set(DataFormats.Text, $"You have dragged text {++DragCount} times");
|
||||
|
||||
var result = await DragDrop.DoDragDrop(e, dragData, DragDropEffects.Copy);
|
||||
switch(result)
|
||||
{
|
||||
case DragDropEffects.Copy:
|
||||
_DragState.Text = "The text was copied"; break;
|
||||
case DragDropEffects.Link:
|
||||
_DragState.Text = "The text was linked"; break;
|
||||
case DragDropEffects.None:
|
||||
_DragState.Text = "The drag operation was canceled"; break;
|
||||
}
|
||||
}
|
||||
|
||||
private void DragOver(object sender, DragEventArgs e)
|
||||
{
|
||||
// Only allow Copy or Link as Drop Operations.
|
||||
e.DragEffects = e.DragEffects & (DragDropEffects.Copy | DragDropEffects.Link);
|
||||
|
||||
// Only allow if the dragged data contains text or filenames.
|
||||
if (!e.Data.Contains(DataFormats.Text) && !e.Data.Contains(DataFormats.FileNames))
|
||||
e.DragEffects = DragDropEffects.None;
|
||||
}
|
||||
|
||||
private void Drop(object sender, DragEventArgs e)
|
||||
{
|
||||
if (e.Data.Contains(DataFormats.Text))
|
||||
_DropState.Text = e.Data.GetText();
|
||||
else if (e.Data.Contains(DataFormats.FileNames))
|
||||
_DropState.Text = string.Join(Environment.NewLine, e.Data.GetFileNames());
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
|
||||
_DropState = this.Find<TextBlock>("DropState");
|
||||
_DragState = this.Find<TextBlock>("DragState");
|
||||
_DragMe = this.Find<Border>("DragMe");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ExpanderPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Expander</TextBlock>
|
||||
<TextBlock Classes="h2">Expands to show nested content</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Vertical"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<Expander Header="Expand Up" ExpandDirection="Up">
|
||||
<StackPanel>
|
||||
<TextBlock>Expanded content</TextBlock>
|
||||
</StackPanel>
|
||||
</Expander>
|
||||
<Expander Header="Expand Down" ExpandDirection="Down">
|
||||
<StackPanel>
|
||||
<TextBlock>Expanded content</TextBlock>
|
||||
</StackPanel>
|
||||
</Expander>
|
||||
<Expander Header="Expand Left" ExpandDirection="Left">
|
||||
<StackPanel>
|
||||
<TextBlock>Expanded content</TextBlock>
|
||||
</StackPanel>
|
||||
</Expander>
|
||||
<Expander Header="Expand Right" ExpandDirection="Right">
|
||||
<StackPanel>
|
||||
<TextBlock>Expanded content</TextBlock>
|
||||
</StackPanel>
|
||||
</Expander>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,45 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ImagePage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Image</TextBlock>
|
||||
<TextBlock Classes="h2">Displays an image</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock>No Stretch</TextBlock>
|
||||
<Image Source="/Assets/delicate-arch-896885_640.jpg"
|
||||
Width="100" Height="200"
|
||||
Stretch="None"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock>Fill</TextBlock>
|
||||
<Image Source="/Assets/delicate-arch-896885_640.jpg"
|
||||
Width="100" Height="200"
|
||||
Stretch="Fill"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock>Uniform</TextBlock>
|
||||
<Image Source="/Assets/delicate-arch-896885_640.jpg"
|
||||
Width="100" Height="200"
|
||||
Stretch="Uniform"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock>UniformToFill</TextBlock>
|
||||
<Image Source="/Assets/delicate-arch-896885_640.jpg"
|
||||
Width="100" Height="200"
|
||||
Stretch="UniformToFill"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock>Window Icon as an Image</TextBlock>
|
||||
<Image Name="Icon" Width="100" Height="200" Stretch="None" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,41 +0,0 @@
|
|||
using System.IO;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Media.Imaging;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class ImagePage : UserControl
|
||||
{
|
||||
private Image iconImage;
|
||||
public ImagePage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
iconImage = this.Get<Image>("Icon");
|
||||
}
|
||||
|
||||
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
|
||||
{
|
||||
base.OnAttachedToVisualTree(e);
|
||||
if (iconImage.Source == null)
|
||||
{
|
||||
var windowRoot = e.Root as Window;
|
||||
if (windowRoot != null)
|
||||
{
|
||||
using (var stream = new MemoryStream())
|
||||
{
|
||||
windowRoot.Icon.Save(stream);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
iconImage.Source = new Bitmap(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ItemsRepeaterPage">
|
||||
<DockPanel>
|
||||
<StackPanel DockPanel.Dock="Top" Spacing="4" Margin="0 0 0 16">
|
||||
<TextBlock Classes="h1">ItemsRepeater</TextBlock>
|
||||
<TextBlock Classes="h2">A data-driven collection control that incorporates a flexible layout system, custom views, and virtualization.</TextBlock>
|
||||
</StackPanel>
|
||||
<StackPanel DockPanel.Dock="Right" Margin="8 0" Spacing="4">
|
||||
<ComboBox SelectedIndex="0" SelectionChanged="LayoutChanged">
|
||||
<ComboBoxItem>Stack - Vertical</ComboBoxItem>
|
||||
<ComboBoxItem>Stack - Horizontal</ComboBoxItem>
|
||||
<ComboBoxItem>UniformGrid - Vertical</ComboBoxItem>
|
||||
<ComboBoxItem>UniformGrid - Horizontal</ComboBoxItem>
|
||||
</ComboBox>
|
||||
<Button Command="{Binding AddItem}">Add Item</Button>
|
||||
<Button Command="{Binding RandomizeHeights}">Randomize Heights</Button>
|
||||
<Button Command="{Binding ResetItems}">Reset items</Button>
|
||||
</StackPanel>
|
||||
<Border BorderThickness="1" BorderBrush="{DynamicResource ThemeBorderMidBrush}" Margin="0 0 0 16">
|
||||
<ScrollViewer Name="scroller"
|
||||
HorizontalScrollBarVisibility="Auto"
|
||||
VerticalScrollBarVisibility="Auto">
|
||||
<ItemsRepeater Name="repeater" Background="Transparent" Items="{Binding Items}">
|
||||
<ItemsRepeater.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Focusable="True" Height="{Binding Height}" Text="{Binding Text}"/>
|
||||
</DataTemplate>
|
||||
</ItemsRepeater.ItemTemplate>
|
||||
</ItemsRepeater>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</DockPanel>
|
||||
</UserControl>
|
|
@ -1,90 +0,0 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.Primitives;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Layout;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using ControlCatalog.ViewModels;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class ItemsRepeaterPage : UserControl
|
||||
{
|
||||
private ItemsRepeater _repeater;
|
||||
private ScrollViewer _scroller;
|
||||
|
||||
public ItemsRepeaterPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
_repeater = this.FindControl<ItemsRepeater>("repeater");
|
||||
_scroller = this.FindControl<ScrollViewer>("scroller");
|
||||
_repeater.PointerPressed += RepeaterClick;
|
||||
_repeater.KeyDown += RepeaterOnKeyDown;
|
||||
DataContext = new ItemsRepeaterPageViewModel();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
private void LayoutChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (_repeater == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var comboBox = (ComboBox)sender;
|
||||
|
||||
switch (comboBox.SelectedIndex)
|
||||
{
|
||||
case 0:
|
||||
_scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
|
||||
_scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
|
||||
_repeater.Layout = new StackLayout { Orientation = Orientation.Vertical };
|
||||
break;
|
||||
case 1:
|
||||
_scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
|
||||
_scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
|
||||
_repeater.Layout = new StackLayout { Orientation = Orientation.Horizontal };
|
||||
break;
|
||||
case 2:
|
||||
_scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
|
||||
_scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
|
||||
_repeater.Layout = new UniformGridLayout
|
||||
{
|
||||
Orientation = Orientation.Vertical,
|
||||
MinItemWidth = 200,
|
||||
MinItemHeight = 200,
|
||||
};
|
||||
break;
|
||||
case 3:
|
||||
_scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
|
||||
_scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
|
||||
_repeater.Layout = new UniformGridLayout
|
||||
{
|
||||
Orientation = Orientation.Horizontal,
|
||||
MinItemWidth = 200,
|
||||
MinItemHeight = 200,
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void RepeaterClick(object sender, PointerPressedEventArgs e)
|
||||
{
|
||||
var item = (e.Source as TextBlock)?.DataContext as ItemsRepeaterPageViewModel.Item;
|
||||
((ItemsRepeaterPageViewModel)DataContext).SelectedItem = item;
|
||||
}
|
||||
|
||||
private void RepeaterOnKeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.F5)
|
||||
{
|
||||
((ItemsRepeaterPageViewModel)DataContext).ResetItems();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ListBoxPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">ListBox</TextBlock>
|
||||
<TextBlock Classes="h2">Hosts a collection of ListBoxItem.</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<StackPanel Orientation="Vertical" Spacing="8">
|
||||
<ListBox Items="{Binding Items}" SelectedItem="{Binding SelectedItem}" AutoScrollToSelectedItem="True" SelectedItems="{Binding SelectedItems}" SelectionMode="{Binding SelectionMode}" Width="250" Height="350"></ListBox>
|
||||
|
||||
<Button Command="{Binding AddItemCommand}">Add</Button>
|
||||
|
||||
<Button Command="{Binding RemoveItemCommand}">Remove</Button>
|
||||
|
||||
<Button Command="{Binding SelectRandomItemCommand}">Select Random Item</Button>
|
||||
|
||||
<ComboBox SelectedIndex="{Binding SelectionMode, Mode=TwoWay}">
|
||||
<ComboBoxItem>Single</ComboBoxItem>
|
||||
<ComboBoxItem>Multiple</ComboBoxItem>
|
||||
<ComboBoxItem>Toggle</ComboBoxItem>
|
||||
<ComboBoxItem>AlwaysSelected</ComboBoxItem>
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,84 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Reactive;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using ReactiveUI;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class ListBoxPage : UserControl
|
||||
{
|
||||
public ListBoxPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = new PageViewModel();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
private class PageViewModel : ReactiveObject
|
||||
{
|
||||
private int _counter;
|
||||
private SelectionMode _selectionMode;
|
||||
|
||||
public PageViewModel()
|
||||
{
|
||||
Items = new ObservableCollection<string>(Enumerable.Range(1, 10000).Select(i => GenerateItem()));
|
||||
SelectedItems = new ObservableCollection<string>();
|
||||
|
||||
AddItemCommand = ReactiveCommand.Create(() => Items.Add(GenerateItem()));
|
||||
|
||||
RemoveItemCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
while (SelectedItems.Count > 0)
|
||||
{
|
||||
Items.Remove(SelectedItems[0]);
|
||||
}
|
||||
});
|
||||
|
||||
SelectRandomItemCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
var random = new Random();
|
||||
|
||||
SelectedItem = Items[random.Next(Items.Count - 1)];
|
||||
});
|
||||
}
|
||||
|
||||
public ObservableCollection<string> Items { get; }
|
||||
|
||||
private string _selectedItem;
|
||||
|
||||
public string SelectedItem
|
||||
{
|
||||
get { return _selectedItem; }
|
||||
set { this.RaiseAndSetIfChanged(ref _selectedItem, value); }
|
||||
}
|
||||
|
||||
|
||||
public ObservableCollection<string> SelectedItems { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> AddItemCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> RemoveItemCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> SelectRandomItemCommand { get; }
|
||||
|
||||
public SelectionMode SelectionMode
|
||||
{
|
||||
get => _selectionMode;
|
||||
set
|
||||
{
|
||||
SelectedItems.Clear();
|
||||
this.RaiseAndSetIfChanged(ref _selectionMode, value);
|
||||
}
|
||||
}
|
||||
|
||||
private string GenerateItem() => $"Item {_counter++.ToString()}";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.MenuPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Menu</TextBlock>
|
||||
<TextBlock Classes="h2">Exported menu fallback</TextBlock>
|
||||
<TextBlock>(Should be only visible on platforms without desktop-global menu bar)</TextBlock>
|
||||
<NativeMenuBar/>
|
||||
<TextBlock Classes="h2">A window menu</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<StackPanel>
|
||||
<TextBlock Classes="h3" Margin="4 8">Defined in XAML</TextBlock>
|
||||
<Menu>
|
||||
<MenuItem Header="_First">
|
||||
<MenuItem Header="Standard _Menu Item"/>
|
||||
<Separator/>
|
||||
<MenuItem Header="Menu with _Submenu">
|
||||
<MenuItem Header="Submenu _1"/>
|
||||
<MenuItem Header="Submenu _2"/>
|
||||
</MenuItem>
|
||||
<MenuItem Header="Menu Item with _Icon">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="/Assets/github_icon.png"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
<MenuItem Header="Menu Item with _Checkbox">
|
||||
<MenuItem.Icon>
|
||||
<CheckBox BorderThickness="0" IsHitTestVisible="False" IsChecked="True"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
</MenuItem>
|
||||
<MenuItem Header="_Second">
|
||||
<MenuItem Header="Second _Menu Item"/>
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel>
|
||||
<TextBlock Classes="h3" Margin="4 8">Dyanamically generated</TextBlock>
|
||||
<Menu Items="{Binding MenuItems}">
|
||||
<Menu.Styles>
|
||||
<Style Selector="MenuItem">
|
||||
<Setter Property="Header" Value="{Binding Header}"/>
|
||||
<Setter Property="Items" Value="{Binding Items}"/>
|
||||
<Setter Property="Command" Value="{Binding Command}"/>
|
||||
<Setter Property="CommandParameter" Value="{Binding CommandParameter}"/>
|
||||
</Style>
|
||||
</Menu.Styles>
|
||||
</Menu>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,18 +0,0 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class NotificationsPage : UserControl
|
||||
{
|
||||
public NotificationsPage()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,81 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.NumericUpDownPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Margin="2" Classes="h1">Numeric up-down control</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>
|
||||
|
||||
<TextBlock Margin="2,5,2,2" FontSize="14" FontWeight="Bold">Features:</TextBlock>
|
||||
<Grid Margin="2" ColumnDefinitions="Auto,Auto,Auto,Auto" RowDefinitions="Auto,Auto">
|
||||
<Grid Grid.Row="0" Grid.Column="0" ColumnDefinitions="Auto, Auto" RowDefinitions="Auto,Auto,Auto,Auto,Auto">
|
||||
<TextBlock Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Margin="2">ShowButtonSpinner:</TextBlock>
|
||||
<CheckBox Grid.Row="0" Grid.Column="1" IsChecked="{Binding #upDown.ShowButtonSpinner}" VerticalAlignment="Center" Margin="2"/>
|
||||
|
||||
<TextBlock Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" Margin="2">IsReadOnly:</TextBlock>
|
||||
<CheckBox Grid.Row="1" Grid.Column="1" IsChecked="{Binding #upDown.IsReadOnly}" VerticalAlignment="Center" Margin="2"/>
|
||||
|
||||
<TextBlock Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" Margin="2">AllowSpin:</TextBlock>
|
||||
<CheckBox Grid.Row="2" Grid.Column="1" IsChecked="{Binding #upDown.AllowSpin}" VerticalAlignment="Center" Margin="2"/>
|
||||
|
||||
<TextBlock Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Margin="2">ClipValueToMinMax:</TextBlock>
|
||||
<CheckBox Grid.Row="3" Grid.Column="1" IsChecked="{Binding #upDown.ClipValueToMinMax}" VerticalAlignment="Center" Margin="2"/>
|
||||
|
||||
</Grid>
|
||||
<Grid Grid.Row="0" Grid.Column="1" Margin="10,2,2,2" ColumnDefinitions="Auto, 120" RowDefinitions="Auto,Auto,Auto,Auto,Auto">
|
||||
<TextBlock Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Margin="2">FormatString:</TextBlock>
|
||||
<ComboBox Grid.Row="0" Grid.Column="1" Items="{Binding Formats}" SelectedItem="{Binding SelectedFormat}"
|
||||
VerticalAlignment="Center" Margin="2">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Horizontal" Spacing="2">
|
||||
<TextBlock Text="{Binding Name}"/>
|
||||
<TextBlock Text="-"/>
|
||||
<TextBlock Text="{Binding Value}"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" Margin="2">ButtonSpinnerLocation:</TextBlock>
|
||||
<ComboBox Grid.Row="1" Grid.Column="1" Items="{Binding SpinnerLocations}" SelectedItem="{Binding #upDown.ButtonSpinnerLocation}"
|
||||
VerticalAlignment="Center" Margin="2"/>
|
||||
|
||||
<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}"
|
||||
VerticalAlignment="Center" Margin="2"/>
|
||||
|
||||
<TextBlock Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Margin="2">Watermark:</TextBlock>
|
||||
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding #upDown.Watermark}" VerticalAlignment="Center" Margin="2" />
|
||||
|
||||
<TextBlock Grid.Row="4" Grid.Column="0" VerticalAlignment="Center" Margin="2">Text:</TextBlock>
|
||||
<TextBox Grid.Row="4" Grid.Column="1" Text="{Binding #upDown.Text}" VerticalAlignment="Center" Margin="2" />
|
||||
</Grid>
|
||||
<Grid Grid.Row="0" Grid.Column="2" Margin="10,2,2,2" RowDefinitions="Auto,Auto,Auto,Auto,Auto" ColumnDefinitions="Auto, 120">
|
||||
<TextBlock Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Margin="10,2,2,2">Minimum:</TextBlock>
|
||||
<NumericUpDown Grid.Row="0" Grid.Column="1" Value="{Binding #upDown.Minimum}"
|
||||
CultureInfo="{Binding #upDown.CultureInfo}" VerticalAlignment="Center" Margin="2" Width="70" HorizontalAlignment="Center"/>
|
||||
|
||||
<TextBlock Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" Margin="10,2,2,2">Maximum:</TextBlock>
|
||||
<NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding #upDown.Maximum}"
|
||||
CultureInfo="{Binding #upDown.CultureInfo}" VerticalAlignment="Center" Margin="2" Width="70" HorizontalAlignment="Center"/>
|
||||
|
||||
<TextBlock Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" Margin="10,2,2,2">Increment:</TextBlock>
|
||||
<NumericUpDown Grid.Row="2" Grid.Column="1" Value="{Binding #upDown.Increment}" VerticalAlignment="Center"
|
||||
Margin="2" Width="70" HorizontalAlignment="Center"/>
|
||||
|
||||
<TextBlock Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Margin="10,2,2,2">Value:</TextBlock>
|
||||
<NumericUpDown Grid.Row="3" Grid.Column="1" Value="{Binding #upDown.Value}" VerticalAlignment="Center"
|
||||
Margin="2" Width="70" HorizontalAlignment="Center"/>
|
||||
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
<StackPanel Margin="2,10,2,2" Orientation="Horizontal" Spacing="10">
|
||||
<TextBlock FontSize="14" FontWeight="Bold" VerticalAlignment="Center">Usage of NumericUpDown:</TextBlock>
|
||||
<NumericUpDown Name="upDown" Minimum="0" Maximum="10" Increment="0.5"
|
||||
CultureInfo="en-US" VerticalAlignment="Center" Width="100"
|
||||
Watermark="Enter text" FormatString="{Binding SelectedFormat.Value}"/>
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,108 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Media;
|
||||
using Avalonia.Media.Immutable;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class PointersPage : Control
|
||||
{
|
||||
class PointerInfo
|
||||
{
|
||||
public Point Point { get; set; }
|
||||
public Color Color { get; set; }
|
||||
}
|
||||
|
||||
private static Color[] AllColors = new[]
|
||||
{
|
||||
Colors.Aqua,
|
||||
Colors.Beige,
|
||||
Colors.Chartreuse,
|
||||
Colors.Coral,
|
||||
Colors.Fuchsia,
|
||||
Colors.Crimson,
|
||||
Colors.Lavender,
|
||||
Colors.Orange,
|
||||
Colors.Orchid,
|
||||
Colors.ForestGreen,
|
||||
Colors.SteelBlue,
|
||||
Colors.PapayaWhip,
|
||||
Colors.PaleVioletRed,
|
||||
Colors.Goldenrod,
|
||||
Colors.Maroon,
|
||||
Colors.Moccasin,
|
||||
Colors.Navy,
|
||||
Colors.Wheat,
|
||||
Colors.Violet,
|
||||
Colors.Sienna,
|
||||
Colors.Indigo,
|
||||
Colors.Honeydew
|
||||
};
|
||||
|
||||
private Dictionary<IPointer, PointerInfo> _pointers = new Dictionary<IPointer, PointerInfo>();
|
||||
|
||||
public PointersPage()
|
||||
{
|
||||
ClipToBounds = true;
|
||||
}
|
||||
|
||||
void UpdatePointer(PointerEventArgs e)
|
||||
{
|
||||
if (!_pointers.TryGetValue(e.Pointer, out var info))
|
||||
{
|
||||
if (e.RoutedEvent == PointerMovedEvent)
|
||||
return;
|
||||
var colors = AllColors.Except(_pointers.Values.Select(c => c.Color)).ToArray();
|
||||
var color = colors[new Random().Next(0, colors.Length - 1)];
|
||||
_pointers[e.Pointer] = info = new PointerInfo {Color = color};
|
||||
}
|
||||
|
||||
info.Point = e.GetPosition(this);
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
protected override void OnPointerPressed(PointerPressedEventArgs e)
|
||||
{
|
||||
UpdatePointer(e);
|
||||
e.Pointer.Capture(this);
|
||||
e.Handled = true;
|
||||
base.OnPointerPressed(e);
|
||||
}
|
||||
|
||||
protected override void OnPointerMoved(PointerEventArgs e)
|
||||
{
|
||||
UpdatePointer(e);
|
||||
e.Handled = true;
|
||||
base.OnPointerMoved(e);
|
||||
}
|
||||
|
||||
protected override void OnPointerReleased(PointerReleasedEventArgs e)
|
||||
{
|
||||
_pointers.Remove(e.Pointer);
|
||||
e.Handled = true;
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e)
|
||||
{
|
||||
_pointers.Remove(e.Pointer);
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
public override void Render(DrawingContext context)
|
||||
{
|
||||
context.FillRectangle(Brushes.Transparent, new Rect(default, Bounds.Size));
|
||||
foreach (var pt in _pointers.Values)
|
||||
{
|
||||
var brush = new ImmutableSolidColorBrush(pt.Color);
|
||||
context.DrawGeometry(brush, null, new EllipseGeometry(new Rect(pt.Point.X - 75, pt.Point.Y - 75,
|
||||
150, 150)));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ProgressBarPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">ProgressBar</TextBlock>
|
||||
<TextBlock Classes="h2">A progress bar control</TextBlock>
|
||||
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<StackPanel Spacing="16">
|
||||
<ProgressBar Value="{Binding #hprogress.Value}" />
|
||||
<ProgressBar IsIndeterminate="True"/>
|
||||
</StackPanel>
|
||||
<ProgressBar Value="{Binding #vprogress.Value}" Orientation="Vertical" />
|
||||
<ProgressBar Orientation="Vertical" IsIndeterminate="True" />
|
||||
</StackPanel>
|
||||
<StackPanel Margin="16">
|
||||
<Slider Name="hprogress" Maximum="100" Value="40"/>
|
||||
<Slider Name="vprogress" Maximum="100" Value="60"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,74 +0,0 @@
|
|||
using System;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Media;
|
||||
using Avalonia.Platform;
|
||||
using Avalonia.Rendering;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class ScreenPage : UserControl
|
||||
{
|
||||
private double _leftMost;
|
||||
|
||||
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
|
||||
{
|
||||
base.OnAttachedToVisualTree(e);
|
||||
Window w = (Window)VisualRoot;
|
||||
w.PositionChanged += (sender, args) => InvalidateVisual();
|
||||
}
|
||||
|
||||
public override void Render(DrawingContext context)
|
||||
{
|
||||
base.Render(context);
|
||||
if (!(VisualRoot is Window w))
|
||||
{
|
||||
return;
|
||||
}
|
||||
var screens = w.Screens.All;
|
||||
var scaling = ((IRenderRoot)w).RenderScaling;
|
||||
|
||||
Pen p = new Pen(Brushes.Black);
|
||||
if (screens != null)
|
||||
foreach (Screen screen in screens)
|
||||
{
|
||||
if (screen.Bounds.X / 10f < _leftMost)
|
||||
{
|
||||
_leftMost = screen.Bounds.X / 10f;
|
||||
InvalidateVisual();
|
||||
return;
|
||||
}
|
||||
|
||||
Rect boundsRect = new Rect(screen.Bounds.X / 10f + Math.Abs(_leftMost), screen.Bounds.Y / 10f, screen.Bounds.Width / 10f,
|
||||
screen.Bounds.Height / 10f);
|
||||
Rect workingAreaRect = new Rect(screen.WorkingArea.X / 10f + Math.Abs(_leftMost), screen.WorkingArea.Y / 10f, screen.WorkingArea.Width / 10f,
|
||||
screen.WorkingArea.Height / 10f);
|
||||
context.DrawRectangle(p, boundsRect);
|
||||
context.DrawRectangle(p, workingAreaRect);
|
||||
|
||||
FormattedText text = new FormattedText()
|
||||
{
|
||||
Typeface = Typeface.Default
|
||||
};
|
||||
|
||||
text.Text = $"Bounds: {screen.Bounds.Width}:{screen.Bounds.Height}";
|
||||
context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height), text);
|
||||
|
||||
text.Text = $"WorkArea: {screen.WorkingArea.Width}:{screen.WorkingArea.Height}";
|
||||
context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 20), text);
|
||||
|
||||
text.Text = $"Scaling: {screen.PixelDensity * 100}%";
|
||||
context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 40), text);
|
||||
|
||||
text.Text = $"Primary: {screen.Primary}";
|
||||
context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 60), text);
|
||||
|
||||
text.Text = $"Current: {screen.Equals(w.Screens.ScreenFromBounds(new PixelRect(w.Position, PixelSize.FromSize(w.Bounds.Size, scaling))))}";
|
||||
context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 80), text);
|
||||
}
|
||||
|
||||
context.DrawRectangle(p, new Rect(w.Position.X / 10f + Math.Abs(_leftMost), w.Position.Y / 10, w.Bounds.Width / 10, w.Bounds.Height / 10));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.SliderPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Slider</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>
|
||||
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0 16 0 0" Spacing="16">
|
||||
<Slider Value="0"
|
||||
Minimum="0"
|
||||
Maximum="100"
|
||||
Width="300"/>
|
||||
<Slider Value="0"
|
||||
Minimum="0"
|
||||
Maximum="100"
|
||||
Orientation="Vertical"
|
||||
IsSnapToTickEnabled="True"
|
||||
TickFrequency="10"
|
||||
Height="300"/>
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,80 +0,0 @@
|
|||
using System;
|
||||
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Media.Imaging;
|
||||
using Avalonia.Platform;
|
||||
|
||||
using ReactiveUI;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class TabControlPage : UserControl
|
||||
{
|
||||
public TabControlPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
DataContext = new PageViewModel
|
||||
{
|
||||
Tabs = new[]
|
||||
{
|
||||
new TabItemViewModel
|
||||
{
|
||||
Header = "Arch",
|
||||
Text = "This is the first templated tab page.",
|
||||
Image = LoadBitmap("avares://ControlCatalog/Assets/delicate-arch-896885_640.jpg"),
|
||||
},
|
||||
new TabItemViewModel
|
||||
{
|
||||
Header = "Leaf",
|
||||
Text = "This is the second templated tab page.",
|
||||
Image = LoadBitmap("avares://ControlCatalog/Assets/maple-leaf-888807_640.jpg"),
|
||||
},
|
||||
new TabItemViewModel
|
||||
{
|
||||
Header = "Disabled",
|
||||
Text = "You should not see this.",
|
||||
IsEnabled = false,
|
||||
},
|
||||
},
|
||||
TabPlacement = Dock.Top,
|
||||
};
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
private IBitmap LoadBitmap(string uri)
|
||||
{
|
||||
var assets = AvaloniaLocator.Current.GetService<IAssetLoader>();
|
||||
return new Bitmap(assets.Open(new Uri(uri)));
|
||||
}
|
||||
|
||||
private class PageViewModel : ReactiveObject
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
using System;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Media.Imaging;
|
||||
using Avalonia.Platform;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class TabStripPage : UserControl
|
||||
{
|
||||
public TabStripPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
DataContext = new[]
|
||||
{
|
||||
new TabStripItemViewModel
|
||||
{
|
||||
Header = "Item 1",
|
||||
},
|
||||
new TabStripItemViewModel
|
||||
{
|
||||
Header = "Item 2",
|
||||
},
|
||||
new TabStripItemViewModel
|
||||
{
|
||||
Header = "Disabled",
|
||||
IsEnabled = false,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
private class TabStripItemViewModel
|
||||
{
|
||||
public string Header { get; set; }
|
||||
public bool IsEnabled { get; set; } = true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.TextBoxPage">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">TextBox</TextBlock>
|
||||
<TextBlock Classes="h2">A control into which the user can input text</TextBlock>
|
||||
|
||||
<StackPanel Orientation="Horizontal"
|
||||
Margin="0,16,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Spacing="16">
|
||||
<StackPanel Orientation="Vertical" Spacing="8">
|
||||
<TextBox Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit." Width="200" />
|
||||
<TextBox Watermark="ReadOnly" IsReadOnly="True" Text="This is read only"/>
|
||||
<TextBox Width="200" Watermark="Watermark" />
|
||||
<TextBox Width="200"
|
||||
Watermark="Floating Watermark"
|
||||
UseFloatingWatermark="True"
|
||||
Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit."/>
|
||||
|
||||
<TextBox Width="200"
|
||||
Watermark="Password Box"
|
||||
UseFloatingWatermark="True"
|
||||
PasswordChar="*"
|
||||
Text="Password" />
|
||||
<TextBox Width="200" Text="Left aligned text" TextAlignment="Left" />
|
||||
<TextBox Width="200" Text="Center aligned text" TextAlignment="Center" />
|
||||
<TextBox Width="200" Text="Right aligned text" TextAlignment="Right" />
|
||||
<TextBox Width="200" Text="Custom selection brush"
|
||||
SelectionStart="5" SelectionEnd="22"
|
||||
SelectionBrush="Green" SelectionForegroundBrush="Yellow"/>
|
||||
<TextBox Width="200" Text="Custom caret brush" CaretBrush="DarkOrange"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical" Spacing="8">
|
||||
<TextBox AcceptsReturn="True" TextWrapping="Wrap" Width="200" Height="125"
|
||||
Text="Multiline TextBox with TextWrapping.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est." />
|
||||
<TextBox AcceptsReturn="True" Width="200" Height="125"
|
||||
Text="Multiline TextBox with no TextWrapping.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est." />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Vertical" Spacing="8">
|
||||
<TextBlock Classes="h2">resm fonts</TextBlock>
|
||||
<TextBox Width="200" Text="Custom font regular" FontWeight="Normal" FontStyle="Normal" FontFamily="resm:ControlCatalog.Assets.Fonts?assembly=ControlCatalog#Source Sans Pro"/>
|
||||
<TextBox Width="200" Text="Custom font bold" FontWeight="Bold" FontStyle="Normal" FontFamily="resm:ControlCatalog.Assets.Fonts?assembly=ControlCatalog#Source Sans Pro"/>
|
||||
<TextBox Width="200" Text="Custom font italic" FontWeight="Normal" FontStyle="Italic" FontFamily="resm:ControlCatalog.Assets.Fonts.SourceSansPro-Italic.ttf?assembly=ControlCatalog#Source Sans Pro"/>
|
||||
<TextBox Width="200" Text="Custom font italic bold" FontWeight="Bold" FontStyle="Italic" FontFamily="resm:ControlCatalog.Assets.Fonts.SourceSansPro-*.ttf?assembly=ControlCatalog#Source Sans Pro"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Vertical" Spacing="8">
|
||||
<TextBlock Classes="h2">res fonts</TextBlock>
|
||||
<TextBox Width="200" Text="Custom font regular" FontWeight="Normal" FontStyle="Normal" FontFamily="avares://ControlCatalog/Assets/Fonts#Source Sans Pro"/>
|
||||
<TextBox Width="200" Text="Custom font bold" FontWeight="Bold" FontStyle="Normal" FontFamily="avares://ControlCatalog/Assets/Fonts#Source Sans Pro"/>
|
||||
<TextBox Width="200" Text="Custom font italic" FontWeight="Normal" FontStyle="Italic" FontFamily="/Assets/Fonts/SourceSansPro-Italic.ttf#Source Sans Pro"/>
|
||||
<TextBox Width="200" Text="Custom font italic bold" FontWeight="Bold" FontStyle="Italic" FontFamily="/Assets/Fonts/SourceSansPro-*.ttf#Source Sans Pro"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
|
@ -1,115 +0,0 @@
|
|||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Reactive;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using ReactiveUI;
|
||||
|
||||
namespace ControlCatalog.Pages
|
||||
{
|
||||
public class TreeViewPage : UserControl
|
||||
{
|
||||
public TreeViewPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = new PageViewModel();
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
private class PageViewModel : ReactiveObject
|
||||
{
|
||||
private SelectionMode _selectionMode;
|
||||
|
||||
public PageViewModel()
|
||||
{
|
||||
Node root = new Node();
|
||||
Items = root.Children;
|
||||
SelectedItems = new ObservableCollection<Node>();
|
||||
|
||||
AddItemCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
Node parentItem = SelectedItems.Count > 0 ? SelectedItems[0] : root;
|
||||
parentItem.AddNewItem();
|
||||
});
|
||||
|
||||
RemoveItemCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
while (SelectedItems.Count > 0)
|
||||
{
|
||||
Node lastItem = SelectedItems[0];
|
||||
RecursiveRemove(Items, lastItem);
|
||||
SelectedItems.Remove(lastItem);
|
||||
}
|
||||
|
||||
bool RecursiveRemove(ObservableCollection<Node> items, Node selectedItem)
|
||||
{
|
||||
if (items.Remove(selectedItem))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach (Node item in items)
|
||||
{
|
||||
if (item.AreChildrenInitialized && RecursiveRemove(item.Children, selectedItem))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ObservableCollection<Node> Items { get; }
|
||||
|
||||
public ObservableCollection<Node> SelectedItems { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> AddItemCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> RemoveItemCommand { get; }
|
||||
|
||||
public SelectionMode SelectionMode
|
||||
{
|
||||
get => _selectionMode;
|
||||
set
|
||||
{
|
||||
SelectedItems.Clear();
|
||||
this.RaiseAndSetIfChanged(ref _selectionMode, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class Node
|
||||
{
|
||||
private int _counter;
|
||||
private ObservableCollection<Node> _children;
|
||||
|
||||
public string Header { get; private set; }
|
||||
|
||||
public bool AreChildrenInitialized => _children != null;
|
||||
|
||||
public ObservableCollection<Node> Children
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_children == null)
|
||||
{
|
||||
_children = new ObservableCollection<Node>(Enumerable.Range(1, 10).Select(i => CreateNewNode()));
|
||||
}
|
||||
return _children;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddNewItem() => Children.Add(CreateNewNode());
|
||||
|
||||
public override string ToString() => Header;
|
||||
|
||||
private Node CreateNewNode() => new Node {Header = $"Item {_counter++}"};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.Pages.ViewboxPage">
|
||||
<UserControl.Resources>
|
||||
<StreamGeometry x:Key="Acorn">
|
||||
F1 M 16.6309,18.6563C 17.1309,
|
||||
8.15625 29.8809,14.1563 29.8809,
|
||||
14.1563C 30.8809,11.1563 34.1308,
|
||||
11.4063 34.1308,11.4063C 33.5,12
|
||||
34.6309,13.1563 34.6309,13.1563C
|
||||
32.1309,13.1562 31.1309,14.9062
|
||||
31.1309,14.9062C 41.1309,23.9062
|
||||
32.6309,27.9063 32.6309,27.9062C
|
||||
24.6309,24.9063 21.1309,22.1562
|
||||
16.6309,18.6563 Z M 16.6309,19.9063C
|
||||
21.6309,24.1563 25.1309,26.1562
|
||||
31.6309,28.6562C 31.6309,28.6562
|
||||
26.3809,39.1562 18.3809,36.1563C
|
||||
18.3809,36.1563 18,38 16.3809,36.9063C
|
||||
15,36 16.3809,34.9063 16.3809,34.9063C
|
||||
16.3809,34.9063 10.1309,30.9062 16.6309,19.9063 Z
|
||||
</StreamGeometry>
|
||||
</UserControl.Resources>
|
||||
|
||||
<Grid RowDefinitions="Auto,*">
|
||||
<StackPanel Orientation="Vertical" Spacing="4">
|
||||
<TextBlock Classes="h1">Viewbox</TextBlock>
|
||||
<TextBlock Classes="h2">A control used to scale single child.</TextBlock>
|
||||
</StackPanel>
|
||||
<Grid ColumnDefinitions="Auto,*,*"
|
||||
RowDefinitions="*,*,*,*"
|
||||
Grid.Row="1" Margin="48"
|
||||
MaxWidth="400">
|
||||
<TextBlock Grid.Row="0" VerticalAlignment="Center">None</TextBlock>
|
||||
<TextBlock Grid.Row="1" VerticalAlignment="Center">Fill</TextBlock>
|
||||
<TextBlock Grid.Row="2" VerticalAlignment="Center">Uniform</TextBlock>
|
||||
<TextBlock Grid.Row="3" VerticalAlignment="Center">UniformToFill</TextBlock>
|
||||
|
||||
<Viewbox Grid.Row="0" Grid.Column="1" Stretch="None">
|
||||
<TextBlock>Hello World!</TextBlock>
|
||||
</Viewbox>
|
||||
<Viewbox Grid.Row="1" Grid.Column="1" Stretch="Fill">
|
||||
<TextBlock>Hello World!</TextBlock>
|
||||
</Viewbox>
|
||||
<Viewbox Grid.Row="2" Grid.Column="1" Stretch="Uniform">
|
||||
<TextBlock>Hello World!</TextBlock>
|
||||
</Viewbox>
|
||||
<Viewbox Grid.Row="3" Grid.Column="1" Stretch="UniformToFill">
|
||||
<TextBlock>Hello World!</TextBlock>
|
||||
</Viewbox>
|
||||
|
||||
<Viewbox Grid.Row="0" Grid.Column="2" Stretch="None">
|
||||
<Path Fill="Blue" Data="{StaticResource Acorn}"/>
|
||||
</Viewbox>
|
||||
<Viewbox Grid.Row="1" Grid.Column="2" Stretch="Fill">
|
||||
<Path Fill="Blue" Data="{StaticResource Acorn}"/>
|
||||
</Viewbox>
|
||||
<Viewbox Grid.Row="2" Grid.Column="2" Stretch="Uniform">
|
||||
<Path Fill="Blue" Data="{StaticResource Acorn}"/>
|
||||
</Viewbox>
|
||||
<Viewbox Grid.Row="3" Grid.Column="2" Stretch="UniformToFill">
|
||||
<Path Fill="Blue" Data="{StaticResource Acorn}"/>
|
||||
</Viewbox>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</UserControl>
|
|
@ -1,82 +0,0 @@
|
|||
<Styles xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
>
|
||||
<Design.PreviewWith>
|
||||
<Border Padding="20">
|
||||
<TabControl Classes="sidebar">
|
||||
<TabItem Header="Item1"/>
|
||||
<TabItem Header="Item2"/>
|
||||
</TabControl>
|
||||
</Border>
|
||||
</Design.PreviewWith>
|
||||
<Style Selector="TabControl.sidebar">
|
||||
<Setter Property="TabStripPlacement" Value="Left"/>
|
||||
<Setter Property="Padding" Value="8 0 0 0"/>
|
||||
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush}"/>
|
||||
<Setter Property="Template">
|
||||
<ControlTemplate>
|
||||
<Border
|
||||
Margin="{TemplateBinding Margin}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}">
|
||||
<DockPanel>
|
||||
<ScrollViewer
|
||||
Name="PART_ScrollViewer"
|
||||
HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
|
||||
VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
|
||||
Background="{TemplateBinding Background}"
|
||||
DockPanel.Dock="Left">
|
||||
<ItemsPresenter
|
||||
Name="PART_ItemsPresenter"
|
||||
Items="{TemplateBinding Items}"
|
||||
ItemsPanel="{TemplateBinding ItemsPanel}"
|
||||
ItemTemplate="{TemplateBinding ItemTemplate}">
|
||||
</ItemsPresenter>
|
||||
</ScrollViewer>
|
||||
<ContentControl Content="{TemplateBinding Tag}" HorizontalContentAlignment="Right" DockPanel.Dock="Bottom"/>
|
||||
<ScrollViewer
|
||||
HorizontalScrollBarVisibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedItem.(ScrollViewer.HorizontalScrollBarVisibility)}"
|
||||
VerticalScrollBarVisibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedItem.(ScrollViewer.VerticalScrollBarVisibility)}">
|
||||
<ContentPresenter
|
||||
Name="PART_SelectedContentHost"
|
||||
Margin="{TemplateBinding Padding}"
|
||||
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||
Content="{TemplateBinding SelectedContent}"
|
||||
ContentTemplate="{TemplateBinding SelectedContentTemplate}">
|
||||
</ContentPresenter>
|
||||
</ScrollViewer>
|
||||
</DockPanel>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style Selector="TabControl.sidebar > TabItem">
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Foreground" Value="White"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="Margin" Value="0"/>
|
||||
<Setter Property="Padding" Value="16"/>
|
||||
<Setter Property="Opacity" Value="0.5"/>
|
||||
<Setter Property="Transitions">
|
||||
<Transitions>
|
||||
<DoubleTransition Property="Opacity" Duration="0:0:0.150"/>
|
||||
</Transitions>
|
||||
</Setter>
|
||||
<Setter Property="(ScrollViewer.HorizontalScrollBarVisibility)" Value="Auto"/>
|
||||
<Setter Property="(ScrollViewer.VerticalScrollBarVisibility)" Value="Auto"/>
|
||||
</Style>
|
||||
<Style Selector="TabControl.sidebar > TabItem:pointerover">
|
||||
<Setter Property="Opacity" Value="1"/>
|
||||
</Style>
|
||||
<Style Selector="TabControl.sidebar > TabItem:pointerover">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
</Style>
|
||||
<Style Selector="TabControl.sidebar > TabItem:selected">
|
||||
<Setter Property="Opacity" Value="1"/>
|
||||
</Style>
|
||||
<Style Selector="TabControl.sidebar > TabItem:selected">
|
||||
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush2}"/>
|
||||
</Style>
|
||||
</Styles>
|
|
@ -1,74 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using ReactiveUI;
|
||||
|
||||
namespace ControlCatalog.ViewModels
|
||||
{
|
||||
public class ItemsRepeaterPageViewModel : ReactiveObject
|
||||
{
|
||||
private int _newItemIndex = 1;
|
||||
private int _newGenerationIndex = 0;
|
||||
private ObservableCollection<Item> _items;
|
||||
|
||||
public ItemsRepeaterPageViewModel()
|
||||
{
|
||||
Items = CreateItems();
|
||||
}
|
||||
|
||||
public ObservableCollection<Item> Items
|
||||
{
|
||||
get => _items;
|
||||
set => this.RaiseAndSetIfChanged(ref _items, value);
|
||||
}
|
||||
|
||||
public Item SelectedItem { get; set; }
|
||||
|
||||
public void AddItem()
|
||||
{
|
||||
var index = SelectedItem != null ? Items.IndexOf(SelectedItem) : -1;
|
||||
Items.Insert(index + 1, new Item { Text = $"New Item {_newItemIndex++}" });
|
||||
}
|
||||
|
||||
public void RandomizeHeights()
|
||||
{
|
||||
var random = new Random();
|
||||
|
||||
foreach (var i in Items)
|
||||
{
|
||||
i.Height = random.Next(240) + 10;
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetItems()
|
||||
{
|
||||
Items = CreateItems();
|
||||
}
|
||||
|
||||
private ObservableCollection<Item> CreateItems()
|
||||
{
|
||||
var suffix = _newGenerationIndex == 0 ? string.Empty : $"[{_newGenerationIndex.ToString()}]";
|
||||
|
||||
_newGenerationIndex++;
|
||||
|
||||
return new ObservableCollection<Item>(
|
||||
Enumerable.Range(1, 100000).Select(i => new Item
|
||||
{
|
||||
Text = $"Item {i.ToString()} {suffix}"
|
||||
}));
|
||||
}
|
||||
|
||||
public class Item : ReactiveObject
|
||||
{
|
||||
private double _height = double.NaN;
|
||||
|
||||
public string Text { get; set; }
|
||||
|
||||
public double Height
|
||||
{
|
||||
get => _height;
|
||||
set => this.RaiseAndSetIfChanged(ref _height, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
using System.Reactive;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Controls.Notifications;
|
||||
using Avalonia.Dialogs;
|
||||
using ReactiveUI;
|
||||
|
||||
namespace ControlCatalog.ViewModels
|
||||
{
|
||||
class MainWindowViewModel : ReactiveObject
|
||||
{
|
||||
private IManagedNotificationManager _notificationManager;
|
||||
|
||||
public MainWindowViewModel(IManagedNotificationManager notificationManager)
|
||||
{
|
||||
_notificationManager = notificationManager;
|
||||
|
||||
ShowCustomManagedNotificationCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
NotificationManager.Show(new NotificationViewModel(NotificationManager) { Title = "Hey There!", Message = "Did you know that Avalonia now supports Custom In-Window Notifications?" });
|
||||
});
|
||||
|
||||
ShowManagedNotificationCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Welcome", "Avalonia now supports Notifications.", NotificationType.Information));
|
||||
});
|
||||
|
||||
ShowNativeNotificationCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Error", "Native Notifications are not quite ready. Coming soon.", NotificationType.Error));
|
||||
});
|
||||
|
||||
AboutCommand = ReactiveCommand.CreateFromTask(async () =>
|
||||
{
|
||||
var dialog = new AboutAvaloniaDialog();
|
||||
|
||||
var mainWindow = (App.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow;
|
||||
|
||||
await dialog.ShowDialog(mainWindow);
|
||||
});
|
||||
|
||||
ExitCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
(App.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime).Shutdown();
|
||||
});
|
||||
}
|
||||
|
||||
public IManagedNotificationManager NotificationManager
|
||||
{
|
||||
get { return _notificationManager; }
|
||||
set { this.RaiseAndSetIfChanged(ref _notificationManager, value); }
|
||||
}
|
||||
|
||||
public ReactiveCommand<Unit, Unit> ShowCustomManagedNotificationCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> ShowManagedNotificationCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> ShowNativeNotificationCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> AboutCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> ExitCommand { get; }
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace ControlCatalog.ViewModels
|
||||
{
|
||||
public class MenuItemViewModel
|
||||
{
|
||||
public string Header { get; set; }
|
||||
public ICommand Command { get; set; }
|
||||
public object CommandParameter { get; set; }
|
||||
public IList<MenuItemViewModel> Items { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
using System.Reactive;
|
||||
using Avalonia.Controls.Notifications;
|
||||
using ReactiveUI;
|
||||
|
||||
namespace ControlCatalog.ViewModels
|
||||
{
|
||||
public class NotificationViewModel
|
||||
{
|
||||
public NotificationViewModel(INotificationManager manager)
|
||||
{
|
||||
YesCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today."));
|
||||
});
|
||||
|
||||
NoCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today. To find out more visit..."));
|
||||
});
|
||||
}
|
||||
|
||||
public string Title { get; set; }
|
||||
public string Message { get; set; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> YesCommand { get; }
|
||||
|
||||
public ReactiveCommand<Unit, Unit> NoCommand { get; }
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0-android</TargetFramework>
|
||||
<SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<ApplicationId>com.CompanyName.ControlCatalogStandalone</ApplicationId>
|
||||
<ApplicationVersion>1</ApplicationVersion>
|
||||
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
|
||||
<AndroidPackageFormat>apk</AndroidPackageFormat>
|
||||
<AndroidEnableProfiledAot>False</AndroidEnableProfiledAot>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Icon.png">
|
||||
<Link>Resources\drawable\Icon.png</Link>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia.Android" Version="$(AvaloniaVersion)" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ControlCatalogStandalone\ControlCatalogStandalone.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,10 @@
|
|||
using Android.App;
|
||||
using Android.Content.PM;
|
||||
using Avalonia.Android;
|
||||
|
||||
namespace ControlCatalogStandalone.Android;
|
||||
|
||||
[Activity(Label = "ControlCatalogStandalone.Android", Theme = "@style/MyTheme.NoActionBar", Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]
|
||||
public class MainActivity : AvaloniaMainActivity
|
||||
{
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<application android:label="ControlCatalogStandalone" android:icon="@drawable/Icon" />
|
||||
</manifest>
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item>
|
||||
<color android:color="@color/splash_background"/>
|
||||
</item>
|
||||
|
||||
<item android:drawable="@drawable/icon"
|
||||
android:width="120dp"
|
||||
android:height="120dp"
|
||||
android:gravity="center" />
|
||||
|
||||
</layer-list>
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="splash_background">#212121</color>
|
||||
</resources>
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="splash_background">#FFFFFF</color>
|
||||
</resources>
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<resources>
|
||||
|
||||
<style name="MyTheme">
|
||||
</style>
|
||||
|
||||
<style name="MyTheme.NoActionBar" parent="@style/Theme.AppCompat.NoActionBar">
|
||||
<item name="android:windowActionBar">false</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
</style>
|
||||
|
||||
<style name="MyTheme.Splash" parent ="MyTheme.NoActionBar">
|
||||
<item name="android:windowBackground">@drawable/splash_screen</item>
|
||||
<item name="android:windowContentOverlay">@null</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
|
@ -0,0 +1,32 @@
|
|||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Application = Android.App.Application;
|
||||
using Avalonia;
|
||||
using Avalonia.Android;
|
||||
using Avalonia.ReactiveUI;
|
||||
|
||||
namespace ControlCatalogStandalone.Android;
|
||||
|
||||
[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)]
|
||||
public class SplashActivity : AvaloniaSplashActivity<App>
|
||||
{
|
||||
protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
|
||||
{
|
||||
return base.CustomizeAppBuilder(builder)
|
||||
.WithInterFont()
|
||||
.UseReactiveUI();
|
||||
}
|
||||
|
||||
protected override void OnCreate(Bundle? savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
protected override void OnResume()
|
||||
{
|
||||
base.OnResume();
|
||||
|
||||
StartActivity(new Intent(Application.Context, typeof(MainActivity)));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M30.4661 34.928C30.5364 34.928 30.6052 34.928 30.6754 34.928C32.8596 34.928 34.654 33.2918 34.9053 31.1752L34.9356 16.9955C34.6872 7.56697 26.9662 0 17.4777 0C7.83263 0 0.0137329 7.8189 0.0137329 17.464C0.0137329 27.0059 7.66618 34.7631 17.1687 34.928H30.4661Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.5239 5.948C12.0268 5.948 7.42967 9.80117 6.286 14.954C7.38092 15.2609 8.18385 16.2664 8.18385 17.4593C8.18385 18.6523 7.38092 19.6577 6.286 19.9647C7.42966 25.1175 12.0268 28.9706 17.5239 28.9706C19.525 28.9706 21.4068 28.4601 23.0462 27.562V28.8927H29.0352V17.9365C29.0407 17.7908 29.0352 17.6063 29.0352 17.4593C29.0352 11.1018 23.8814 5.948 17.5239 5.948ZM12.0098 17.4593C12.0098 14.414 14.4786 11.9452 17.5239 11.9452C20.5693 11.9452 23.038 14.414 23.038 17.4593C23.038 20.5047 20.5693 22.9734 17.5239 22.9734C14.4786 22.9734 12.0098 20.5047 12.0098 17.4593Z" fill="#8B44AC"/>
|
||||
<path d="M7.36841 17.4517C7.36841 18.4691 6.54368 19.2938 5.52631 19.2938C4.50894 19.2938 3.6842 18.4691 3.6842 17.4517C3.6842 16.4343 4.50894 15.6096 5.52631 15.6096C6.54368 15.6096 7.36841 16.4343 7.36841 17.4517Z" fill="#8B44AC"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
|
@ -0,0 +1,74 @@
|
|||
:root {
|
||||
--sat: env(safe-area-inset-top);
|
||||
--sar: env(safe-area-inset-right);
|
||||
--sab: env(safe-area-inset-bottom);
|
||||
--sal: env(safe-area-inset-left);
|
||||
}
|
||||
|
||||
/* HTML styles for the splash screen */
|
||||
|
||||
.highlight {
|
||||
color: white;
|
||||
font-size: 2.5rem;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.purple {
|
||||
color: #8b44ac;
|
||||
}
|
||||
|
||||
.icon {
|
||||
opacity: 0.05;
|
||||
height: 35%;
|
||||
width: 35%;
|
||||
position: absolute;
|
||||
background-repeat: no-repeat;
|
||||
right: 0px;
|
||||
bottom: 0px;
|
||||
margin-right: 3%;
|
||||
margin-bottom: 5%;
|
||||
z-index: 5000;
|
||||
background-position: right bottom;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
#avalonia-splash a {
|
||||
color: whitesmoke;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
#avalonia-splash {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
color: whitesmoke;
|
||||
background: #1b2a4e;
|
||||
font-family: 'Nunito', sans-serif;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.splash-close {
|
||||
animation: fadeout 0.25s linear forwards;
|
||||
}
|
||||
|
||||
@keyframes fadeout {
|
||||
0% {
|
||||
opacity: 100%;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
visibility: collapse;
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 172 KiB |
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>ControlCatalogStandalone.Browser</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<base href="/" />
|
||||
<link rel="modulepreload" href="./main.js" />
|
||||
<link rel="modulepreload" href="./dotnet.js" />
|
||||
<link rel="modulepreload" href="./avalonia.js" />
|
||||
<link rel="stylesheet" href="./app.css" />
|
||||
</head>
|
||||
|
||||
<body style="margin: 0px; overflow: hidden">
|
||||
<div id="out">
|
||||
<div id="avalonia-splash">
|
||||
<div class="center">
|
||||
<h2 class="purple">
|
||||
Powered by
|
||||
<a class="highlight" href="https://www.avaloniaui.net/" target="_blank">Avalonia UI</a>
|
||||
</h2>
|
||||
</div>
|
||||
<img class="icon" src="Logo.svg" alt="Avalonia Logo" />
|
||||
</div>
|
||||
</div>
|
||||
<script type='module' src="./main.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,13 @@
|
|||
import { dotnet } from './dotnet.js'
|
||||
|
||||
const is_browser = typeof window != "undefined";
|
||||
if (!is_browser) throw new Error(`Expected to be running in a browser`);
|
||||
|
||||
const dotnetRuntime = await dotnet
|
||||
.withDiagnosticTracing(false)
|
||||
.withApplicationArgumentsFromQuery()
|
||||
.create();
|
||||
|
||||
const config = dotnetRuntime.getConfig();
|
||||
|
||||
await dotnetRuntime.runMainAndExit(config.mainAssemblyName, [window.location.search]);
|
|
@ -0,0 +1,20 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<RuntimeIdentifier>browser-wasm</RuntimeIdentifier>
|
||||
<WasmMainJSPath>AppBundle\main.js</WasmMainJSPath>
|
||||
<OutputType>Exe</OutputType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<WasmExtraFilesToDeploy Include="AppBundle\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia.Browser" Version="$(AvaloniaVersion)" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ControlCatalogStandalone\ControlCatalogStandalone.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,19 @@
|
|||
using System.Runtime.Versioning;
|
||||
using System.Threading.Tasks;
|
||||
using Avalonia;
|
||||
using Avalonia.Browser;
|
||||
using Avalonia.ReactiveUI;
|
||||
using ControlCatalogStandalone;
|
||||
|
||||
[assembly: SupportedOSPlatform("browser")]
|
||||
|
||||
internal partial class Program
|
||||
{
|
||||
private static async Task Main(string[] args) => await BuildAvaloniaApp()
|
||||
.WithInterFont()
|
||||
.UseReactiveUI()
|
||||
.StartBrowserAppAsync("out");
|
||||
|
||||
public static AppBuilder BuildAvaloniaApp()
|
||||
=> AppBuilder.Configure<App>();
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"profiles": {
|
||||
"ControlCatalogStandalone.Browser": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "https://localhost:5001;http://localhost:5000",
|
||||
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/debug?browser={browserInspectUri}"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"wasmHostProperties": {
|
||||
"perHostConfig": [
|
||||
{
|
||||
"name": "browser",
|
||||
"html-path": "index.html",
|
||||
"Host": "browser"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<!--If you are willing to use Windows/MacOS native APIs you will need to create 3 projects.
|
||||
One for Windows with net7.0-windows TFM, one for MacOS with net7.0-macos and one with net7.0 TFM for Linux.-->
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia.Desktop" Version="$(AvaloniaVersion)" />
|
||||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ControlCatalogStandalone\ControlCatalogStandalone.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using Avalonia;
|
||||
|
||||
namespace ControlCatalogStandalone.Desktop;
|
||||
|
||||
class Program
|
||||
{
|
||||
// Initialization code. Don't use any Avalonia, third-party APIs or any
|
||||
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
|
||||
// yet and stuff might break.
|
||||
[STAThread]
|
||||
public static void Main(string[] args) => BuildAvaloniaApp()
|
||||
.StartWithClassicDesktopLifetime(args);
|
||||
|
||||
// Avalonia configuration, don't remove; also used by visual designer.
|
||||
public static AppBuilder BuildAvaloniaApp()
|
||||
=> AppBuilder.Configure<App>()
|
||||
.UsePlatformDetect()
|
||||
.WithInterFont()
|
||||
.LogToTrace();
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<!-- This manifest is used on Windows only.
|
||||
Don't remove it as it might cause problems with window transparency and embeded controls.
|
||||
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
|
||||
<assemblyIdentity version="1.0.0.0" name="ControlCatalogStandalone.Desktop"/>
|
||||
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- A list of the Windows versions that this application has been tested on
|
||||
and is designed to work with. Uncomment the appropriate elements
|
||||
and Windows will automatically select the most compatible environment. -->
|
||||
|
||||
<!-- Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||
</application>
|
||||
</compatibility>
|
||||
</assembly>
|
|
@ -0,0 +1,23 @@
|
|||
using Foundation;
|
||||
using UIKit;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.iOS;
|
||||
using Avalonia.Media;
|
||||
using Avalonia.ReactiveUI;
|
||||
|
||||
namespace ControlCatalogStandalone.iOS;
|
||||
|
||||
// The UIApplicationDelegate for the application. This class is responsible for launching the
|
||||
// User Interface of the application, as well as listening (and optionally responding) to
|
||||
// application events from iOS.
|
||||
[Register("AppDelegate")]
|
||||
public partial class AppDelegate : AvaloniaAppDelegate<App>
|
||||
{
|
||||
protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
|
||||
{
|
||||
return base.CustomizeAppBuilder(builder)
|
||||
.WithInterFont()
|
||||
.UseReactiveUI();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0-ios</TargetFramework>
|
||||
<SupportedOSPlatformVersion>10.0</SupportedOSPlatformVersion>
|
||||
<ProvisioningType>manual</ProvisioningType>
|
||||
<Nullable>enable</Nullable>
|
||||
<RuntimeIdentifier>iossimulator-x64</RuntimeIdentifier>
|
||||
|
||||
<!-- These properties need to be set in order to run on a real iDevice -->
|
||||
<!--<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>-->
|
||||
<!--<CodesignKey></CodesignKey>-->
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia.iOS" Version="$(AvaloniaVersion)" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ControlCatalogStandalone\ControlCatalogStandalone.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict/>
|
||||
</plist>
|
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>ControlCatalogStandalone</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>companyName.ControlCatalogStandalone</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>10.0</string>
|
||||
<key>UIDeviceFamily</key>
|
||||
<array>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIStatusBarHidden</key>
|
||||
<true/>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,14 @@
|
|||
using UIKit;
|
||||
|
||||
namespace ControlCatalogStandalone.iOS;
|
||||
|
||||
public class Application
|
||||
{
|
||||
// This is the main entry point of the application.
|
||||
static void Main(string[] args)
|
||||
{
|
||||
// if you want to use a different Application Delegate class from "AppDelegate"
|
||||
// you can specify it here.
|
||||
UIApplication.Main(args, null, typeof(AppDelegate));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6214" systemVersion="14A314h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6207" />
|
||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1" />
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" />
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder" />
|
||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="480" />
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" />
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2022 " textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines"
|
||||
minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
|
||||
<rect key="frame" x="20" y="439" width="441" height="21" />
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17" />
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor" />
|
||||
<nil key="highlightedColor" />
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ControlCatalogStandalone" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines"
|
||||
minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
|
||||
<rect key="frame" x="20" y="140" width="441" height="43" />
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36" />
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor" />
|
||||
<nil key="highlightedColor" />
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite" />
|
||||
<constraints>
|
||||
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC" />
|
||||
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk" />
|
||||
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l" />
|
||||
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0" />
|
||||
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9" />
|
||||
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g" />
|
||||
</constraints>
|
||||
<nil key="simulatedStatusBarMetrics" />
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics" />
|
||||
<point key="canvasLocation" x="548" y="455" />
|
||||
</view>
|
||||
</objects>
|
||||
</document>
|
|
@ -1,65 +1,54 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.27130.0
|
||||
MinimumVisualStudioVersion = 15.0.26124.0
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalog", "ControlCatalog\ControlCatalog.csproj", "{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}"
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.3.32811.315
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalogStandalone", "ControlCatalogStandalone\ControlCatalogStandalone.csproj", "{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalog.NetCore", "ControlCatalog.NetCore\ControlCatalog.NetCore.csproj", "{031D3660-77D8-4B4B-8E05-F57323CAEF83}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalogStandalone.Desktop", "ControlCatalogStandalone.Desktop\ControlCatalogStandalone.Desktop.csproj", "{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalog.NetFX", "ControlCatalog.NetFX\ControlCatalog.NetFX.csproj", "{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalogStandalone.Browser", "ControlCatalogStandalone.Browser\ControlCatalogStandalone.Browser.csproj", "{1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalogStandalone.iOS", "ControlCatalogStandalone.iOS\ControlCatalogStandalone.iOS.csproj", "{EBD9022F-BC83-4846-9A11-6F7F3772DC64}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalogStandalone.Android", "ControlCatalogStandalone.Android\ControlCatalogStandalone.Android.csproj", "{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3DA99C4E-89E3-4049-9C22-0A7EC60D83D8}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
Directory.Build.props = Directory.Build.props
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Release|x64.Build.0 = Release|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{AD3597AC-6D56-4C01-B7B0-2D30B0799A5E}.Release|x86.Build.0 = Release|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Release|x64.Build.0 = Release|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{031D3660-77D8-4B4B-8E05-F57323CAEF83}.Release|x86.Build.0 = Release|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Release|x64.Build.0 = Release|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{FC1F427A-FBDB-4A13-A1C3-5E29BA60E630}.Release|x86.Build.0 = Release|Any CPU
|
||||
{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {496E6073-AF37-47D9-9ADD-67C54862D929}
|
||||
SolutionGuid = {83CB65B8-011F-4ED7-BCD3-A6CFA935EF7E}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
<Application xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:vm="using:ControlCatalogStandalone.ViewModels"
|
||||
x:DataType="vm:ApplicationViewModel"
|
||||
Name="Avalonia ControlCatalogStandalone"
|
||||
x:Class="ControlCatalogStandalone.App">
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<!-- Resources used only in the control catalog -->
|
||||
<ResourceDictionary.ThemeDictionaries>
|
||||
<ResourceDictionary x:Key="Default">
|
||||
<Color x:Key="CatalogBaseLowColor">#33000000</Color>
|
||||
<Color x:Key="CatalogBaseMediumColor">#99000000</Color>
|
||||
<Color x:Key="CatalogChromeMediumColor">#FFE6E6E6</Color>
|
||||
<Color x:Key="CatalogBaseHighColor">#FF000000</Color>
|
||||
</ResourceDictionary>
|
||||
<ResourceDictionary x:Key="Dark">
|
||||
<Color x:Key="CatalogBaseLowColor">#33FFFFFF</Color>
|
||||
<Color x:Key="CatalogBaseMediumColor">#99FFFFFF</Color>
|
||||
<Color x:Key="CatalogChromeMediumColor">#FF1F1F1F</Color>
|
||||
<Color x:Key="CatalogBaseHighColor">#FFFFFFFF</Color>
|
||||
</ResourceDictionary>
|
||||
</ResourceDictionary.ThemeDictionaries>
|
||||
|
||||
<!-- Styles attached dynamically depending on current theme (simple or fluent) -->
|
||||
<StyleInclude x:Key="DataGridFluent" Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml" />
|
||||
<StyleInclude x:Key="DataGridSimple" Source="avares://Avalonia.Controls.DataGrid/Themes/Simple.xaml" />
|
||||
<StyleInclude x:Key="ColorPickerFluent" Source="avares://Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml" />
|
||||
<StyleInclude x:Key="ColorPickerSimple" Source="avares://Avalonia.Controls.ColorPicker/Themes/Simple/Simple.xaml" />
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
<Application.Styles>
|
||||
<Style Selector="TextBlock.h1, TextBlock.h2, TextBlock.h3">
|
||||
<Setter Property="TextWrapping" Value="Wrap" />
|
||||
</Style>
|
||||
<Style Selector="TextBlock.h1">
|
||||
<Setter Property="FontSize" Value="16" />
|
||||
<Setter Property="FontWeight" Value="Medium" />
|
||||
</Style>
|
||||
<Style Selector="TextBlock.h2">
|
||||
<Setter Property="FontSize" Value="14" />
|
||||
</Style>
|
||||
<Style Selector="TextBlock.h3">
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
</Style>
|
||||
<Style Selector="Label.h1">
|
||||
<Setter Property="FontSize" Value="16" />
|
||||
<Setter Property="FontWeight" Value="Medium" />
|
||||
</Style>
|
||||
<Style Selector="Label.h2">
|
||||
<Setter Property="FontSize" Value="14" />
|
||||
</Style>
|
||||
<Style Selector="Label.h3">
|
||||
<Setter Property="FontSize" Value="12" />
|
||||
</Style>
|
||||
</Application.Styles>
|
||||
<TrayIcon.Icons>
|
||||
<TrayIcons>
|
||||
<TrayIcon Icon="/Assets/test_icon.ico" ToolTipText="Avalonia Tray Icon ToolTip">
|
||||
<TrayIcon.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Settings">
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Option 1" ToggleType="Radio" IsChecked="True" Command="{Binding ToggleCommand}" />
|
||||
<NativeMenuItem Header="Option 2" ToggleType="Radio" IsChecked="True" Command="{Binding ToggleCommand}" />
|
||||
<NativeMenuItemSeparator />
|
||||
<NativeMenuItem Header="Option 3" ToggleType="CheckBox" IsChecked="True" Command="{Binding ToggleCommand}" />
|
||||
<NativeMenuItem Icon="/Assets/test_icon.ico" Header="Restore Defaults" Command="{Binding ToggleCommand}" />
|
||||
<NativeMenuItem Header="Disabled option" IsEnabled="False" />
|
||||
</NativeMenu>
|
||||
</NativeMenuItem>
|
||||
<NativeMenuItem Header="Exit" Command="{Binding ExitCommand}" />
|
||||
</NativeMenu>
|
||||
</TrayIcon.Menu>
|
||||
</TrayIcon>
|
||||
</TrayIcons>
|
||||
</TrayIcon.Icons>
|
||||
</Application>
|
|
@ -0,0 +1,105 @@
|
|||
using System;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Styling;
|
||||
using Avalonia.Themes.Simple;
|
||||
using Avalonia.Themes.Fluent;
|
||||
using ControlCatalogStandalone.Models;
|
||||
using ControlCatalogStandalone.ViewModels;
|
||||
|
||||
namespace ControlCatalogStandalone
|
||||
{
|
||||
public partial class App : Application
|
||||
{
|
||||
private readonly Styles _themeStylesContainer = new();
|
||||
private FluentTheme? _fluentTheme;
|
||||
private SimpleTheme? _simpleTheme;
|
||||
private IStyle? _colorPickerFluent, _colorPickerSimple;
|
||||
private IStyle? _dataGridFluent, _dataGridSimple;
|
||||
|
||||
public App()
|
||||
{
|
||||
DataContext = new ApplicationViewModel();
|
||||
}
|
||||
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
Styles.Add(_themeStylesContainer);
|
||||
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
|
||||
_fluentTheme = new FluentTheme();
|
||||
_simpleTheme = new SimpleTheme();
|
||||
_colorPickerFluent = (IStyle)Resources["ColorPickerFluent"]!;
|
||||
_colorPickerSimple = (IStyle)Resources["ColorPickerSimple"]!;
|
||||
_dataGridFluent = (IStyle)Resources["DataGridFluent"]!;
|
||||
_dataGridSimple = (IStyle)Resources["DataGridSimple"]!;
|
||||
|
||||
SetCatalogThemes(CatalogTheme.Fluent);
|
||||
}
|
||||
|
||||
public override void OnFrameworkInitializationCompleted()
|
||||
{
|
||||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
|
||||
{
|
||||
desktopLifetime.MainWindow = new MainWindow { DataContext = new MainWindowViewModel() };
|
||||
}
|
||||
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime)
|
||||
{
|
||||
singleViewLifetime.MainView = new MainView { DataContext = new MainWindowViewModel() };
|
||||
}
|
||||
|
||||
base.OnFrameworkInitializationCompleted();
|
||||
}
|
||||
|
||||
private CatalogTheme _prevTheme;
|
||||
public static CatalogTheme CurrentTheme => ((App)Current!)._prevTheme;
|
||||
|
||||
public static void SetCatalogThemes(CatalogTheme theme)
|
||||
{
|
||||
var app = (App)Current!;
|
||||
var prevTheme = app._prevTheme;
|
||||
app._prevTheme = theme;
|
||||
var shouldReopenWindow = prevTheme != theme;
|
||||
|
||||
if (app._themeStylesContainer.Count == 0)
|
||||
{
|
||||
app._themeStylesContainer.Add(new Style());
|
||||
app._themeStylesContainer.Add(new Style());
|
||||
app._themeStylesContainer.Add(new Style());
|
||||
}
|
||||
|
||||
if (theme == CatalogTheme.Fluent)
|
||||
{
|
||||
app._themeStylesContainer[0] = app._fluentTheme!;
|
||||
app._themeStylesContainer[1] = app._colorPickerFluent!;
|
||||
app._themeStylesContainer[2] = app._dataGridFluent!;
|
||||
}
|
||||
else if (theme == CatalogTheme.Simple)
|
||||
{
|
||||
app._themeStylesContainer[0] = app._simpleTheme!;
|
||||
app._themeStylesContainer[1] = app._colorPickerSimple!;
|
||||
app._themeStylesContainer[2] = app._dataGridSimple!;
|
||||
}
|
||||
|
||||
if (shouldReopenWindow)
|
||||
{
|
||||
if (app.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
|
||||
{
|
||||
var oldWindow = desktopLifetime.MainWindow;
|
||||
var newWindow = new MainWindow();
|
||||
desktopLifetime.MainWindow = newWindow;
|
||||
newWindow.Show();
|
||||
oldWindow?.Close();
|
||||
}
|
||||
else if (app.ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime)
|
||||
{
|
||||
singleViewLifetime.MainView = new MainView();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 212 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |
After Width: | Height: | Size: 172 KiB |
|
@ -0,0 +1,30 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<AvaloniaResource Include="Assets\**" />
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-Bold.ttf" />
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-BoldItalic.ttf" />
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-Italic.ttf" />
|
||||
<EmbeddedResource Include="Assets\Fonts\SourceSansPro-Regular.ttf" />
|
||||
<EmbeddedResource Include="Pages\teapot.bin" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="Avalonia.Fonts.Inter" Version="$(AvaloniaVersion)" />
|
||||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="Avalonia" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.0" />
|
||||
<PackageReference Include="System.Reactive.Linq" Version="6.0.0" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using Avalonia.Data.Converters;
|
||||
|
||||
namespace ControlCatalogStandalone.Converter
|
||||
{
|
||||
public class DegToRadConverter : IValueConverter
|
||||
{
|
||||
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is double rad)
|
||||
{
|
||||
return rad * 180.0d / Math.PI;
|
||||
}
|
||||
return 0.0d;
|
||||
}
|
||||
|
||||
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is double deg)
|
||||
{
|
||||
return deg / 180.0d * Math.PI;
|
||||
}
|
||||
return 0.0d;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
using System.Globalization;
|
||||
using Avalonia;
|
||||
using Avalonia.Data.Converters;
|
||||
|
||||
namespace ControlCatalogStandalone.Converter;
|
||||
|
||||
public class HexConverter : IValueConverter
|
||||
{
|
||||
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
var str = value?.ToString();
|
||||
if (str == null)
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
if (int.TryParse(str, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int x))
|
||||
return (decimal)x;
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
|
||||
}
|
||||
|
||||
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (value is decimal d)
|
||||
return ((int)d).ToString("X8");
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return AvaloniaProperty.UnsetValue;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Globalization;
|
||||
using Avalonia.Data.Converters;
|
||||
|
||||
namespace ControlCatalogStandalone.Converter;
|
||||
|
||||
public class MathSubtractConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is double dv && parameter is double dp)
|
||||
{
|
||||
return dv - dp;
|
||||
}
|
||||
return double.NaN;
|
||||
}
|
||||
|
||||
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
|
@ -1,30 +1,26 @@
|
|||
<Window xmlns="https://github.com/avaloniaui" MinWidth="500" MinHeight="300"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="ControlCatalog.DecoratedWindow"
|
||||
x:Class="ControlCatalogStandalone.DecoratedWindow"
|
||||
Title="Avalonia Control Gallery"
|
||||
xmlns:local="clr-namespace:ControlCatalog" HasSystemDecorations="False" Name="Window">
|
||||
SystemDecorations="None" Name="Window">
|
||||
<NativeMenu.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Decorated">
|
||||
<NativeMenuItem.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Open"/>
|
||||
<NativeMenuItem Header="Recent">
|
||||
<NativeMenuItem.Menu>
|
||||
<NativeMenu/>
|
||||
</NativeMenuItem.Menu>
|
||||
</NativeMenuItem>
|
||||
<NativeMenuItem Header="Quit Avalonia" Gesture="CMD+Q"/>
|
||||
</NativeMenu>
|
||||
</NativeMenuItem.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Open"/>
|
||||
<NativeMenuItem Header="Recent">
|
||||
<NativeMenuItem.Menu>
|
||||
<NativeMenu/>
|
||||
</NativeMenuItem.Menu>
|
||||
</NativeMenuItem>
|
||||
<NativeMenuItem Header="Quit Avalonia" Gesture="CMD+Q"/>
|
||||
</NativeMenu>
|
||||
</NativeMenuItem>
|
||||
<NativeMenuItem Header="Edit">
|
||||
<NativeMenuItem.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Copy"/>
|
||||
<NativeMenuItem Header="Paste"/>
|
||||
</NativeMenu>
|
||||
</NativeMenuItem.Menu>
|
||||
<NativeMenu>
|
||||
<NativeMenuItem Header="Copy"/>
|
||||
<NativeMenuItem Header="Paste"/>
|
||||
</NativeMenu>
|
||||
</NativeMenuItem>
|
||||
</NativeMenu>
|
||||
</NativeMenu.Menu>
|
||||
|
@ -47,8 +43,13 @@
|
|||
<StackPanel>
|
||||
<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>
|
||||
</StackPanel>
|
||||
</Border>
|
|
@ -4,32 +4,31 @@ using Avalonia.Markup.Xaml;
|
|||
using System;
|
||||
using Avalonia.Input;
|
||||
|
||||
namespace ControlCatalog
|
||||
namespace ControlCatalogStandalone
|
||||
{
|
||||
public class DecoratedWindow : Window
|
||||
public partial class DecoratedWindow : Window
|
||||
{
|
||||
public DecoratedWindow()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
this.AttachDevTools();
|
||||
}
|
||||
|
||||
void SetupSide(string name, StandardCursorType cursor, WindowEdge edge)
|
||||
{
|
||||
var ctl = this.FindControl<Control>(name);
|
||||
var ctl = this.Get<Control>(name);
|
||||
ctl.Cursor = new Cursor(cursor);
|
||||
ctl.PointerPressed += (i, e) =>
|
||||
{
|
||||
PlatformImpl?.BeginResizeDrag(edge, e);
|
||||
BeginResizeDrag(edge, e);
|
||||
};
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
this.FindControl<Control>("TitleBar").PointerPressed += (i, e) =>
|
||||
this.Get<Control>("TitleBar").PointerPressed += (i, e) =>
|
||||
{
|
||||
PlatformImpl?.BeginMoveDrag(e);
|
||||
BeginMoveDrag(e);
|
||||
};
|
||||
SetupSide("Left", StandardCursorType.LeftSide, WindowEdge.West);
|
||||
SetupSide("Right", StandardCursorType.RightSide, WindowEdge.East);
|
||||
|
@ -39,12 +38,12 @@ namespace ControlCatalog
|
|||
SetupSide("TopRight", StandardCursorType.TopRightCorner, WindowEdge.NorthEast);
|
||||
SetupSide("BottomLeft", StandardCursorType.BottomLeftCorner, WindowEdge.SouthWest);
|
||||
SetupSide("BottomRight", StandardCursorType.BottomRightCorner, WindowEdge.SouthEast);
|
||||
this.FindControl<Button>("MinimizeButton").Click += delegate { this.WindowState = WindowState.Minimized; };
|
||||
this.FindControl<Button>("MaximizeButton").Click += delegate
|
||||
this.Get<Button>("MinimizeButton").Click += delegate { this.WindowState = WindowState.Minimized; };
|
||||
this.Get<Button>("MaximizeButton").Click += delegate
|
||||
{
|
||||
WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
|
||||
};
|
||||
this.FindControl<Button>("CloseButton").Click += delegate
|
||||
this.Get<Button>("CloseButton").Click += delegate
|
||||
{
|
||||
Close();
|
||||
};
|
|
@ -0,0 +1,276 @@
|
|||
<ResourceDictionary xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:catalog="using:ControlSamples">
|
||||
<Design.PreviewWith>
|
||||
<Border Width="400"
|
||||
Height="150">
|
||||
<catalog:HamburgerMenu>
|
||||
<FlyoutBase.AttachedFlyout>
|
||||
<Flyout>
|
||||
<TextBox Text="Hello World" />
|
||||
</Flyout>
|
||||
</FlyoutBase.AttachedFlyout>
|
||||
<TabItem Header="Item1" IsSelected="True">
|
||||
<UserControl>
|
||||
<Border Height="400" Background="Green" />
|
||||
</UserControl>
|
||||
</TabItem>
|
||||
<TabItem Header="Item2" />
|
||||
</catalog:HamburgerMenu>
|
||||
</Border>
|
||||
</Design.PreviewWith>
|
||||
|
||||
<ResourceDictionary.ThemeDictionaries>
|
||||
<ResourceDictionary x:Key="Dark">
|
||||
<Color x:Key="HamburgerBaseHighColor">#99FFFFFF</Color>
|
||||
<Color x:Key="HamburgerChromeMediumColor">#FF1F1F1F</Color>
|
||||
<Color x:Key="HamburgerAltHighColor">#FF000000</Color>
|
||||
<Color x:Key="HamburgerChromeLowColor">#FF171717</Color>
|
||||
</ResourceDictionary>
|
||||
<ResourceDictionary x:Key="Default">
|
||||
<Color x:Key="HamburgerBaseHighColor">#99000000</Color>
|
||||
<Color x:Key="HamburgerChromeMediumColor">#FFE6E6E6</Color>
|
||||
<Color x:Key="HamburgerAltHighColor">#FFFFFFFF</Color>
|
||||
<Color x:Key="HamburgerChromeLowColor">#FFF2F2F2</Color>
|
||||
</ResourceDictionary>
|
||||
</ResourceDictionary.ThemeDictionaries>
|
||||
|
||||
<x:Double x:Key="PaneCompactWidth">40</x:Double>
|
||||
<x:Double x:Key="PaneExpandWidth">220</x:Double>
|
||||
<x:Double x:Key="HeaderHeight">36</x:Double>
|
||||
<x:Double x:Key="NavigationItemHeight">36</x:Double>
|
||||
<x:Double x:Key="HamburgerMenuButtonHeight">32</x:Double>
|
||||
<Thickness x:Key="HeaderMarginCollapsedPane">12,0,0,0</Thickness>
|
||||
<Thickness x:Key="HeaderMarginExpandedPane">52,0,0,0</Thickness>
|
||||
<Thickness x:Key="HeaderMarginExpandedOverlayPane">212,0,0,0</Thickness>
|
||||
<BoxShadows x:Key="NavigationItemShadow">1 1 1 1 #2000, 0 0 1 1 #2fff</BoxShadows>
|
||||
<BoxShadows x:Key="NavigationContentShadow">0 0 1 1 #2000</BoxShadows>
|
||||
|
||||
<ControlTheme x:Key="NavigationButton" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
|
||||
<Setter Property="VerticalContentAlignment" Value="Center" />
|
||||
<Setter Property="HorizontalAlignment" Value="Stretch" />
|
||||
<Setter Property="VerticalAlignment" Value="Stretch" />
|
||||
<Setter Property="FontWeight" Value="Normal" />
|
||||
<Setter Property="MinHeight" Value="0" />
|
||||
<Setter Property="Height" Value="{StaticResource NavigationItemHeight}" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="Padding" Value="12,0,4,0" />
|
||||
<Setter Property="Margin" Value="4,0,8,0" />
|
||||
<Setter Property="CornerRadius" Value="8" />
|
||||
<Setter Property="ClipToBounds" Value="False" />
|
||||
<Setter Property="Template">
|
||||
<ControlTemplate>
|
||||
<ContentPresenter Name="PART_ContentPresenter"
|
||||
Padding="{TemplateBinding Padding}"
|
||||
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
Content="{TemplateBinding Content}"
|
||||
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||
CornerRadius="{TemplateBinding CornerRadius}"
|
||||
TextElement.FontFamily="{TemplateBinding FontFamily}"
|
||||
TextElement.FontSize="{TemplateBinding FontSize}"
|
||||
TextElement.FontWeight="{TemplateBinding FontWeight}" />
|
||||
</ControlTemplate>
|
||||
</Setter>
|
||||
|
||||
<Style Selector="^:pointerover /template/ ContentPresenter">
|
||||
<Setter Property="Border.Background" Value="{DynamicResource HamburgerChromeLowColor}" />
|
||||
<Setter Property="Border.BoxShadow" Value="{StaticResource NavigationItemShadow}" />
|
||||
<Setter Property="TextElement.Foreground" Value="{DynamicResource TabItemHeaderForegroundUnselectedPointerOver}" />
|
||||
</Style>
|
||||
</ControlTheme>
|
||||
|
||||
<ControlTheme x:Key="HamburgerMenuTabItem" TargetType="TabItem">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
|
||||
<Setter Property="VerticalContentAlignment" Value="Center" />
|
||||
<Setter Property="HorizontalAlignment" Value="Stretch" />
|
||||
<Setter Property="VerticalAlignment" Value="Stretch" />
|
||||
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" />
|
||||
<Setter Property="FontWeight" Value="Normal" />
|
||||
<Setter Property="MinHeight" Value="0" />
|
||||
<Setter Property="Height" Value="{StaticResource NavigationItemHeight}" />
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="Padding" Value="12,0,4,0" />
|
||||
<Setter Property="Margin" Value="4,0,8,0" />
|
||||
<Setter Property="CornerRadius" Value="8" />
|
||||
<Setter Property="ClipToBounds" Value="False" />
|
||||
<Setter Property="Template">
|
||||
<ControlTemplate>
|
||||
<Border Name="PART_LayoutRoot"
|
||||
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{TemplateBinding CornerRadius}">
|
||||
<Panel>
|
||||
<Border Name="PART_SelectedPipe"
|
||||
Width="{DynamicResource TabItemPipeThickness}"
|
||||
Height="{DynamicResource TabItemVerticalPipeHeight}"
|
||||
Margin="6,0,0,0"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Center"
|
||||
Background="{DynamicResource TabItemHeaderSelectedPipeFill}"
|
||||
IsVisible="False"
|
||||
CornerRadius="4"/>
|
||||
<ContentPresenter Name="PART_ContentPresenter"
|
||||
Padding="{TemplateBinding Padding}"
|
||||
Margin="0"
|
||||
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||
Content="{TemplateBinding Header}"
|
||||
ContentTemplate="{TemplateBinding HeaderTemplate}"
|
||||
TextElement.FontFamily="{TemplateBinding FontFamily}"
|
||||
TextElement.FontSize="{TemplateBinding FontSize}"
|
||||
TextElement.FontWeight="{TemplateBinding FontWeight}" />
|
||||
</Panel>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter>
|
||||
|
||||
<Style Selector="^:pointerover">
|
||||
<Setter Property="Background" Value="{DynamicResource ThemeControlHighlightMidBrush}"/>
|
||||
|
||||
<Style Selector="^ /template/ Border#PART_LayoutRoot">
|
||||
<Setter Property="Background" Value="{DynamicResource HamburgerChromeLowColor}" />
|
||||
<Setter Property="BoxShadow" Value="{StaticResource NavigationItemShadow}" />
|
||||
<Setter Property="TextElement.Foreground" Value="{DynamicResource HamburgerBaseHighColor}" />
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^:selected">
|
||||
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush4}"/>
|
||||
|
||||
<Style Selector="^ /template/ Border#PART_SelectedPipe">
|
||||
<Setter Property="IsVisible" Value="True" />
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^:pressed /template/ Border#PART_LayoutRoot">
|
||||
<Setter Property="Border.Background" Value="{DynamicResource HamburgerChromeLowColor}" />
|
||||
<Setter Property="Border.BoxShadow" Value="{StaticResource NavigationItemShadow}" />
|
||||
<Setter Property="TextElement.Foreground" Value="{DynamicResource HamburgerBaseHighColor}" />
|
||||
</Style>
|
||||
</ControlTheme>
|
||||
|
||||
<!-- HamburgerMenu -->
|
||||
<ControlTheme x:Key="{x:Type catalog:HamburgerMenu}" TargetType="catalog:HamburgerMenu">
|
||||
<Setter Property="Padding" Value="12 8 4 0" />
|
||||
<Setter Property="PaneBackground" Value="{DynamicResource HamburgerChromeMediumColor}" />
|
||||
<Setter Property="Background" Value="{DynamicResource HamburgerChromeMediumColor}" />
|
||||
<Setter Property="ContentBackground" Value="{DynamicResource HamburgerAltHighColor}" />
|
||||
<Setter Property="ItemContainerTheme" Value="{StaticResource HamburgerMenuTabItem}"/>
|
||||
<Setter Property="TabStripPlacement" Value="Left" />
|
||||
<Setter Property="Template">
|
||||
<ControlTemplate>
|
||||
<Panel Background="{TemplateBinding PaneBackground}">
|
||||
<SplitView x:Name="PART_NavigationPane"
|
||||
CompactPaneLength="{StaticResource PaneCompactWidth}"
|
||||
DisplayMode="Inline"
|
||||
IsPaneOpen="True"
|
||||
OpenPaneLength="{StaticResource PaneExpandWidth}"
|
||||
PaneBackground="Transparent">
|
||||
<SplitView.Pane>
|
||||
<Grid Margin="0,0,1,5" RowDefinitions="Auto, *, Auto">
|
||||
<Panel Height="{StaticResource HeaderHeight}" />
|
||||
<ScrollViewer x:Name="PART_ScrollViewer"
|
||||
Grid.Row="1"
|
||||
HorizontalAlignment="Stretch"
|
||||
HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
|
||||
VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
|
||||
<ItemsPresenter Name="PART_ItemsPresenter"
|
||||
HorizontalAlignment="Stretch">
|
||||
<ItemsPresenter.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<StackPanel x:Name="HamburgerItemsPanel"
|
||||
Margin="0,2" Orientation="Vertical" />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsPresenter.ItemsPanel>
|
||||
</ItemsPresenter>
|
||||
</ScrollViewer>
|
||||
<Button x:Name="SettingsButton"
|
||||
Grid.Row="2"
|
||||
Theme="{StaticResource NavigationButton}"
|
||||
Content="Settings"
|
||||
Flyout="{TemplateBinding (FlyoutBase.AttachedFlyout)}"
|
||||
IsVisible="{Binding $parent[TabControl].(FlyoutBase.AttachedFlyout), Converter={x:Static ObjectConverters.IsNotNull}}" />
|
||||
</Grid>
|
||||
</SplitView.Pane>
|
||||
<SplitView.Content>
|
||||
<DockPanel>
|
||||
<Border Height="{StaticResource HeaderHeight}" DockPanel.Dock="Top">
|
||||
<TextBlock x:Name="HeaderHolder"
|
||||
VerticalAlignment="Center"
|
||||
Classes="h1"
|
||||
Margin="{StaticResource HeaderMarginExpandedPane}"
|
||||
Text="{Binding $parent[TabControl].SelectedItem.(TabItem.Header), FallbackValue=''}">
|
||||
<TextBlock.Transitions>
|
||||
<Transitions>
|
||||
<ThicknessTransition Easing="{StaticResource SplitViewPaneAnimationEasing}"
|
||||
Property="Margin"
|
||||
Duration="{StaticResource SplitViewPaneAnimationCloseDuration}" />
|
||||
</Transitions>
|
||||
</TextBlock.Transitions>
|
||||
</TextBlock>
|
||||
</Border>
|
||||
<Border x:Name="BackgroundBorder">
|
||||
<Border.Transitions>
|
||||
<Transitions>
|
||||
<CornerRadiusTransition Property="CornerRadius" Duration="{StaticResource SplitViewPaneAnimationCloseDuration}" />
|
||||
</Transitions>
|
||||
</Border.Transitions>
|
||||
<ScrollViewer x:Name="HamburgerContentScroller"
|
||||
HorizontalScrollBarVisibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedItem.(ScrollViewer.HorizontalScrollBarVisibility)}"
|
||||
VerticalScrollBarVisibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedItem.(ScrollViewer.VerticalScrollBarVisibility)}">
|
||||
<ContentPresenter Name="PART_SelectedContentHost"
|
||||
Background="Transparent"
|
||||
Padding="{TemplateBinding Padding}"
|
||||
Content="{TemplateBinding SelectedContent}"
|
||||
ContentTemplate="{TemplateBinding SelectedContentTemplate}" />
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</DockPanel>
|
||||
</SplitView.Content>
|
||||
</SplitView>
|
||||
<ToggleButton x:Name="HamburgerMenuButton"
|
||||
Width="{StaticResource PaneCompactWidth}"
|
||||
Height="{StaticResource HamburgerMenuButtonHeight}"
|
||||
Margin="4,2,0,0"
|
||||
Padding="0"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Top"
|
||||
HorizontalContentAlignment="Center"
|
||||
Theme="{StaticResource NavigationButton}"
|
||||
CornerRadius="4"
|
||||
IsChecked="{Binding #PART_NavigationPane.IsPaneOpen, Mode=TwoWay}">
|
||||
<PathIcon Data="M3 17h18a1 1 0 0 1 .117 1.993L21 19H3a1 1 0 0 1-.117-1.993L3 17h18H3Zm0-6 18-.002a1 1 0 0 1 .117 1.993l-.117.007L3 13a1 1 0 0 1-.117-1.993L3 11l18-.002L3 11Zm0-6h18a1 1 0 0 1 .117 1.993L21 7H3a1 1 0 0 1-.117-1.993L3 5h18H3Z" Foreground="{TemplateBinding Foreground}" />
|
||||
</ToggleButton>
|
||||
</Panel>
|
||||
</ControlTemplate>
|
||||
</Setter>
|
||||
|
||||
<Style Selector="^ /template/ SplitView[IsPaneOpen=True] TextBlock#HeaderHolder">
|
||||
<Setter Property="Margin" Value="{StaticResource HeaderMarginCollapsedPane}" />
|
||||
</Style>
|
||||
<Style Selector="^ /template/ SplitView[DisplayMode=Overlay][IsPaneOpen=True] TextBlock#HeaderHolder">
|
||||
<Setter Property="Margin" Value="{StaticResource HeaderMarginExpandedOverlayPane}" />
|
||||
</Style>
|
||||
<Style Selector="^ /template/ SplitView[DisplayMode=Overlay]">
|
||||
<Setter Property="PaneBackground" Value="{TemplateBinding PaneBackground}" />
|
||||
</Style>
|
||||
<Style Selector="^ /template/ SplitView[DisplayMode=Overlay]">
|
||||
<Setter Property="Background" Value="{Binding $parent[catalog:HamburgerMenu].ContentBackground}" />
|
||||
</Style>
|
||||
<Style Selector="^ /template/ SplitView[DisplayMode=Inline] Border#BackgroundBorder">
|
||||
<Setter Property="Background" Value="{Binding $parent[catalog:HamburgerMenu].ContentBackground}" />
|
||||
<Setter Property="BoxShadow" Value="{StaticResource NavigationContentShadow}" />
|
||||
</Style>
|
||||
<Style Selector="^ /template/ SplitView[DisplayMode=Inline][IsPaneOpen=True] Border#BackgroundBorder">
|
||||
<Setter Property="CornerRadius" Value="8 0 0 0" />
|
||||
</Style>
|
||||
</ControlTheme>
|
||||
|
||||
</ResourceDictionary>
|