New solution architecture using .NET MAUI

This commit is contained in:
Javier Suárez Ruiz 2021-04-23 19:24:20 +02:00
Родитель 578c07d7ba
Коммит b830d60dbc
173 изменённых файлов: 22398 добавлений и 20896 удалений

3
.gitmodules поставляемый
Просмотреть файл

@ -0,0 +1,3 @@
[submodule "src/maui"]
path = src/maui
url = https://github.com/dotnet/maui

14
NuGet.config Normal file
Просмотреть файл

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="dotnet-eng" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" protocolVersion="3" />
<add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" protocolVersion="3" />
<add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
<add key="xamarin" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/xamarin-impl/nuget/v3/index.json" />
</packageSources>
<activePackageSource>
<add key="All" value="(Aggregate source)" />
</activePackageSource>
<disabledPackageSources />
</configuration>

6
global.json Normal file
Просмотреть файл

@ -0,0 +1,6 @@
{
"msbuild-sdks": {
"MSBuild.Sdk.Extras": "3.0.23",
"Microsoft.Build.NoTargets": "2.0.1"
}
}

Просмотреть файл

@ -1,121 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.809.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsControls", "GraphicsControls\GraphicsControls.csproj", "{474A33AE-06A4-4219-9545-17751EBF3F84}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{4F0017DB-8A18-4153-A129-782B29DECF51}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sample", "Sample", "{465D03D3-BA73-4E52-BBEA-02DC54647BC6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsControls.Sample.iOS", "GraphicsControls.Sample.iOS\GraphicsControls.Sample.iOS.csproj", "{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsControls.Sample", "GraphicsControls.Sample\GraphicsControls.Sample.csproj", "{41B421AF-5731-4B8F-BEDE-96155879D929}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsControls.Sample.macOS", "GraphicsControls.Sample.macOS\GraphicsControls.Sample.macOS.csproj", "{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsControls.Sample.Android", "GraphicsControls.Sample.Android\GraphicsControls.Sample.Android.csproj", "{2EE53371-EFD9-4304-A231-93E6F75DBC81}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A6CE0398-E304-48E5-955B-DA2F77D6B940}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsControls.Tests", "GraphicsControls.Tests\GraphicsControls.Tests.csproj", "{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|iPhone = Debug|iPhone
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|Any CPU = Release|Any CPU
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{474A33AE-06A4-4219-9545-17751EBF3F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Debug|Any CPU.Build.0 = Debug|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Debug|iPhone.Build.0 = Debug|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Release|Any CPU.ActiveCfg = Release|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Release|Any CPU.Build.0 = Release|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Release|iPhone.ActiveCfg = Release|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Release|iPhone.Build.0 = Release|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{474A33AE-06A4-4219-9545-17751EBF3F84}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Debug|iPhone.ActiveCfg = Debug|iPhone
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Debug|iPhone.Build.0 = Debug|iPhone
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Release|iPhone.ActiveCfg = Release|iPhone
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Release|iPhone.Build.0 = Release|iPhone
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{41B421AF-5731-4B8F-BEDE-96155879D929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Debug|iPhone.Build.0 = Debug|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|Any CPU.Build.0 = Release|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|iPhone.ActiveCfg = Release|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|iPhone.Build.0 = Release|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Debug|iPhone.Build.0 = Debug|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Release|Any CPU.Build.0 = Release|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Release|iPhone.ActiveCfg = Release|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Release|iPhone.Build.0 = Release|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhone.Build.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|Any CPU.Build.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhone.ActiveCfg = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhone.Build.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Debug|iPhone.Build.0 = Debug|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Release|Any CPU.Build.0 = Release|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Release|iPhone.ActiveCfg = Release|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Release|iPhone.Build.0 = Release|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{474A33AE-06A4-4219-9545-17751EBF3F84} = {4F0017DB-8A18-4153-A129-782B29DECF51}
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{41B421AF-5731-4B8F-BEDE-96155879D929} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{C351DAA7-20C0-474D-B610-F00C8BE5B0F1} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{2EE53371-EFD9-4304-A231-93E6F75DBC81} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{AAE3033F-3E70-4CAB-A66E-96EDBE4AAA33} = {A6CE0398-E304-48E5-955B-DA2F77D6B940}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {475B4FFA-17B6-449C-9D09-DE4E2B0D2F4B}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -54,14 +54,11 @@
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="4.8.0.1687" />
<PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainActivity.cs" />
<Compile Include="Resources\Resource.designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="MainApplication.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\AboutResources.txt" />
@ -98,6 +95,18 @@
<Project>{474A33AE-06A4-4219-9545-17751EBF3F84}</Project>
<Name>GraphicsControls</Name>
</ProjectReference>
<ProjectReference Include="..\maui\src\Core\src\Core.csproj">
<Project>{8EF59C96-7972-41C6-830B-59FC81B9AD7B}</Project>
<Name>Core</Name>
</ProjectReference>
<ProjectReference Include="..\maui\src\Compatibility\Core\src\Android\Compatibility.Android.csproj">
<Project>{F602BE45-8096-4A38-BF1B-28EF078E51E1}</Project>
<Name>Compatibility.Android</Name>
</ProjectReference>
<ProjectReference Include="..\maui\src\Compatibility\Core\src\Android.FormsViewGroup\Compatibility.Android.FormsViewGroup.csproj">
<Project>{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}</Project>
<Name>Compatibility.Android.FormsViewGroup</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
</Project>

Просмотреть файл

@ -1,7 +1,6 @@
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using Microsoft.Maui;
namespace GraphicsControls.Sample.Droid
{
@ -11,25 +10,7 @@ namespace GraphicsControls.Sample.Droid
Theme = "@style/MainTheme",
MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
public class MainActivity : MauiAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using Android.App;
using Android.Runtime;
using Microsoft.Maui;
using Microsoft.Maui.Graphics.Controls;
namespace GraphicsControls.Sample.Droid
{
[Application]
public class MainApplication : MauiApplication<Startup>
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership)
{
}
}
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,124 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{79952688-FF1B-4813-A7E7-97C15F73B534}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>GraphicsControls.Sample.GTK</RootNamespace>
<AssemblyName>GraphicsControls.Sample.GTK</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
<Reference Include="gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
<Reference Include="OpenTK, Version=3.0.1.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
<HintPath>..\packages\OpenTK.3.0.1\lib\net20\OpenTK.dll</HintPath>
</Reference>
<Reference Include="SkiaSharp, Version=2.80.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.2.80.2\lib\net462\SkiaSharp.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SkiaSharp.Views.Desktop.Common, Version=2.80.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.Views.Desktop.Common.2.80.2\lib\net462\SkiaSharp.Views.Desktop.Common.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SkiaSharp.Views.Gtk, Version=2.80.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.Views.Gtk2.2.80.2\lib\net462\SkiaSharp.Views.Gtk.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="webkit-sharp, Version=1.1.15.0, Culture=neutral, PublicKeyToken=eaa1d335d2e19745, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.Platform.GTK.4.8.0.1687\lib\net45\webkit-sharp.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.4.8.0.1687\lib\netstandard2.0\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.4.8.0.1687\lib\netstandard2.0\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform.GTK, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.Platform.GTK.4.8.0.1687\lib\net45\Xamarin.Forms.Platform.GTK.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Forms.4.8.0.1687\lib\netstandard2.0\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GraphicsControls.Sample\GraphicsControls.Sample.csproj">
<Project>{41b421af-5731-4b8f-bede-96155879d929}</Project>
<Name>GraphicsControls.Sample</Name>
</ProjectReference>
<ProjectReference Include="..\GraphicsControls\GraphicsControls.csproj">
<Project>{474a33ae-06a4-4219-9545-17751ebf3f84}</Project>
<Name>GraphicsControls</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="OpenTK.dll.config" />
<None Include="packages.config" />
<None Include="webkit-sharp.dll.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.props'))" />
<Error Condition="!Exists('..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.targets'))" />
<Error Condition="!Exists('..\packages\SkiaSharp.2.80.2\build\net462\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SkiaSharp.2.80.2\build\net462\SkiaSharp.targets'))" />
</Target>
<Import Project="..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.targets')" />
<Import Project="..\packages\SkiaSharp.2.80.2\build\net462\SkiaSharp.targets" Condition="Exists('..\packages\SkiaSharp.2.80.2\build\net462\SkiaSharp.targets')" />
</Project>

Просмотреть файл

@ -1,25 +0,0 @@
<configuration>
<dllmap os="linux" dll="opengl32.dll" target="libGL.so.1"/>
<dllmap os="linux" dll="glu32.dll" target="libGLU.so.1"/>
<dllmap os="linux" dll="openal32.dll" target="libopenal.so.1"/>
<dllmap os="linux" dll="alut.dll" target="libalut.so.0"/>
<dllmap os="linux" dll="opencl.dll" target="libOpenCL.so"/>
<dllmap os="linux" dll="libX11" target="libX11.so.6"/>
<dllmap os="linux" dll="libXi" target="libXi.so.6"/>
<dllmap os="linux" dll="SDL2.dll" target="libSDL2-2.0.so.0"/>
<dllmap os="osx" dll="opengl32.dll" target="/System/Library/Frameworks/OpenGL.framework/OpenGL"/>
<dllmap os="osx" dll="openal32.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
<dllmap os="osx" dll="alut.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
<dllmap os="osx" dll="libGLES.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="libGLESv1_CM.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="libGLESv2.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="opencl.dll" target="/System/Library/Frameworks/OpenCL.framework/OpenCL"/>
<dllmap os="osx" dll="SDL2.dll" target="libSDL2.dylib"/>
<!-- XQuartz compatibility (X11 on Mac) -->
<dllmap os="osx" dll="libGL.so.1" target="/usr/X11/lib/libGL.dylib"/>
<dllmap os="osx" dll="libX11" target="/usr/X11/lib/libX11.dylib"/>
<dllmap os="osx" dll="libXcursor.so.1" target="/usr/X11/lib/libXcursor.dylib"/>
<dllmap os="osx" dll="libXi" target="/usr/X11/lib/libXi.dylib"/>
<dllmap os="osx" dll="libXinerama" target="/usr/X11/lib/libXinerama.dylib"/>
<dllmap os="osx" dll="libXrandr.so.2" target="/usr/X11/lib/libXrandr.dylib"/>
</configuration>

Просмотреть файл

@ -1,28 +0,0 @@
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.GTK;
using Xamarin.Forms.Platform.GTK.Extensions;
namespace GraphicsControls.Sample.GTK
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Gtk.Application.Init();
Forms.Init();
var app = new App();
var window = new FormsWindow();
window.LoadApplication(app);
window.SetApplicationTitle("GraphicsControls");
//window.SetSize(800, 1000);
window.Show();
Gtk.Application.Run();
GraphicsControls.GTK.GraphicsViewRenderer.Init();
}
}
}

Просмотреть файл

@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("GraphicsControls.Sample.GTK")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GraphicsControls.Sample.GTK")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("79952688-ff1b-4813-a7e7-97c15f73b534")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="OpenTK" version="3.0.1" targetFramework="net471" />
<package id="SkiaSharp" version="2.80.2" targetFramework="net471" />
<package id="SkiaSharp.Views.Desktop.Common" version="2.80.2" targetFramework="net471" />
<package id="SkiaSharp.Views.Gtk2" version="2.80.2" targetFramework="net471" />
<package id="System.Buffers" version="4.4.0" targetFramework="net471" />
<package id="System.Memory" version="4.5.3" targetFramework="net471" />
<package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net471" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net471" />
<package id="Xamarin.Forms" version="4.8.0.1687" targetFramework="net471" />
<package id="Xamarin.Forms.Platform.GTK" version="4.8.0.1687" targetFramework="net471" />
</packages>

Просмотреть файл

@ -1,5 +0,0 @@
<configuration>
<dllmap dll="webkit-1.0" target="libwebkitgtk-1.0.0.dylib"/>
<dllmap dll="webkit-1.0" os="linux" target="libwebkitgtk-1.0.so.0"/>
<dllmap dll="webkit-1.0" os="windows" target="libwebkitgtk-1.0-0.dll"/>
</configuration>

Просмотреть файл

@ -1,19 +0,0 @@
<Project Sdk="Tizen.NET.Sdk/1.1.5">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>tizen40</TargetFramework>
<AssemblyName>GraphicsControls.Sample.Tizen</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="5.0.0.1905" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GraphicsControls.Sample\GraphicsControls.Sample.csproj" />
<ProjectReference Include="..\GraphicsControls\GraphicsControls.csproj" />
</ItemGroup>
</Project>

Просмотреть файл

@ -1,30 +0,0 @@
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Tizen;
using System.Graphics.Skia.Views;
namespace GraphicsControls.Sample.Tizen
{
class Program : FormsApplication
{
protected override void OnCreate()
{
base.OnCreate();
var app = new App();
app.UserAppTheme = OSAppTheme.Light;
LoadApplication(app);
}
static void Main(string[] args)
{
var app = new Program();
var option = new InitializationOptions(app)
{
DisplayResolutionUnit = DisplayResolutionUnit.DP(true),
UseSkiaSharp = true
};
Forms.Init(option);
app.Run(args);
}
}
}

Двоичные данные
src/GraphicsControls.Sample.Tizen/res/image.jpg

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 253 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 9.9 KiB

Просмотреть файл

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns="http://tizen.org/ns/packages" api-version="4" package="org.tizen.example.GraphicsControls.Sample.Tizen" version="1.0.0">
<profile name="common" />
<ui-application appid="org.tizen.example.GraphicsControls.Sample.Tizen"
exec="GraphicsControls.Sample.Tizen.dll"
type="dotnet"
multiple="false"
taskmanage="true"
nodisplay="false"
launch_mode="single"
>
<label>GraphicsControls.Sample.Tizen</label>
<icon>GraphicsControls.Sample.Tizen.png</icon>
<metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />
</ui-application>
</manifest>

Просмотреть файл

@ -1,28 +1,11 @@
using Foundation;
using UIKit;
using Microsoft.Maui;
using Microsoft.Maui.Graphics.Controls;
namespace GraphicsControls.Sample.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 : Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
//
// This method is invoked when the application has loaded and is ready to run. In this
// method you should instantiate the window, load the UI into it and then make the window
// visible.
//
// You have 17 seconds to return from this method, or iOS will terminate your application.
//
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Xamarin.Forms.FormsMaterial.Init();
Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
}
}
public class AppDelegate : MauiUIApplicationDelegate<Startup>
{
}
}

Просмотреть файл

@ -122,13 +122,6 @@
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="4.8.0.1687" />
<PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
<PackageReference Include="Xamarin.Forms.Visual.Material">
<Version>4.8.0.1687</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GraphicsControls.Sample\GraphicsControls.Sample.csproj">
<Project>{41B421AF-5731-4B8F-BEDE-96155879D929}</Project>
@ -138,6 +131,14 @@
<Project>{474A33AE-06A4-4219-9545-17751EBF3F84}</Project>
<Name>GraphicsControls</Name>
</ProjectReference>
<ProjectReference Include="..\maui\src\Core\src\Core.csproj">
<Project>{8EF59C96-7972-41C6-830B-59FC81B9AD7B}</Project>
<Name>Core</Name>
</ProjectReference>
<ProjectReference Include="..\maui\src\Compatibility\Core\src\iOS\Compatibility.iOS.csproj">
<Project>{271193C1-6E7C-429C-A36D-3F1BE5267231}</Project>
<Name>Compatibility.iOS</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\image.jpg" />

Просмотреть файл

@ -1,44 +0,0 @@
using AppKit;
using CoreGraphics;
using Foundation;
using Xamarin.Forms;
using Xamarin.Forms.Platform.MacOS;
namespace GraphicsControls.Sample.macOS
{
[Register("AppDelegate")]
public class AppDelegate : FormsApplicationDelegate
{
readonly NSWindow _window;
public AppDelegate()
{
var style = NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Titled;
var rect = new CGRect(500, 1000, 1024, 768);
_window = new NSWindow(rect, style, NSBackingStore.Buffered, false)
{
Title = "GraphicsControls",
TitleVisibility = NSWindowTitleVisibility.Hidden
};
}
public override NSWindow MainWindow
{
get { return _window; }
}
public override void DidFinishLaunching(NSNotification notification)
{
Forms.Init();
LoadApplication(new App());
base.DidFinishLaunching(notification);
}
public override void WillTerminate(NSNotification notification)
{
// Insert code here to tear down your application
}
}
}

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.9 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 711 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 58 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.3 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 58 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 174 KiB

Просмотреть файл

@ -1,68 +0,0 @@
{
"images": [
{
"filename": "AppIcon-16.png",
"size": "16x16",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-16@2x.png",
"size": "16x16",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-32.png",
"size": "32x32",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-32@2x.png",
"size": "32x32",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-128.png",
"size": "128x128",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-128@2x.png",
"size": "128x128",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-256.png",
"size": "256x256",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-256@2x.png",
"size": "256x256",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-512.png",
"size": "512x512",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-512@2x.png",
"size": "512x512",
"scale": "2x",
"idiom": "mac"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -1,6 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -1,6 +0,0 @@
<?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>
</dict>
</plist>

Просмотреть файл

@ -1,109 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C351DAA7-20C0-474D-B610-F00C8BE5B0F1}</ProjectGuid>
<ProjectTypeGuids>{A3F8F2AB-B479-4A4A-A458-A89E7DC349F1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Exe</OutputType>
<RootNamespace>GraphicsControls.Sample.macOS</RootNamespace>
<AssemblyName>GraphicsControls.Sample.macOS</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<TargetFrameworkIdentifier>Xamarin.Mac</TargetFrameworkIdentifier>
<MonoMacResourcePrefix>Resources</MonoMacResourcePrefix>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<EnableCodeSigning>false</EnableCodeSigning>
<CodeSigningKey>Mac Developer</CodeSigningKey>
<CreatePackage>false</CreatePackage>
<EnablePackageSigning>false</EnablePackageSigning>
<IncludeMonoRuntime>false</IncludeMonoRuntime>
<UseSGen>true</UseSGen>
<UseRefCounting>true</UseRefCounting>
<HttpClientHandler></HttpClientHandler>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<DefineConstants></DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<EnableCodeSigning>false</EnableCodeSigning>
<CreatePackage>true</CreatePackage>
<EnablePackageSigning>false</EnablePackageSigning>
<IncludeMonoRuntime>true</IncludeMonoRuntime>
<UseSGen>true</UseSGen>
<UseRefCounting>true</UseRefCounting>
<CodeSignEntitlements>Entitlements.plist</CodeSignEntitlements>
<LinkMode>SdkOnly</LinkMode>
<HttpClientHandler></HttpClientHandler>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.Mac" />
<Reference Include="Xamarin.Forms.Core">
<HintPath>..\packages\Xamarin.Forms.4.8.0.1687\lib\Xamarin.Mac\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform">
<HintPath>..\packages\Xamarin.Forms.4.8.0.1687\lib\Xamarin.Mac\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml">
<HintPath>..\packages\Xamarin.Forms.4.8.0.1687\lib\Xamarin.Mac\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Contents.json" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-128.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-128%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-16.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-16%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-256.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-256%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-32.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-32%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-512.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-512%402x.png" />
<ImageAsset Include="Assets.xcassets\Contents.json" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
<Compile Include="ViewController.cs" />
<Compile Include="ViewController.designer.cs">
<DependentUpon>ViewController.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<InterfaceDefinition Include="Main.storyboard" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GraphicsControls\GraphicsControls.csproj">
<Project>{474A33AE-06A4-4219-9545-17751EBF3F84}</Project>
<Name>GraphicsControls</Name>
</ProjectReference>
<ProjectReference Include="..\GraphicsControls.Sample\GraphicsControls.Sample.csproj">
<Project>{41B421AF-5731-4B8F-BEDE-96155879D929}</Project>
<Name>GraphicsControls.Sample</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Mac\Xamarin.Mac.CSharp.targets" />
<Import Project="..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.4.8.0.1687\build\Xamarin.Forms.targets')" />
</Project>

Просмотреть файл

@ -1,32 +0,0 @@
<?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>CFBundleName</key>
<string>GraphicsControls.Sample.macOS</string>
<key>CFBundleIdentifier</key>
<string>com.companyname.GraphicsControls-Sample-macOS</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>10.14</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSHumanReadableCopyright</key>
<string></string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/AppIcon.appiconset</string>
</dict>
</plist>

Просмотреть файл

@ -1,14 +0,0 @@
using AppKit;
namespace GraphicsControls.Sample.macOS
{
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
NSApplication.SharedApplication.Delegate = new AppDelegate();
NSApplication.Main(args);
}
}
}

Просмотреть файл

@ -1,719 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17701"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="GraphicsControls.Sample.macOS" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="GraphicsControls.Sample.macOS" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About GraphicsControls.Sample.macOS" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide GraphicsControls.Sample.macOS" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit GraphicsControls.Sample.macOS" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="Ady-hI-5gd" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="Ady-hI-5gd" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="Ady-hI-5gd" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="Ady-hI-5gd" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="Ady-hI-5gd" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="Ady-hI-5gd" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="Ady-hI-5gd" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="Ady-hI-5gd" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="Ady-hI-5gd" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="Ady-hI-5gd" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="Ady-hI-5gd" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="Ady-hI-5gd" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="Ady-hI-5gd" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="Ady-hI-5gd" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="Ady-hI-5gd" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="Ady-hI-5gd" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="Ady-hI-5gd" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="Ady-hI-5gd" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="Ady-hI-5gd" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="Ady-hI-5gd" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="Ady-hI-5gd" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="Ady-hI-5gd" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="Ady-hI-5gd" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="Ady-hI-5gd" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="Ady-hI-5gd" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="Ady-hI-5gd" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="Ady-hI-5gd" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="Ady-hI-5gd" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="Ady-hI-5gd" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="Ady-hI-5gd" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="Ady-hI-5gd" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="Ady-hI-5gd" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="Ady-hI-5gd" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="Ady-hI-5gd" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="Ady-hI-5gd" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="Ady-hI-5gd" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="Ady-hI-5gd" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="Ady-hI-5gd" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="Ady-hI-5gd" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="Ady-hI-5gd" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="Ady-hI-5gd" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="Ady-hI-5gd" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="Ady-hI-5gd" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="Ady-hI-5gd" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="Ady-hI-5gd" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="Ady-hI-5gd" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="Ady-hI-5gd" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="Ady-hI-5gd" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="Ady-hI-5gd" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="Ady-hI-5gd" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="Ady-hI-5gd" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="Ady-hI-5gd" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="Ady-hI-5gd" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="Ady-hI-5gd" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="Ady-hI-5gd" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="Ady-hI-5gd" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="Ady-hI-5gd" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="Ady-hI-5gd" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="Ady-hI-5gd" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="Ady-hI-5gd" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="Ady-hI-5gd" id="pQI-g3-MTW"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
<menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleSidebar:" target="Ady-hI-5gd" id="iwa-gc-5KM"/>
</connections>
</menuItem>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="Ady-hI-5gd" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="Ady-hI-5gd" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="GraphicsControls.Sample.macOS Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="0.0"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="480" height="270"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<connections>
<outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
</connections>
</window>
<connections>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="250"/>
</scene>
<!--View Controller-->
<scene sceneID="hIz-AP-VOD">
<objects>
<viewController id="XfG-lQ-9wD" customClass="ViewController" sceneMemberID="viewController">
<view key="view" wantsLayer="YES" id="m2S-Jp-Qdl">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask"/>
</view>
</viewController>
<customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="655"/>
</scene>
</scenes>
</document>

Просмотреть файл

@ -1,33 +0,0 @@
using System;
using AppKit;
using Foundation;
namespace GraphicsControls.Sample.macOS
{
public partial class ViewController : NSViewController
{
public ViewController(IntPtr handle) : base(handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
// Do any additional setup after loading the view.
}
public override NSObject RepresentedObject
{
get
{
return base.RepresentedObject;
}
set
{
base.RepresentedObject = value;
// Update the view, if already loaded.
}
}
}
}

Просмотреть файл

@ -1,18 +0,0 @@
// WARNING
//
// This file has been generated automatically by Xamarin Studio to store outlets and
// actions made in the UI designer. If it is removed, they will be lost.
// Manual changes to this file may not be handled correctly.
//
using Foundation;
namespace GraphicsControls.Sample.macOS
{
[Register("ViewController")]
partial class ViewController
{
void ReleaseDesignerOutlets()
{
}
}
}

Просмотреть файл

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Xamarin.Forms" version="4.8.0.1687" targetFramework="xamarinmac20" />
</packages>

Просмотреть файл

@ -0,0 +1,17 @@
using Microsoft.Maui.Controls;
namespace Microsoft.Maui.Graphics.Controls
{
public class MyApp : Application
{
public MyApp()
{
}
public override IWindow CreateWindow(IActivationState activationState)
{
return new MainWindow();
}
}
}

Просмотреть файл

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="GraphicsControls.Sample.App">
<Application.Resources>
</Application.Resources>
</Application>

Просмотреть файл

@ -1,31 +0,0 @@
using Xamarin.Forms;
namespace GraphicsControls.Sample
{
public partial class App : Application
{
public App()
{
InitializeComponent();
if (Device.RuntimePlatform == Device.GTK)
MainPage = new OnlyDrawnControlsPage();
else
MainPage = new MixedControlsPage();
//MainPage = new NavigationPage(new BenchmarkPage());
}
protected override void OnStart()
{
}
protected override void OnSleep()
{
}
protected override void OnResume()
{
}
}
}

Просмотреть файл

@ -1,3 +0,0 @@
using Xamarin.Forms.Xaml;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]

Просмотреть файл

@ -1,48 +0,0 @@
using System;
using Xamarin.Forms;
namespace GraphicsControls.Sample
{
public static class BenchmarkSettings
{
public static int NumberOfViews { get; } = 10;
}
public class BenchmarkPage : ContentPage
{
public BenchmarkPage()
{
Title = "GraphicsControls Benchmark";
var layout = new StackLayout();
var nativeButton = new Button
{
Text = "Use Native Controls"
};
var drawnButton = new Button
{
Text = "Use Drawn Controls"
};
layout.Children.Add(nativeButton);
layout.Children.Add(drawnButton);
Content = layout;
nativeButton.Clicked += OnNativeButtonClicked;
drawnButton.Clicked += OnDrawnButtonClicked;
}
void OnNativeButtonClicked(object sender, EventArgs e)
{
Navigation.PushAsync(new NativeBenchmarkPage());
}
void OnDrawnButtonClicked(object sender, EventArgs e)
{
Navigation.PushAsync(new DrawnBenchmarkPage());
}
}
}

Просмотреть файл

@ -1,50 +0,0 @@
using System.Diagnostics;
using Xamarin.Forms;
namespace GraphicsControls.Sample
{
public class DrawnBenchmarkPage : ContentPage
{
readonly Stopwatch _stopwatch;
readonly Label _infoLabel;
public DrawnBenchmarkPage()
{
Title = "Use Drawn Controls";
_stopwatch = new Stopwatch();
_stopwatch.Start();
var scrollView = new ScrollView();
var layout = new StackLayout();
_infoLabel = new Label
{
FontSize = 36,
HorizontalOptions = LayoutOptions.Center
};
layout.Children.Add(_infoLabel);
for (int i = 0; i < BenchmarkSettings.NumberOfViews; i++)
{
var drawnButton = new Button { VisualType = VisualType.Material, Text = $"Button {i + 1}" };
layout.Children.Add(drawnButton);
}
scrollView.Content = layout;
Content = scrollView;
}
protected override void OnAppearing()
{
base.OnAppearing();
_stopwatch.Stop();
_infoLabel.Text = $"{_stopwatch.ElapsedMilliseconds} ms";
}
}
}

Просмотреть файл

@ -1,50 +0,0 @@
using System.Diagnostics;
using Xamarin.Forms;
namespace GraphicsControls.Sample
{
public class NativeBenchmarkPage : ContentPage
{
readonly Stopwatch _stopwatch;
readonly Label _infoLabel;
public NativeBenchmarkPage()
{
Title = "Use Native Controls";
_stopwatch = new Stopwatch();
_stopwatch.Start();
var scrollView = new ScrollView();
var layout = new StackLayout();
_infoLabel = new Label
{
FontSize = 36,
HorizontalOptions = LayoutOptions.Center
};
layout.Children.Add(_infoLabel);
for (int i = 0; i < BenchmarkSettings.NumberOfViews; i++)
{
var drawnButton = new Xamarin.Forms.Button { Visual = VisualMarker.Material, Text = $"Button {i + 1}" };
layout.Children.Add(drawnButton);
}
scrollView.Content = layout;
Content = scrollView;
}
protected override void OnAppearing()
{
base.OnAppearing();
_stopwatch.Stop();
_infoLabel.Text = $"{_stopwatch.ElapsedMilliseconds} ms";
}
}
}

Просмотреть файл

@ -1,33 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="MSBuild.Sdk.Extras">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFrameworks>MonoAndroid10.0;Xamarin.iOS10</TargetFrameworks>
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>portable</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="4.8.0.1687" />
<PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GraphicsControls\GraphicsControls.csproj" />
<ProjectReference Include="..\maui\src\Core\src\Core.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Benchmark\" />
<ItemGroup Condition="$(TargetFramework.StartsWith('Xamarin.iOS')) == true ">
<ProjectReference Include="..\maui\src\Compatibility\Core\src\iOS\Compatibility.iOS.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="MixedControlsPage.xaml.cs">
<DependentUpon>MixedControlsPage.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="OnlyDrawnControlsPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<ItemGroup Condition="$(TargetFramework.StartsWith('MonoAndroid')) == true ">
<ProjectReference Include="..\maui\src\Compatibility\Core\src\Android\Compatibility.Android.csproj" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,18 @@
using Microsoft.Maui.Controls;
namespace Microsoft.Maui.Graphics.Controls
{
public class MainPage : ContentPage, IPage
{
public MainPage()
{
BackgroundColor = Colors.White;
Content = new Label
{
HorizontalTextAlignment = TextAlignment.Center,
Text = "Microsoft.Maui.Graphics.Controls",
TextColor = Colors.Black
};
}
}
}

Просмотреть файл

@ -0,0 +1,14 @@
namespace Microsoft.Maui.Graphics.Controls
{
public class MainWindow : IWindow
{
public MainWindow()
{
Page = new MainPage();
}
public IPage Page { get; set; }
public IMauiContext MauiContext { get; set; }
}
}

Просмотреть файл

@ -1,173 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:graphics="clr-namespace:GraphicsControls;assembly=GraphicsControls"
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
x:Class="GraphicsControls.Sample.MixedControlsPage"
ios:Page.UseSafeArea="true"
BackgroundColor="White"
Title="GraphicsControls">
<ScrollView
BackgroundColor="{AppThemeBinding Light=White, Dark=Black}">
<StackLayout
Padding="12">
<graphics:BoxView
HeightRequest="100"
CornerRadius="12"
Color="LightSkyBlue"/>
<graphics:Frame
HeightRequest="100"
BorderColor="DarkBlue"
BackgroundColor="LightBlue"
CornerRadius="12, 0, 0, 24"
HasShadow="True">
<Grid>
<Label
HorizontalOptions="Center"
VerticalOptions="Center"
FontSize="Large"
Text="Frame"/>
</Grid>
</graphics:Frame>
<Label
Text="Cupertino"
FontSize="Large"
Margin="0, 12, 0, 0"/>
<graphics:ActivityIndicator
VisualType="Cupertino"
IsRunning="True"
HorizontalOptions="Center"/>
<graphics:Button
VisualType="Cupertino"
Text="Cupertino Button"
Clicked="OnButtonClicked"/>
<graphics:CheckBox
VisualType="Cupertino"
Text="CheckBox"/>
<graphics:DatePicker
VisualType="Cupertino"
MinimumDate="01/01/2021"
MaximumDate="12/31/2021"
Date="01/02/2021"/>
<graphics:Editor
VisualType="Cupertino"
Placeholder="Placeholder"/>
<graphics:Entry
VisualType="Cupertino"
Placeholder="Placeholder"/>
<graphics:ProgressBar
VisualType="Cupertino"
Progress="0.25"/>
<graphics:RadioButton
VisualType="Cupertino"
IsChecked="True"/>
<graphics:Slider
VisualType="Cupertino"
Minimum="0"
Maximum="10"
Value="5"/>
<graphics:Stepper
VisualType="Cupertino"
Minimum="0"
Maximum="100"
Value="50"/>
<graphics:Switch
VisualType="Cupertino"/>
<graphics:TimePicker
VisualType="Cupertino"/>
<Label
Text="Fluent"
FontSize="Large"
Margin="0, 12, 0, 0"/>
<graphics:ActivityIndicator
VisualType="Fluent"
IsRunning="True"
HorizontalOptions="Center"/>
<graphics:Button
VisualType="Fluent"
Text="Fluent Button"
Clicked="OnButtonClicked"/>
<graphics:CheckBox
VisualType="Fluent"
IsChecked="True"
Text="CheckBox"/>
<graphics:DatePicker
VisualType="Fluent"
MinimumDate="01/01/2021"
MaximumDate="12/31/2021"
Date="01/02/2021"/>
<graphics:Editor
VisualType="Fluent"
Placeholder="Placeholder"/>
<graphics:Entry
VisualType="Fluent"
Placeholder="Placeholder"/>
<graphics:ProgressBar
VisualType="Fluent"
Progress="0.25"/>
<graphics:RadioButton
VisualType="Fluent"
IsChecked="True"/>
<graphics:Slider
VisualType="Fluent"
Minimum="0"
Maximum="10"
Value="5"/>
<graphics:Stepper
VisualType="Fluent"
Minimum="0"
Maximum="100"
Value="50"/>
<graphics:Switch
VisualType="Fluent"/>
<graphics:TimePicker
VisualType="Fluent"/>
<Label
Text="Material"
FontSize="Large"
Margin="0, 12, 0, 0"/>
<graphics:ActivityIndicator
VisualType="Material"
IsRunning="True"
HorizontalOptions="Center"/>
<graphics:Button
VisualType="Material"
Text="Material Button"
Clicked="OnButtonClicked"/>
<graphics:CheckBox
VisualType="Material"/>
<graphics:DatePicker
VisualType="Material"
MinimumDate="01/01/2021"
MaximumDate="12/31/2021"
Date="01/02/2021"/>
<graphics:Editor
VisualType="Material"
Placeholder="Placeholder"/>
<graphics:Entry
VisualType="Material"
Placeholder="Placeholder"/>
<graphics:ProgressBar
VisualType="Material"
Progress="0.25"/>
<graphics:RadioButton
VisualType="Material"
IsChecked="True"/>
<graphics:Slider
VisualType="Material"
Minimum="0"
Maximum="10"
Value="5"/>
<graphics:Stepper
VisualType="Material"
Minimum="0"
Maximum="100"
Value="50"/>
<graphics:Switch
VisualType="Material"/>
<graphics:TimePicker
VisualType="Material"/>
</StackLayout>
</ScrollView>
</ContentPage>

Просмотреть файл

@ -1,18 +0,0 @@
using System;
using Xamarin.Forms;
namespace GraphicsControls.Sample
{
public partial class MixedControlsPage : ContentPage
{
public MixedControlsPage()
{
InitializeComponent();
}
void OnButtonClicked(object sender, EventArgs e)
{
DisplayAlert("GraphicsControls", "Button Clicked", "Ok");
}
}
}

Просмотреть файл

@ -1,119 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:graphics="clr-namespace:GraphicsControls;assembly=GraphicsControls"
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
x:Class="GraphicsControls.Sample.OnlyDrawnControlsPage"
ios:Page.UseSafeArea="true"
Title="GraphicsControls">
<ScrollView
BackgroundColor="White">
<StackLayout
Padding="12">
<graphics:BoxView
HeightRequest="60"
CornerRadius="12"
Color="LightSkyBlue"/>
<Label
Text="Cupertino"
FontSize="Large"
Margin="0, 12, 0, 0"/>
<graphics:ActivityIndicator
VisualType="Cupertino"
IsRunning="True"
HorizontalOptions="Center"/>
<graphics:Button
VisualType="Cupertino"
Text="Cupertino Button"
Clicked="OnButtonClicked"/>
<graphics:CheckBox
VisualType="Cupertino"
Text="CheckBox"/>
<graphics:ProgressBar
VisualType="Cupertino"
Progress="0.25"/>
<graphics:RadioButton
VisualType="Cupertino"
IsChecked="True"/>
<graphics:Slider
VisualType="Cupertino"
Minimum="0"
Maximum="10"
Value="5"/>
<graphics:Stepper
VisualType="Cupertino"
Minimum="0"
Maximum="100"
Value="50"/>
<graphics:Switch
VisualType="Cupertino"/>
<Label
Text="Fluent"
FontSize="Large"
Margin="0, 12, 0, 0"/>
<graphics:ActivityIndicator
VisualType="Fluent"
IsRunning="True"
HorizontalOptions="Center"/>
<graphics:Button
VisualType="Fluent"
Text="Fluent Button"
Clicked="OnButtonClicked"/>
<graphics:CheckBox
VisualType="Fluent"
IsChecked="True"
Text="CheckBox"/>
<graphics:ProgressBar
VisualType="Fluent"
Progress="0.25"/>
<graphics:RadioButton
VisualType="Fluent"
IsChecked="True"/>
<graphics:Slider
VisualType="Fluent"
Minimum="0"
Maximum="10"
Value="5"/>
<graphics:Stepper
VisualType="Fluent"
Minimum="0"
Maximum="100"
Value="50"/>
<graphics:Switch
VisualType="Fluent"/>
<Label
Text="Material"
FontSize="Large"
Margin="0, 12, 0, 0"/>
<graphics:ActivityIndicator
VisualType="Material"
IsRunning="True"
HorizontalOptions="Center"/>
<graphics:Button
VisualType="Material"
Text="Material Button"
Clicked="OnButtonClicked"/>
<graphics:CheckBox
VisualType="Material"/>
<graphics:ProgressBar
VisualType="Material"
Progress="0.25"/>
<graphics:RadioButton
VisualType="Material"
IsChecked="True"/>
<graphics:Slider
VisualType="Material"
Minimum="0"
Maximum="10"
Value="5"/>
<graphics:Stepper
VisualType="Material"
Minimum="0"
Maximum="100"
Value="50"/>
<graphics:Switch
VisualType="Material"/>
</StackLayout>
</ScrollView>
</ContentPage>

Просмотреть файл

@ -1,18 +0,0 @@
using System;
using Xamarin.Forms;
namespace GraphicsControls.Sample
{
public partial class OnlyDrawnControlsPage : ContentPage
{
public OnlyDrawnControlsPage()
{
InitializeComponent();
}
void OnButtonClicked(object sender, EventArgs e)
{
DisplayAlert("GraphicsControls", "Button Clicked", "Ok");
}
}
}

Просмотреть файл

@ -0,0 +1,15 @@
using Microsoft.Maui.Controls.Compatibility;
using Microsoft.Maui.Hosting;
namespace Microsoft.Maui.Graphics.Controls
{
public class Startup : IStartup
{
public void Configure(IAppHostBuilder appBuilder)
{
appBuilder
.UseFormsCompatibility()
.UseMauiApp<MyApp>();
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class ActivityIndicatorTests
{
public ActivityIndicatorTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ActivityIndicatorTest()
{
var activityIndicator = new ActivityIndicator();
Assert.NotNull(activityIndicator);
}
[Fact]
public void ActivityIndicatorLayersTest()
{
var activityIndicator = new ActivityIndicator();
int layersCount = activityIndicator.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
}
}

Просмотреть файл

@ -1,22 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class BoxViewTests
{
public BoxViewTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
var box = new BoxView
{
CornerRadius = 12
};
Assert.Equal(12, box.CornerRadius);
}
}
}

Просмотреть файл

@ -1,40 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class ButtonTests
{
public ButtonTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
Button button = new Button();
Assert.NotNull(button);
}
[Fact]
public void ButtonLayersTest()
{
var button = new Button();
int layersCount = button.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
[Fact]
public void TextTest()
{
string text = "Button";
Button button = new Button();
button.Text = text;
Assert.Equal(text, button.Text);
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class DatePickerTests
{
public DatePickerTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
var datePicker = new DatePicker();
Assert.NotNull(datePicker);
}
[Fact]
public void DatePickerLayersTest()
{
var datePicker = new DatePicker();
int layersCount = datePicker.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class EditorTests
{
public EditorTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
Editor editor = new Editor();
Assert.NotNull(editor);
}
[Fact]
public void EditorLayersTest()
{
var editor = new Editor();
int layersCount = editor.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class EntryTests
{
public EntryTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
Entry entry = new Entry();
Assert.NotNull(entry);
}
[Fact]
public void EntryLayersTest()
{
var entry = new Entry();
int layersCount = entry.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class FrameTests
{
public FrameTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
Frame frame = new Frame();
Assert.Null(frame.Content);
}
[Fact]
public void FrameLayersTest()
{
var frame = new Frame();
int layersCount = frame.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
}
}

Просмотреть файл

@ -1,52 +0,0 @@
using System.Linq;
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class GraphicsViewTests
{
public GraphicsViewTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void LayersTest()
{
var view = new Slider();
Assert.NotEmpty(view.GraphicsLayers);
}
[Fact]
public void AddLayerTest()
{
var view = new Slider();
var layersCount = view.GraphicsLayers.Count;
Assert.Equal(4, layersCount);
view.AddLayer("NewLayer");
var newLayersCount = view.GraphicsLayers.Count;
Assert.Equal(5, newLayersCount);
}
[Fact]
public void RemoveLayerTest()
{
var view = new Slider();
var layersCount = view.GraphicsLayers.Count;
Assert.Equal(4, layersCount);
view.RemoveLayer(Slider.Layers.TrackBackground);
var newLayersCount = view.GraphicsLayers.Count;
Assert.Equal(3, newLayersCount);
}
}
}

Просмотреть файл

@ -1,40 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class ProgressBarTests
{
public ProgressBarTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
ProgressBar progressBar = new ProgressBar();
Assert.NotNull(progressBar);
}
[Fact]
public void ProgressBarLayersTest()
{
var progressBar = new ProgressBar();
int layersCount = progressBar.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
[Fact]
public void ClampTest()
{
ProgressBar bar = new ProgressBar();
bar.Progress = 2;
Assert.Equal(1, bar.Progress);
bar.Progress = -1;
Assert.Equal(0, bar.Progress);
}
}
}

Просмотреть файл

@ -1,181 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class RadioButtonTests
{
public RadioButtonTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
var radioButton = new RadioButton();
Assert.NotNull(radioButton);
}
[Fact]
public void RadioButtonLayersTest()
{
var radioButton = new RadioButton();
int layersCount = radioButton.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
[Fact]
public void ThereCanBeOnlyOneTest()
{
var groupName = "foo";
var radioButton1 = new RadioButton() { GroupName = groupName };
var radioButton2 = new RadioButton() { GroupName = groupName };
var radioButton3 = new RadioButton() { GroupName = groupName };
var radioButton4 = new RadioButton() { GroupName = groupName };
var layout = new Grid();
layout.Children.Add(radioButton1);
layout.Children.Add(radioButton2);
layout.Children.Add(radioButton3);
layout.Children.Add(radioButton4);
radioButton1.IsChecked = true;
Assert.True(radioButton1.IsChecked);
Assert.False(radioButton2.IsChecked);
Assert.False(radioButton3.IsChecked);
Assert.False(radioButton4.IsChecked);
radioButton3.IsChecked = true;
Assert.False(radioButton1.IsChecked);
Assert.False(radioButton2.IsChecked);
Assert.True(radioButton3.IsChecked);
Assert.False(radioButton4.IsChecked);
}
[Fact]
public void ImpliedGroupTest()
{
var radioButton1 = new RadioButton();
var radioButton2 = new RadioButton();
var radioButton3 = new RadioButton();
var layout = new Grid();
layout.Children.Add(radioButton1);
layout.Children.Add(radioButton2);
layout.Children.Add(radioButton3);
radioButton1.IsChecked = true;
Assert.True(radioButton1.IsChecked);
Assert.False(radioButton2.IsChecked);
Assert.False(radioButton3.IsChecked);
radioButton3.IsChecked = true;
Assert.False(radioButton1.IsChecked);
Assert.False(radioButton2.IsChecked);
Assert.True(radioButton3.IsChecked);
}
[Fact]
public void ImpliedGroupDoesNotIncludeExplicitGroupsTest()
{
var radioButton1 = new RadioButton();
var radioButton2 = new RadioButton();
var radioButton3 = new RadioButton() { GroupName = "foo" };
var layout = new Grid();
layout.Children.Add(radioButton1);
layout.Children.Add(radioButton2);
layout.Children.Add(radioButton3);
radioButton1.IsChecked = true;
radioButton3.IsChecked = true;
Assert.True(radioButton1.IsChecked);
Assert.False(radioButton2.IsChecked);
Assert.True(radioButton3.IsChecked);
}
[Fact]
public void RemovingSelectedButtonFromGroupClearsSelectionTest()
{
var radioButton1 = new RadioButton() { GroupName = "foo" };
var radioButton2 = new RadioButton() { GroupName = "foo" };
var radioButton3 = new RadioButton() { GroupName = "foo" };
radioButton1.IsChecked = true;
radioButton2.IsChecked = true;
Assert.False(radioButton1.IsChecked);
Assert.True(radioButton2.IsChecked);
Assert.False(radioButton3.IsChecked);
radioButton2.GroupName = "bar";
Assert.False(radioButton1.IsChecked);
Assert.True(radioButton2.IsChecked);
Assert.False(radioButton3.IsChecked);
}
[Fact]
public void GroupControllerSelectionIsNullWhenSelectedButtonRemovedTest()
{
var layout = new Grid();
layout.SetValue(RadioButtonGroup.GroupNameProperty, "foo");
var selected = layout.GetValue(RadioButtonGroup.SelectedValueProperty);
Assert.Null(selected);
var radioButton1 = new RadioButton() { Value = 1 };
var radioButton2 = new RadioButton() { Value = 2 };
var radioButton3 = new RadioButton() { Value = 3 };
layout.Children.Add(radioButton1);
layout.Children.Add(radioButton2);
layout.Children.Add(radioButton3);
Assert.Null(selected);
radioButton1.IsChecked = true;
selected = layout.GetValue(RadioButtonGroup.SelectedValueProperty);
Assert.Equal(selected, 1);
Assert.Equal(radioButton1.GroupName, "foo");
radioButton1.GroupName = "bar";
selected = layout.GetValue(RadioButtonGroup.SelectedValueProperty);
Assert.Null(selected);
}
[Fact]
public void GroupSelectedValueUpdatesWhenSelectedButtonValueUpdatesTest()
{
var layout = new Grid();
layout.SetValue(RadioButtonGroup.GroupNameProperty, "foo");
var radioButton1 = new RadioButton() { Value = 1, IsChecked = true };
var radioButton2 = new RadioButton() { Value = 2 };
var radioButton3 = new RadioButton() { Value = 3 };
layout.Children.Add(radioButton1);
layout.Children.Add(radioButton2);
layout.Children.Add(radioButton3);
Assert.Equal(1, layout.GetValue(RadioButtonGroup.SelectedValueProperty));
radioButton1.Value = "updated";
Assert.Equal("updated", layout.GetValue(RadioButtonGroup.SelectedValueProperty));
}
}
}

Просмотреть файл

@ -1,94 +0,0 @@
using System;
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class SliderTests
{
public SliderTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
var slider = new Slider(20, 200, 50);
Assert.Equal(20, slider.Minimum);
Assert.Equal(200, slider.Maximum);
Assert.Equal(50, slider.Value);
}
[Fact]
public void SliderLayersTest()
{
var slider = new Slider();
int layersCount = slider.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
[Fact]
public void InvalidConstructorTest()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new Slider(10, 5, 10));
}
[Fact]
public void ConstructorClampingTest()
{
Slider slider = new Slider(50, 100, 0);
Assert.Equal(50, slider.Value);
}
[Fact]
public void MinValueClampTest()
{
Slider slider = new Slider(0, 100, 0);
slider.Minimum = 10;
Assert.Equal(10, slider.Value);
Assert.Equal(10, slider.Minimum);
}
[Fact]
public void MaxValueClampTest()
{
Slider slider = new Slider(0, 100, 100);
slider.Maximum = 10;
Assert.Equal(10, slider.Value);
Assert.Equal(10, slider.Maximum);
}
[Fact]
public void TestInvalidMaxValue()
{
var slider = new Slider();
Assert.Throws<ArgumentException>(() => slider.Maximum = slider.Minimum - 1);
}
[Fact]
public void InvalidMinValueTest()
{
var slider = new Slider();
Assert.Throws<ArgumentException>(() => slider.Minimum = slider.Maximum + 1);
}
[Fact]
public void ValueChangedTest()
{
var slider = new Slider();
var changed = false;
slider.ValueChanged += (sender, arg) => changed = true;
slider.Value += 1;
Assert.True(changed);
}
}
}

Просмотреть файл

@ -1,147 +0,0 @@
using System;
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class StepperTests
{
public StepperTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
var stepper = new Stepper(120, 200, 150, 2);
Assert.Equal(120, stepper.Minimum);
Assert.Equal(200, stepper.Maximum);
Assert.Equal(150, stepper.Value);
Assert.Equal(2, stepper.Increment);
}
[Fact]
public void StepperLayersTest()
{
var stepper = new Stepper();
int layersCount = stepper.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
[Fact]
public void InvalidConstructorTest()
{
Assert.Throws<ArgumentOutOfRangeException>(() => new Stepper(100, 0, 50, 1));
}
[Fact]
public void InvalidMaxValueTest()
{
Stepper stepper = new Stepper();
Assert.Throws<ArgumentException>(() => stepper.Maximum = stepper.Minimum - 1);
}
[Fact]
public void InvalidMinValueTest()
{
Stepper stepper = new Stepper();
Assert.Throws<ArgumentException>(() => stepper.Minimum = stepper.Maximum + 1);
}
[Fact]
public void ValidMaxValueTest()
{
Stepper stepper = new Stepper();
stepper.Maximum = 2000;
Assert.Equal(2000, stepper.Maximum);
}
[Fact]
public void ValidMinValueTest()
{
Stepper stepper = new Stepper();
stepper.Maximum = 2000;
stepper.Minimum = 200;
Assert.Equal(200, stepper.Minimum);
}
[Fact]
public void ConstructorClampValueTest()
{
Stepper stepper = new Stepper(0, 100, 2000, 1);
Assert.Equal(100, stepper.Value);
stepper = new Stepper(0, 100, -200, 1);
Assert.Equal(0, stepper.Value);
}
[Fact]
public void MinClampValueTest()
{
Stepper stepper = new Stepper();
bool minThrown = false;
bool valThrown = false;
stepper.PropertyChanged += (sender, e) =>
{
switch (e.PropertyName)
{
case "Minimum":
minThrown = true;
break;
case "Value":
Assert.False(minThrown);
valThrown = true;
break;
}
};
stepper.Minimum = 10;
Assert.Equal(10, stepper.Minimum);
Assert.Equal(10, stepper.Value);
Assert.True(minThrown);
Assert.True(valThrown);
}
[Fact]
public void MaxClampValueTest()
{
Stepper stepper = new Stepper();
stepper.Value = 50;
bool maxThrown = false;
bool valThrown = false;
stepper.PropertyChanged += (sender, e) =>
{
switch (e.PropertyName)
{
case "Maximum":
maxThrown = true;
break;
case "Value":
Assert.False(maxThrown);
valThrown = true;
break;
}
};
stepper.Maximum = 25;
Assert.Equal(25, stepper.Maximum);
Assert.Equal(25, stepper.Value);
Assert.True(maxThrown);
Assert.True(valThrown);
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class SwitchTests
{
public SwitchTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
Switch sw = new Switch();
Assert.False(sw.IsToggled);
}
[Fact]
public void SwitchLayersTest()
{
var sw = new Switch();
int layersCount = sw.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using Xamarin.Forms;
using Xunit;
namespace GraphicsControls.Tests
{
public class TimePickerTests
{
public TimePickerTests()
=> Device.PlatformServices = new MockPlatformServices();
[Fact]
public void ConstructorTest()
{
var timePicker = new TimePicker();
Assert.NotNull(timePicker);
}
[Fact]
public void TimePickerLayersTest()
{
var timePicker = new TimePicker();
int layersCount = timePicker.GraphicsLayers.Count;
Assert.NotEqual(0, layersCount);
}
}
}

Просмотреть файл

@ -1,29 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net461</TargetFrameworks>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\GraphicsControls\GraphicsControls.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
<PackageReference Include="NSubstitute" Version="4.2.2" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Folder Include="Mocks\" />
</ItemGroup>
</Project>

Просмотреть файл

@ -1,78 +0,0 @@
using System;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Internals;
namespace GraphicsControls.Tests
{
class MockPlatformServices : IPlatformServices
{
public string GetHash(string input)
=> string.Empty;
public string GetMD5Hash(string input)
=> string.Empty;
public double GetNamedSize(NamedSize size, Type targetElement, bool useOldSizes)
=> 0;
public Color GetNamedColor(string name)
=> Color.Default;
public void OpenUriAction(Uri uri)
{
}
public bool IsInvokeRequired
=> false;
public OSAppTheme RequestedTheme => OSAppTheme.Unspecified;
public string RuntimePlatform { get; set; }
public void BeginInvokeOnMainThread(Action action)
=> action();
public Ticker CreateTicker()
=> new MockTicker();
public void StartTimer(TimeSpan interval, Func<bool> callback)
{
}
public Task<Stream> GetStreamAsync(Uri uri, CancellationToken cancellationToken)
=> Task.FromResult<Stream>(new MemoryStream());
public Assembly[] GetAssemblies()
=> new Assembly[0];
public IIsolatedStorageFile GetUserStoreForApplication()
=> null;
Assembly[] IPlatformServices.GetAssemblies()
=> new Assembly[0];
public void QuitApplication()
{
}
public SizeRequest GetNativeSize(Xamarin.Forms.VisualElement view, double widthConstraint, double heightConstraint)
{
return default;
}
}
class MockTicker : Ticker
{
protected override void DisableTimer()
{
}
protected override void EnableTimer()
{
}
}
}

Просмотреть файл

@ -1,10 +0,0 @@
using System.Globalization;
using System.Resources;
namespace GraphicsControls.Tests
{
class MockResourceManager : ResourceManager
{
public override string GetString(string name, CultureInfo culture) => culture.EnglishName;
}
}

Просмотреть файл

@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.809.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsControls", "GraphicsControls\GraphicsControls.csproj", "{474A33AE-06A4-4219-9545-17751EBF3F84}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsControls", "GraphicsControls\GraphicsControls.csproj", "{474A33AE-06A4-4219-9545-17751EBF3F84}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{4F0017DB-8A18-4153-A129-782B29DECF51}"
EndProject
@ -13,11 +13,19 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsControls.Sample.iOS
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsControls.Sample", "GraphicsControls.Sample\GraphicsControls.Sample.csproj", "{41B421AF-5731-4B8F-BEDE-96155879D929}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphicsControls.Sample.Tizen", "GraphicsControls.Sample.Tizen\GraphicsControls.Sample.Tizen.csproj", "{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsControls.Sample.Android", "GraphicsControls.Sample.Android\GraphicsControls.Sample.Android.csproj", "{2EE53371-EFD9-4304-A231-93E6F75DBC81}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphicsControls.Sample.GTK", "GraphicsControls.Sample.GTK\GraphicsControls.Sample.GTK.csproj", "{79952688-FF1B-4813-A7E7-97C15F73B534}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "maui\src\Core\src\Core.csproj", "{8EF59C96-7972-41C6-830B-59FC81B9AD7B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".NET MAUI", ".NET MAUI", "{0F195BB7-38CF-45F6-BAF2-AB4ED1F362B3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.Core", "maui\src\Controls\src\Core\Controls.Core.csproj", "{C2BBDE92-E870-498B-9878-20538DCE3FAE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compatibility.iOS", "maui\src\Compatibility\Core\src\iOS\Compatibility.iOS.csproj", "{271193C1-6E7C-429C-A36D-3F1BE5267231}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compatibility.Android", "maui\src\Compatibility\Core\src\Android\Compatibility.Android.csproj", "{F602BE45-8096-4A38-BF1B-28EF078E51E1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compatibility.Android.FormsViewGroup", "maui\src\Compatibility\Core\src\Android.FormsViewGroup\Compatibility.Android.FormsViewGroup.csproj", "{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -65,48 +73,78 @@ Global
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|iPhone.Build.0 = Release|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{41B421AF-5731-4B8F-BEDE-96155879D929}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Debug|iPhone.Build.0 = Debug|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Release|Any CPU.Build.0 = Release|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Release|iPhone.ActiveCfg = Release|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Release|iPhone.Build.0 = Release|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhone.Build.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|Any CPU.Build.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|Any CPU.Deploy.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhone.ActiveCfg = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhone.Build.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhone.Deploy.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{2EE53371-EFD9-4304-A231-93E6F75DBC81}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Debug|Any CPU.Build.0 = Debug|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Debug|iPhone.Build.0 = Debug|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Release|Any CPU.ActiveCfg = Release|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Release|Any CPU.Build.0 = Release|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Release|iPhone.ActiveCfg = Release|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Release|iPhone.Build.0 = Release|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{79952688-FF1B-4813-A7E7-97C15F73B534}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Debug|iPhone.Build.0 = Debug|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Release|Any CPU.Build.0 = Release|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Release|iPhone.ActiveCfg = Release|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Release|iPhone.Build.0 = Release|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{8EF59C96-7972-41C6-830B-59FC81B9AD7B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Debug|iPhone.Build.0 = Debug|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Release|Any CPU.Build.0 = Release|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Release|iPhone.ActiveCfg = Release|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Release|iPhone.Build.0 = Release|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{C2BBDE92-E870-498B-9878-20538DCE3FAE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|Any CPU.Build.0 = Debug|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhone.Build.0 = Debug|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|Any CPU.ActiveCfg = Release|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|Any CPU.Build.0 = Release|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhone.ActiveCfg = Release|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhone.Build.0 = Release|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{271193C1-6E7C-429C-A36D-3F1BE5267231}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Debug|iPhone.Build.0 = Debug|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Release|Any CPU.Build.0 = Release|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Release|iPhone.ActiveCfg = Release|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Release|iPhone.Build.0 = Release|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{F602BE45-8096-4A38-BF1B-28EF078E51E1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Debug|iPhone.Build.0 = Debug|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Release|Any CPU.Build.0 = Release|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Release|iPhone.ActiveCfg = Release|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Release|iPhone.Build.0 = Release|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -115,9 +153,12 @@ Global
{474A33AE-06A4-4219-9545-17751EBF3F84} = {4F0017DB-8A18-4153-A129-782B29DECF51}
{27FAE6FC-C7E2-4B63-B713-906A59A0C0DF} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{41B421AF-5731-4B8F-BEDE-96155879D929} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{F89D5E3A-5531-412B-A8B2-D4E8A9F07B9E} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{2EE53371-EFD9-4304-A231-93E6F75DBC81} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{79952688-FF1B-4813-A7E7-97C15F73B534} = {465D03D3-BA73-4E52-BBEA-02DC54647BC6}
{8EF59C96-7972-41C6-830B-59FC81B9AD7B} = {0F195BB7-38CF-45F6-BAF2-AB4ED1F362B3}
{C2BBDE92-E870-498B-9878-20538DCE3FAE} = {0F195BB7-38CF-45F6-BAF2-AB4ED1F362B3}
{271193C1-6E7C-429C-A36D-3F1BE5267231} = {0F195BB7-38CF-45F6-BAF2-AB4ED1F362B3}
{F602BE45-8096-4A38-BF1B-28EF078E51E1} = {0F195BB7-38CF-45F6-BAF2-AB4ED1F362B3}
{FDA97CEE-D0A1-48ED-B555-1E90B7CA1468} = {0F195BB7-38CF-45F6-BAF2-AB4ED1F362B3}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {475B4FFA-17B6-449C-9D09-DE4E2B0D2F4B}

Просмотреть файл

@ -1,8 +0,0 @@
using Xamarin.Forms;
using Xamarin.Forms.Internals;
[assembly: Preserve]
[assembly: XmlnsDefinition("http://xamarin.com/schemas/2020/graphics", "GraphicsControls")]
[assembly: XmlnsDefinition("http://xamarin.com/schemas/2020/graphics", "GraphicsControls.Effects")]
[assembly: XmlnsDefinition("http://xamarin.com/schemas/2020/graphics", "GraphicsControls.Extensions")]
[assembly: XmlnsDefinition("http://xamarin.com/schemas/2020/graphics", "GraphicsControls.Helpers")]

Просмотреть файл

@ -1,56 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using Xamarin.Forms;
namespace GraphicsControls
{
public partial class ActivityIndicator
{
float _cupertinoActivityIndicatorAngle;
float CupertinoActivityIndicatorAngle
{
get { return _cupertinoActivityIndicatorAngle; }
set
{
_cupertinoActivityIndicatorAngle = value;
InvalidateDraw();
}
}
void DrawCupertinoActivityIndicator(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.Scale(0.75f, 0.75f);
var vBuilder = new PathBuilder();
var path =
vBuilder.BuildPath(
"M16,23.353012C16.551999,23.353013,17,23.801012,17,24.353012L17,31.00001C17,31.55201 16.551999,32.00001 16,32.00001 15.447999,32.00001 15,31.55201 15,31.00001L15,24.353012C15,23.801012,15.447999,23.353013,16,23.353012z M11.882349,22.25521C12.043656,22.258505 12.206556,22.300968 12.356859,22.386598 12.835829,22.660613 13.002818,23.271647 12.729836,23.751674L9.4370441,29.525996C9.2520552,29.849014 8.9150772,30.030025 8.5670986,30.030025 8.3991098,30.030025 8.2291203,29.988022 8.0721302,29.899017 7.5931606,29.625001 7.4261713,29.013968 7.6991539,28.533941L10.991945,22.759619C11.180308,22.430288,11.527474,22.247962,11.882349,22.25521z M20.027796,21.917202C20.365566,21.924239,20.691196,22.102265,20.872964,22.415953L24.385011,28.478001C24.661991,28.956001 24.499026,29.566997 24.020995,29.844007 23.864012,29.935987 23.691037,29.978987 23.520992,29.978987 23.176019,29.978987 22.840018,29.8 22.655019,29.479991L19.142972,23.418949C18.865993,22.94095 19.028958,22.328947 19.505951,22.051967 19.670609,21.956745 19.850868,21.913516 20.027796,21.917202z M8.7567263,19.218469C9.1115561,19.207652 9.4607439,19.386006 9.6525459,19.71324 9.9305305,20.189217 9.7705393,20.802187 9.2935658,21.081173L3.5568819,24.437009C3.397891,24.530005 3.2239008,24.574002 3.0529099,24.574003 2.7089291,24.574002 2.3749466,24.397011 2.1889572,24.079026 1.9099731,23.60205 2.0709648,22.99008 2.5469379,22.711094L8.2836218,19.354258C8.4329882,19.267387,8.5954399,19.223385,8.7567263,19.218469z M22.971681,18.948197C23.132897,18.951152,23.295456,18.993068,23.444831,19.07776L29.536846,22.53792C30.016848,22.810932 30.184848,23.421961 29.912848,23.901983 29.728847,24.225998 29.389846,24.408006 29.041845,24.408006 28.874845,24.408006 28.704844,24.366004 28.548844,24.278L22.457829,20.81784C21.976828,20.544827 21.808827,19.933799 22.081828,19.453777 22.268828,19.123762 22.617005,18.941694 22.971681,18.948197z M23.993983,15.00001L30.999997,15.00001C31.551998,15.00001 31.999999,15.448009 31.999999,16.00001 31.999999,16.55201 31.551998,17.00001 30.999997,17.00001L23.993983,17.00001C23.441982,17.00001 22.993981,16.55201 22.993981,16.00001 22.993981,15.448009 23.441982,15.00001 23.993983,15.00001z M1.0000019,15.00001L7.6470232,15.00001C8.1990252,15.00001 8.647027,15.448009 8.647027,16.00001 8.647027,16.55201 8.1990252,17.00001 7.6470232,17.00001L1.0000019,17.00001C0.44799995,17.00001 0,16.55201 0,16.00001 0,15.448009 0.44799995,15.00001 1.0000019,15.00001z M2.9774418,7.592205C3.1385689,7.5952778,3.3011475,7.6374035,3.4508352,7.7223969L9.2308588,11.004143C9.7108612,11.277122 9.8788614,11.888074 9.6068602,12.368037 9.4228592,12.692012 9.0838585,12.873998 8.735857,12.873998 8.5688562,12.873998 8.3988552,12.832001 8.2428551,12.744008L2.4638309,9.4612627C1.98283,9.1882839 1.8148289,8.578331 2.0878296,8.0983677 2.2755184,7.7677059 2.6229649,7.5854464 2.9774418,7.592205z M28.914661,7.4264841C29.269417,7.4156685 29.618884,7.5940228 29.810011,7.921257 30.089013,8.3972349 29.928012,9.0102053 29.452008,9.2891922L23.40496,12.826025C23.245958,12.919021 23.071957,12.963018 22.900956,12.963018 22.556953,12.963018 22.22295,12.786027 22.036949,12.468042 21.757947,11.991065 21.918948,11.379094 22.394952,11.100107L28.441999,7.562274C28.591063,7.4754028,28.753408,7.4314013,28.914661,7.4264841z M8.4513187,2.0223866C8.8060827,2.012846,9.1544075,2.1928482,9.3448553,2.5207958L12.677041,8.2719717C12.954057,8.7499866 12.791048,9.3610048 12.313021,9.6380138 12.156012,9.7300167 11.983003,9.7730179 11.812993,9.7730179 11.467974,9.7730179 11.131955,9.5940123 10.946945,9.274003L7.613759,3.5228271C7.3367434,3.0448112 7.5007524,2.433794 7.9777794,2.1567841 8.1274757,2.070219 8.290062,2.026722 8.4513187,2.0223866z M23.451962,1.9692326C23.613253,1.9726448 23.776271,2.0153179 23.926888,2.1012535 24.40586,2.3742447 24.572851,2.9852276 24.299866,3.4652119L20.829065,9.5510302C20.644076,9.8740206 20.307095,10.055015 19.959115,10.055015 19.791125,10.055015 19.621134,10.013016 19.464143,9.9240189 18.985171,9.6500273 18.81818,9.0390453 19.091165,8.5590601L22.562966,2.4742432C22.750643,2.1442528,23.097123,1.9617271,23.451962,1.9692326z M16,0C16.551999,0,17,0.44800186,17,1.0000038L17,8.0060177C17,8.5580187 16.551999,9.0060196 16,9.0060196 15.447999,9.0060196 15,8.5580187 15,8.0060177L15,1.0000038C15,0.44800186,15.447999,0,16,0z");
canvas.FillColor = Color.ToGraphicsColor(Application.Current?.RequestedTheme == OSAppTheme.Light ? Material.Color.Gray1 : Material.Color.Gray4);
float rX = 16.0f;
float rY = 16.0f;
if (IsRunning)
canvas.Rotate(CupertinoActivityIndicatorAngle, rX, rY);
else
canvas.Rotate(0, rX, rY);
canvas.FillPath(path);
canvas.RestoreState();
}
void AnimateCupertinoActivityIndicatorAnimation()
{
var startAngle = 0;
var endAngle = 360;
var cupertinoActivityIndicatorAngleAnimation = new Animation(v => CupertinoActivityIndicatorAngle = (int)v, startAngle, endAngle, easing: Easing.Linear);
cupertinoActivityIndicatorAngleAnimation.Commit(this, "CupertinoActivityIndicator", length: 4000, repeat: () => true, finished: (l, c) => cupertinoActivityIndicatorAngleAnimation = null);
}
}
}

Просмотреть файл

@ -1,103 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
using Xamarin.Forms;
namespace GraphicsControls
{
public partial class ActivityIndicator
{
float _fluentActivityIndicatorEndAngle;
float FluentActivityIndicatorStartAngle { get; set; }
float FluentActivityIndicatorEndAngle
{
get { return _fluentActivityIndicatorEndAngle; }
set
{
_fluentActivityIndicatorEndAngle = value;
InvalidateDraw();
}
}
void DrawFluentActivityIndicatorBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
float size = 28f;
float strokeWidth = 1.5f;
if (IsEnabled)
canvas.StrokeColor = ColorHelper.GetGraphicsColor(Fluent.Color.Primary.ThemeLight, Fluent.Color.Primary.ThemeDark);
else
canvas.StrokeColor = ColorHelper.GetGraphicsColor(Fluent.Color.Background.NeutralTertiaryAlt, Fluent.Color.Background.NeutralQuaternaryAlt);
canvas.StrokeSize = strokeWidth;
var x = (dirtyRect.Width - size) / 2;
var y = dirtyRect.Y + strokeWidth;
canvas.DrawEllipse(x, y, size, size);
canvas.RestoreState();
}
void DrawFluentActivityIndicator(ICanvas canvas, RectangleF dirtyRect)
{
if (IsRunning)
{
canvas.SaveState();
float size = 28f;
float strokeWidth = 1.5f;
canvas.StrokeColor = Color.ToGraphicsColor(Fluent.Color.Primary.ThemePrimary);
canvas.StrokeSize = strokeWidth;
var x = (dirtyRect.Width - size) / 2;
var y = dirtyRect.Y + strokeWidth;
canvas.DrawArc(x, y, size, size, FluentActivityIndicatorStartAngle, FluentActivityIndicatorEndAngle, true, false);
canvas.RestoreState();
}
}
void DrawFluentActivityIndicatorText(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
if (IsEnabled)
canvas.FontColor = Color.ToGraphicsColor(Fluent.Color.Primary.ThemePrimary);
else
canvas.FontColor = ColorHelper.GetGraphicsColor(Fluent.Color.Background.NeutralTertiaryAlt, Fluent.Color.Background.NeutralQuaternaryAlt);
canvas.FontSize = 12f;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString("Loading...", 0, 0, width, height, HorizontalAlignment.Center, VerticalAlignment.Bottom);
canvas.RestoreState();
}
void AnimateFluentActivityIndicatorAnimation()
{
var fluentActivityIndicatorAnimation = new Animation();
var startAngle = 90;
var endAngle = 360;
var startAngleAnimation = new Animation(v => FluentActivityIndicatorStartAngle = (int)v, startAngle, startAngle - 360, easing: Easing.Linear);
var endAngleAnimation = new Animation(v => FluentActivityIndicatorEndAngle = (int)v, endAngle, endAngle - 360, easing: Easing.Linear);
fluentActivityIndicatorAnimation.Add(0, 1, startAngleAnimation);
fluentActivityIndicatorAnimation.Add(0, 1, endAngleAnimation);
fluentActivityIndicatorAnimation.Commit(this, "FluentActivityIndicator", length: 1000, repeat: () => true, finished: (l, c) => fluentActivityIndicatorAnimation = null);
}
}
}

Просмотреть файл

@ -1,71 +0,0 @@
using System.Graphics;
using Xamarin.Forms;
using GColor = System.Graphics.Color;
namespace GraphicsControls
{
public partial class ActivityIndicator
{
float _materialActivityIndicatorEndAngle;
float MaterialActivityIndicatorRotate { get; set; }
float MaterialActivityIndicatorStartAngle { get; set; }
float MaterialActivityIndicatorEndAngle
{
get { return _materialActivityIndicatorEndAngle; }
set
{
_materialActivityIndicatorEndAngle = value;
InvalidateDraw();
}
}
void DrawMaterialActivityIndicator(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
float size = 40f;
float strokeWidth = 4f;
canvas.StrokeSize = strokeWidth;
var x = dirtyRect.X;
var y = dirtyRect.Y;
if (IsRunning)
{
canvas.Rotate(MaterialActivityIndicatorRotate, x + strokeWidth + size / 2, y + strokeWidth + size / 2);
canvas.StrokeColor = new GColor(Material.Color.Blue);
canvas.DrawArc(x + strokeWidth, y + strokeWidth, size, size, MaterialActivityIndicatorStartAngle, MaterialActivityIndicatorEndAngle, false, false);
}
else
{
canvas.Rotate(0, x + strokeWidth + size / 2, y + strokeWidth + size / 2);
canvas.StrokeColor = new GColor(Material.Color.LightBlue);
canvas.DrawArc(x + strokeWidth, y + strokeWidth, size, size, 0, 360, false, false);
}
canvas.RestoreState();
}
void AnimateMaterialActivityIndicatorAnimation()
{
var materialActivityIndicatorAngleAnimation = new Animation();
var startAngle = 90;
var endAngle = 360;
var rotateAnimation = new Animation(v => MaterialActivityIndicatorRotate = (int)v, 0, 0, easing: Easing.Linear);
var startAngleAnimation = new Animation(v => MaterialActivityIndicatorStartAngle = (int)v, startAngle, startAngle - 360, easing: Easing.Linear);
var endAngleAnimation = new Animation(v => MaterialActivityIndicatorEndAngle = (int)v, endAngle, endAngle - 360, easing: Easing.Linear);
materialActivityIndicatorAngleAnimation.Add(0, 1, rotateAnimation);
materialActivityIndicatorAngleAnimation.Add(0, 1, startAngleAnimation);
materialActivityIndicatorAngleAnimation.Add(0, 1, endAngleAnimation);
materialActivityIndicatorAngleAnimation.Commit(this, "MaterialActivityIndicator", length: 1400, repeat: () => true, finished: (l, c) => materialActivityIndicatorAngleAnimation = null);
}
}
}

Просмотреть файл

@ -1,165 +0,0 @@
using System.Collections.Generic;
using System.Graphics;
using System.Runtime.CompilerServices;
using Xamarin.Forms;
using XColor = Xamarin.Forms.Color;
namespace GraphicsControls
{
public partial class ActivityIndicator : GraphicsVisualView, IColor
{
public static class Layers
{
public const string Background = "ActivityIndicator.Layers.Background";
public const string Indicator = "ActivityIndicator.Layers.Indicator";
public const string IndicatorText = "ActivityIndicator.Layers.IndicatorText";
}
public static readonly BindableProperty ColorProperty = ColorElement.ColorProperty;
public static readonly BindableProperty IsRunningProperty =
BindableProperty.Create(nameof(IsRunning), typeof(bool), typeof(ActivityIndicator), default(bool),
propertyChanged: OnIsRunningChanged);
static void OnIsRunningChanged(BindableObject bindable, object oldValue, object newValue)
{
if (bindable is ActivityIndicator activityIndicator)
{
if (activityIndicator.IsEnabled && (bool)newValue)
activityIndicator.StartActivityIndicatorAnimation();
else
activityIndicator.StopActivityIndicatorAnimation();
}
}
public XColor Color
{
get { return (XColor)GetValue(ColorElement.ColorProperty); }
set { SetValue(ColorElement.ColorProperty, value); }
}
public bool IsRunning
{
get { return (bool)GetValue(IsRunningProperty); }
set { SetValue(IsRunningProperty, value); }
}
public List<string> ActivityIndicatorLayers = new List<string>
{
Layers.Background,
Layers.Indicator,
Layers.IndicatorText
};
public override void Load()
{
base.Load();
switch (VisualType)
{
case VisualType.Material:
default:
HeightRequest = 48;
WidthRequest = 48;
break;
case VisualType.Cupertino:
HeightRequest = 24;
WidthRequest = 24;
break;
case VisualType.Fluent:
HeightRequest = 52;
WidthRequest = 60;
break;
}
}
public override List<string> GraphicsLayers =>
ActivityIndicatorLayers;
public override void DrawLayer(string layer, ICanvas canvas, RectangleF dirtyRect)
{
switch (layer)
{
case Layers.Background:
DrawActivityIndicatorBackground(canvas, dirtyRect);
break;
case Layers.Indicator:
DrawActivityIndicator(canvas, dirtyRect);
break;
case Layers.IndicatorText:
DrawActivityIndicatorText(canvas, dirtyRect);
break;
}
}
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == IsRunningProperty.PropertyName ||
propertyName == BackgroundColorProperty.PropertyName ||
propertyName == FlowDirectionProperty.PropertyName)
InvalidateDraw();
}
protected virtual void DrawActivityIndicatorBackground(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Fluent:
DrawFluentActivityIndicatorBackground(canvas, dirtyRect);
break;
}
}
protected virtual void DrawActivityIndicator(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialActivityIndicator(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoActivityIndicator(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentActivityIndicator(canvas, dirtyRect);
break;
}
}
protected virtual void DrawActivityIndicatorText(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Fluent:
DrawFluentActivityIndicatorText(canvas, dirtyRect);
break;
}
}
void StartActivityIndicatorAnimation()
{
switch (VisualType)
{
case VisualType.Material:
default:
AnimateMaterialActivityIndicatorAnimation();
break;
case VisualType.Cupertino:
AnimateCupertinoActivityIndicatorAnimation();
break;
case VisualType.Fluent:
AnimateFluentActivityIndicatorAnimation();
break;
}
}
void StopActivityIndicatorAnimation()
{
ViewExtensions.CancelAnimations(this);
InvalidateDraw();
}
}
}

Просмотреть файл

@ -1,46 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using Xamarin.Forms;
using XColor = Xamarin.Forms.Color;
namespace GraphicsControls
{
public class BoxView : GraphicsView, IColor, ICornerRadius
{
public static readonly BindableProperty ColorProperty = ColorElement.ColorProperty;
public static readonly BindableProperty CornerRadiusProperty = CornerRadiusElement.CornerRadiusProperty;
public XColor Color
{
get { return (XColor)GetValue(ColorProperty); }
set { SetValue(ColorProperty, value); }
}
public double CornerRadius
{
get { return (double)GetValue(CornerRadiusElement.CornerRadiusProperty); }
set { SetValue(CornerRadiusElement.CornerRadiusProperty, value); }
}
public override void Draw(ICanvas canvas, RectangleF dirtyRect)
{
base.Draw(canvas, dirtyRect);
canvas.SaveState();
var color = Color != XColor.Default ? Color : BackgroundColor;
canvas.FillColor = color.ToGraphicsColor();
var x = dirtyRect.X;
var y = dirtyRect.Y;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.FillRoundedRectangle(x, y, width, height, (float)CornerRadius);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,42 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
namespace GraphicsControls
{
public partial class Button
{
void DrawCupertinoButtonBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FillColor = BackgroundColor.ToGraphicsColor(Cupertino.Color.SystemColor.Light.Blue, Cupertino.Color.SystemColor.Dark.Blue);
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.FillRoundedRectangle(x, y, width, height, (float)CornerRadius);
canvas.RestoreState();
_backgroundRect = new RectangleF(x, y, width, height);
}
void DrawCupertinoButtonText(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontColor = TextColor.ToGraphicsColor(Cupertino.Color.Label.Light.Primary, Cupertino.Color.Label.Dark.Primary);
canvas.FontSize = 17f;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Text, 0, 0, width, height, HorizontalAlignment.Center, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,64 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
using GColor = System.Graphics.Color;
namespace GraphicsControls
{
public partial class Button
{
protected virtual void DrawFluentButtonBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
var strokeWidth = 1;
if (IsEnabled)
{
canvas.StrokeColor = Colors.Black;
canvas.FillColor = BackgroundColor.ToGraphicsColor(Fluent.Color.Primary.ThemePrimary);
}
else
{
var disabledColor = ColorHelper.GetGraphicsColor(Fluent.Color.Background.NeutralLighter, Fluent.Color.Background.NeutralDark);
canvas.StrokeColor = canvas.FillColor = disabledColor;
}
canvas.StrokeSize = strokeWidth;
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.DrawRoundedRectangle(x, y, width, height, (float)CornerRadius);
float margin = strokeWidth * 2;
canvas.FillRoundedRectangle(x + strokeWidth, y + strokeWidth, width - margin, height - margin, (float)CornerRadius);
canvas.RestoreState();
_backgroundRect = new RectangleF(x + strokeWidth, y + strokeWidth, width - margin, height - margin);
}
protected virtual void DrawFluentButtonText(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
if (IsEnabled)
canvas.FontColor = TextColor.ToGraphicsColor(Fluent.Color.Foreground.White);
else
canvas.FontColor = ColorHelper.GetGraphicsColor(Fluent.Color.Foreground.NeutralPrimary, Fluent.Color.Foreground.NeutralTertiary);
canvas.FontSize = 14f;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Text, 0, 0, width, height, HorizontalAlignment.Center, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,50 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using Xamarin.Forms;
using GColor = System.Graphics.Color;
namespace GraphicsControls
{
public partial class Button
{
const float MaterialBackgroundHeight = 36f;
const float MaterialShadowOffset = 3f;
void DrawMaterialButtonBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FillColor = BackgroundColor.ToGraphicsColor(Material.Color.Blue);
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width - MaterialShadowOffset;
canvas.SetShadow(new SizeF(0, 1), 3, new GColor(Application.Current?.RequestedTheme == OSAppTheme.Light ? Material.Color.Gray2 : Material.Color.Gray1));
canvas.FillRoundedRectangle(x, y, width, MaterialBackgroundHeight, (float)CornerRadius);
canvas.RestoreState();
_backgroundRect = new RectangleF(x, y, width, MaterialBackgroundHeight);
}
void DrawMaterialButtonText(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontName = "Roboto";
canvas.FontColor = TextColor.ToGraphicsColor(Material.Color.White);
canvas.FontSize = Material.Font.Button;
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width - MaterialShadowOffset;
canvas.DrawString(Text.ToUpper(), x, y, width, MaterialBackgroundHeight, HorizontalAlignment.Center, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,217 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Graphics;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using GraphicsControls.Effects;
using Xamarin.Forms;
using Point = System.Graphics.Point;
using XColor = Xamarin.Forms.Color;
namespace GraphicsControls
{
public partial class Button : GraphicsVisualView, IButton, ICornerRadius
{
public static class Layers
{
public const string Background = "Button.Layers.Background";
public const string Text = "Button.Layers.Text";
}
readonly RippleEffect _rippleEffect;
RectangleF _backgroundRect;
public Button()
{
_backgroundRect = RectangleF.Zero;
_rippleEffect = new RippleEffect();
TextColor = XColor.White;
CornerRadius = 2;
}
public static readonly BindableProperty CommandProperty = ButtonElement.CommandProperty;
public static readonly BindableProperty CommandParameterProperty = ButtonElement.CommandParameterProperty;
internal static readonly BindablePropertyKey IsPressedPropertyKey =
BindableProperty.CreateReadOnly(nameof(IsPressed), typeof(bool), typeof(Button), default(bool));
public static readonly BindableProperty IsPressedProperty = IsPressedPropertyKey.BindableProperty;
public static readonly BindableProperty TextProperty = TextElement.TextProperty;
public static readonly BindableProperty TextColorProperty = TextElement.TextColorProperty;
public static readonly BindableProperty CornerRadiusProperty = CornerRadiusElement.CornerRadiusProperty;
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public object CommandParameter
{
get { return GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}
public bool IsPressed => (bool)GetValue(IsPressedProperty);
public string Text
{
get { return (string)GetValue(TextElement.TextProperty); }
set { SetValue(TextElement.TextProperty, value); }
}
public XColor TextColor
{
get { return (XColor)GetValue(TextElement.TextColorProperty); }
set { SetValue(TextElement.TextColorProperty, value); }
}
public double CornerRadius
{
get { return (double)GetValue(CornerRadiusElement.CornerRadiusProperty); }
set { SetValue(CornerRadiusElement.CornerRadiusProperty, value); }
}
bool IButton.IsEnabledCore
{
set { SetValueCore(IsEnabledProperty, value); }
}
[EditorBrowsable(EditorBrowsableState.Never)]
void IButton.SetIsPressed(bool isPressed) => SetValue(IsPressedPropertyKey, isPressed);
[EditorBrowsable(EditorBrowsableState.Never)]
void IButton.PropagateUpClicked() => Clicked?.Invoke(this, EventArgs.Empty);
[EditorBrowsable(EditorBrowsableState.Never)]
void IButton.PropagateUpPressed() => Pressed?.Invoke(this, EventArgs.Empty);
[EditorBrowsable(EditorBrowsableState.Never)]
void IButton.PropagateUpReleased() => Released?.Invoke(this, EventArgs.Empty);
void IButton.OnCommandCanExecuteChanged(object sender, EventArgs e) =>
ButtonElement.CommandCanExecuteChanged(this, EventArgs.Empty);
public List<string> ButtonLayers = new List<string>
{
Layers.Background,
Layers.Text
};
public event EventHandler Clicked;
public event EventHandler Pressed;
public event EventHandler Released;
public override void Load()
{
switch (VisualType)
{
case VisualType.Material:
default:
HeightRequest = MaterialBackgroundHeight + MaterialShadowOffset;
GraphicsEffects.Add(_rippleEffect);
break;
case VisualType.Cupertino:
HeightRequest = 44;
break;
case VisualType.Fluent:
HeightRequest = 32;
break;
}
base.Load();
}
public override List<string> GraphicsLayers =>
ButtonLayers;
public override void DrawLayer(string layer, ICanvas canvas, RectangleF dirtyRect)
{
switch (layer)
{
case Layers.Background:
DrawButtonBackground(canvas, dirtyRect);
break;
case Layers.Text:
DrawButtonText(canvas, dirtyRect);
break;
}
}
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == BackgroundColorProperty.PropertyName ||
propertyName == FlowDirectionProperty.PropertyName)
InvalidateDraw();
}
public override void OnTouchDown(Point point)
{
base.OnTouchDown(point);
if (VisualType == VisualType.Material)
{
_rippleEffect.ClipRectangle = _backgroundRect;
var touchDownPoint = new PointF((float)point.X, (float)point.Y);
_rippleEffect.TouchPoint = touchDownPoint;
}
Pressed?.Invoke(this, EventArgs.Empty);
Clicked?.Invoke(this, EventArgs.Empty);
}
public override void OnTouchUp(Point point)
{
base.OnTouchUp(point);
Released?.Invoke(this, EventArgs.Empty);
}
protected virtual void DrawButtonBackground(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialButtonBackground(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoButtonBackground(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentButtonBackground(canvas, dirtyRect);
break;
}
}
protected virtual void DrawButtonText(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialButtonText(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoButtonText(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentButtonText(canvas, dirtyRect);
break;
}
}
}
}

Просмотреть файл

@ -1,72 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
namespace GraphicsControls
{
public partial class CheckBox
{
const string CupertinoCheckBoxMark = "M4.78246 10.9434C5.03441 10.9434 5.23363 10.832 5.37426 10.6152L10.9114 1.89648C11.0168 1.72656 11.0579 1.59766 11.0579 1.46289C11.0579 1.14062 10.8469 0.929688 10.5246 0.929688C10.2903 0.929688 10.1614 1.00586 10.0207 1.22852L4.75902 9.61328L2.02855 6.03906C1.88207 5.83398 1.73559 5.75195 1.52465 5.75195C1.19066 5.75195 0.962149 5.98047 0.962149 6.30273C0.962149 6.4375 1.02074 6.58984 1.13207 6.73047L4.17309 10.6035C4.34887 10.832 4.53051 10.9434 4.78246 10.9434Z";
void DrawCupertinoCheckBoxBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
float size = 24f;
var x = dirtyRect.X;
var y = dirtyRect.Y;
if (IsChecked)
{
canvas.FillColor = Color.ToGraphicsColor(Cupertino.Color.SystemColor.Light.Blue, Cupertino.Color.SystemColor.Dark.Blue);
canvas.FillEllipse(x, y, size, size);
}
else
{
var strokeWidth = 2;
canvas.StrokeSize = strokeWidth;
canvas.StrokeColor = Color.ToGraphicsColor(Cupertino.Color.SystemColor.Light.Blue, Cupertino.Color.SystemColor.Dark.Blue);
canvas.DrawEllipse(x + strokeWidth / 2, y + strokeWidth / 2, size - strokeWidth, size - strokeWidth);
}
canvas.RestoreState();
}
void DrawCupertinoCheckBoxMark(ICanvas canvas, RectangleF dirtyRect)
{
if (IsChecked)
{
canvas.SaveState();
canvas.Translate(6, 6);
var vBuilder = new PathBuilder();
var path = vBuilder.BuildPath(CupertinoCheckBoxMark);
canvas.StrokeColor = Colors.White;
canvas.DrawPath(path);
canvas.RestoreState();
}
}
void DrawCupertinoCheckBoxText(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontColor = TextColor.ToGraphicsColor(Cupertino.Color.Label.Light.Primary, Cupertino.Color.Label.Dark.Primary);
canvas.FontSize = 14f;
float size = 20f;
float margin = 8f;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Text, size + margin, 0, width - (size + margin), height, HorizontalAlignment.Left, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,86 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
namespace GraphicsControls
{
public partial class CheckBox
{
const string FluentCheckBoxMark = "M13.3516 1.35156L5 9.71094L0.648438 5.35156L1.35156 4.64844L5 8.28906L12.6484 0.648438L13.3516 1.35156Z";
void DrawFluentCheckBoxBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
float size = 20f;
var x = dirtyRect.X;
var y = dirtyRect.Y;
if (IsChecked)
{
if (IsEnabled)
canvas.FillColor = Color.ToGraphicsColor(Fluent.Color.Primary.ThemePrimary);
else
canvas.FillColor = ColorHelper.GetGraphicsColor(Fluent.Color.Background.NeutralLighter, Fluent.Color.Background.NeutralDark);
canvas.FillRoundedRectangle(x, y, size, size, 2);
}
else
{
var strokeWidth = 2;
canvas.StrokeSize = strokeWidth;
if (IsEnabled)
canvas.StrokeColor = Color.ToGraphicsColor(Fluent.Color.Primary.ThemePrimary);
else
canvas.FillColor = ColorHelper.GetGraphicsColor(Fluent.Color.Background.NeutralLighter, Fluent.Color.Background.NeutralDark);
canvas.DrawRoundedRectangle(x + strokeWidth / 2, y + strokeWidth / 2, size - strokeWidth, size - strokeWidth, 2);
}
canvas.RestoreState();
}
void DrawFluentCheckBoxMark(ICanvas canvas, RectangleF dirtyRect)
{
if (IsChecked)
{
canvas.SaveState();
canvas.Translate(3, 5);
var vBuilder = new PathBuilder();
var path = vBuilder.BuildPath(FluentCheckBoxMark);
canvas.StrokeColor = Colors.White;
canvas.DrawPath(path);
canvas.RestoreState();
}
}
void DrawFluentCheckBoxText(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
if (IsEnabled)
canvas.FontColor = ColorHelper.GetGraphicsColor(Fluent.Color.Foreground.Black, Fluent.Color.Foreground.White);
else
canvas.FontColor = ColorHelper.GetGraphicsColor(Fluent.Color.Foreground.NeutralPrimary, Fluent.Color.Foreground.NeutralTertiary);
canvas.FontSize = 14f;
float size = 20f;
float margin = 8f;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Text, size + margin, 0, width - (size + margin), height, HorizontalAlignment.Left, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,72 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
namespace GraphicsControls
{
public partial class CheckBox
{
const string MaterialCheckBoxMark = "M13.3516 1.35156L5 9.71094L0.648438 5.35156L1.35156 4.64844L5 8.28906L12.6484 0.648438L13.3516 1.35156Z";
void DrawMaterialCheckBoxBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
float size = 18f;
var x = dirtyRect.X;
var y = dirtyRect.Y;
if (IsChecked)
{
canvas.FillColor = Color.ToGraphicsColor(Material.Color.Blue);
canvas.FillRoundedRectangle(x, y, size, size, 2);
}
else
{
var strokeWidth = 2;
canvas.StrokeSize = strokeWidth;
canvas.StrokeColor = Color.ToGraphicsColor(Material.Color.Gray1);
canvas.DrawRoundedRectangle(x + strokeWidth / 2, y + strokeWidth / 2, size - strokeWidth, size - strokeWidth, 2);
}
canvas.RestoreState();
}
void DrawMaterialCheckBoxMark(ICanvas canvas, RectangleF dirtyRect)
{
if (IsChecked)
{
canvas.SaveState();
canvas.Translate(2, 4);
var vBuilder = new PathBuilder();
var path = vBuilder.BuildPath(MaterialCheckBoxMark);
canvas.StrokeColor = Colors.White;
canvas.DrawPath(path);
canvas.RestoreState();
}
}
void DrawMaterialCheckBoxText(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontColor = TextColor.ToGraphicsColor(Cupertino.Color.Label.Light.Primary, Cupertino.Color.Label.Dark.Primary);
canvas.FontSize = 14f;
float size = 20f;
float margin = 8f;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Text, size + margin, 0, width - (size + margin), height, HorizontalAlignment.Left, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,191 +0,0 @@
using System;
using System.Collections.Generic;
using System.Graphics;
using System.Runtime.CompilerServices;
using Xamarin.Forms;
using Point = System.Graphics.Point;
using XColor = Xamarin.Forms.Color;
namespace GraphicsControls
{
public partial class CheckBox : GraphicsVisualView, IColor
{
public static class Layers
{
public const string Background = "CheckBox.Layers.Background";
public const string Mark = "CheckBox.Layers.Mark";
public const string Text = "CheckBox.Layers.Text";
}
public const string IsCheckedVisualState = "IsChecked";
public static readonly BindableProperty IsCheckedProperty =
BindableProperty.Create(nameof(IsChecked), typeof(bool), typeof(CheckBox), false,
propertyChanged: (bindable, oldValue, newValue) =>
{
((CheckBox)bindable).CheckedChanged?.Invoke(bindable, new CheckedChangedEventArgs((bool)newValue));
((CheckBox)bindable).ChangeVisualState();
}, defaultBindingMode: BindingMode.TwoWay);
public static readonly BindableProperty TextProperty =
BindableProperty.Create(nameof(Text), typeof(string), typeof(CheckBox), string.Empty);
public static readonly BindableProperty TextColorProperty =
BindableProperty.Create(nameof(TextColor), typeof(XColor), typeof(CheckBox), XColor.Default);
public static readonly BindableProperty ColorProperty = ColorElement.ColorProperty;
public bool IsChecked
{
get { return (bool)GetValue(IsCheckedProperty); }
set { SetValue(IsCheckedProperty, value); }
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public XColor TextColor
{
get { return (XColor)GetValue(TextColorProperty); }
set { SetValue(TextColorProperty, value); }
}
public XColor Color
{
get { return (XColor)GetValue(ColorProperty); }
set { SetValue(ColorProperty, value); }
}
public List<string> CheckBoxLayers = new List<string>
{
Layers.Background,
Layers.Mark,
Layers.Text
};
public event EventHandler<CheckedChangedEventArgs> CheckedChanged;
public override List<string> GraphicsLayers =>
CheckBoxLayers;
public override void DrawLayer(string layer, ICanvas canvas, RectangleF dirtyRect)
{
switch (layer)
{
case Layers.Background:
DrawCheckBoxBackground(canvas, dirtyRect);
break;
case Layers.Mark:
DrawCheckBoxMark(canvas, dirtyRect);
break;
case Layers.Text:
DrawCheckBoxText(canvas, dirtyRect);
break;
}
}
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == IsCheckedProperty.PropertyName ||
propertyName == BackgroundColorProperty.PropertyName ||
propertyName == FlowDirectionProperty.PropertyName)
InvalidateDraw();
}
public override void Load()
{
base.Load();
switch (VisualType)
{
case VisualType.Cupertino:
HeightRequest = 24;
WidthRequest = 65;
break;
case VisualType.Material:
default:
HeightRequest = 18;
WidthRequest = 65;
break;
case VisualType.Fluent:
HeightRequest = 20;
WidthRequest = 65;
break;
}
}
protected override void ChangeVisualState()
{
if (IsEnabled && IsChecked)
VisualStateManager.GoToState(this, IsCheckedVisualState);
else
base.ChangeVisualState();
}
public override void OnTouchDown(Point point)
{
UpdateIsChecked();
}
protected virtual void DrawCheckBoxBackground(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialCheckBoxBackground(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoCheckBoxBackground(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentCheckBoxBackground(canvas, dirtyRect);
break;
}
}
protected virtual void DrawCheckBoxMark(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialCheckBoxMark(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoCheckBoxMark(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentCheckBoxMark(canvas, dirtyRect);
break;
}
}
protected virtual void DrawCheckBoxText(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialCheckBoxText(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoCheckBoxText(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentCheckBoxText(canvas, dirtyRect);
break;
}
}
void UpdateIsChecked()
{
IsChecked = !IsChecked;
}
}
}

Просмотреть файл

@ -1,146 +0,0 @@
namespace GraphicsControls
{
public static class Cupertino
{
public static class Color
{
public static class SystemColor
{
public static class Light
{
public const string Blue = "#007AFF";
public const string Green = "#33C759";
public const string Indigo = "#5856D6";
public const string Orange = "#FF9500";
public const string Pink = "#FF2D55";
public const string Purple = "#AF52DE";
public const string Red = "#FF3B30";
public const string Teal = "#59C8FA";
public const string Yellow = "#FFCC00";
}
public static class Dark
{
public const string Blue = "#0684FF";
public const string Green = "#30D158";
public const string Indigo = "#5E5CE6";
public const string Orange = "#FF9F08";
public const string Pink = "#FF375F";
public const string Purple = "#BF5AF2";
public const string Red = "#FF443A";
public const string Teal = "#65D1FF";
public const string Yellow = "#FFD606";
}
}
public static class SystemGray
{
public static class Light
{
public const string Gray1 = "#8E8E93";
public const string Gray2 = "#C7C7CC";
public const string Gray3 = "#D1D1D6";
public const string Gray4 = "#E5E5EA";
public const string Gray5 = "#EFEFF4";
public const string Gray6 = "#F2F2F7";
public const string InactiveGray = "#999999";
}
public static class Dark
{
public const string Gray1 = "#8E8E93";
public const string Gray2 = "#636366";
public const string Gray3 = "#48484A";
public const string Gray4 = "#3A3A3C";
public const string Gray5 = "#2C2C2E";
public const string Gray6 = "#1C1C1E";
public const string InactiveGray = "#757575";
}
}
public static class Label
{
public static class Light
{
public const string Primary = "#000000";
public const string Secondary = "#7C7C80";
public const string Tertiary = "#ACACAE";
public const string Quaternary = "#BFBFC0";
public const string Link = "#0077FF";
public const string Black = "#000000";
public const string Error = "#FF453A";
}
public static class Dark
{
public const string Primary = "#FFFFFF";
public const string Secondary = "#A0A0A7";
public const string Tertiary = "#67676A";
public const string Quaternary = "#515153";
public const string Link = "#007AFF";
public const string Black = "#000000";
public const string Error = "#FF453A";
}
}
public static class Fill
{
public static class Light
{
public const string Black = "#000000";
public const string White = "#99EBEBF5";
public const string Primary = "#C8C8CA";
public const string Secondary = "#CCCCCD";
public const string Tertiary = "#D0D0D1";
public const string Quaternary = "#D4D4D5";
public const string NonOpaqueSeparator = "#AEAEB0";
public const string OpaqueSeparator = "#C6C6C8";
}
public static class Dark
{
public const string Black = "#000000";
public const string White = "#99EBEBF5";
public const string Primary = "#49494C";
public const string Secondary = "#464649";
public const string Tertiary = "#404042";
public const string Quaternary = "#3B3B3E";
public const string NonOpaqueSeparator = "#47474A";
public const string OpaqueSeparator = "#38383A";
}
}
public static class Background
{
public static class Light
{
public const string Primary = "#FFFFFF";
public const string Secondary = "#F2F2F7";
public const string Transparent = "#FFFFFFFF";
}
public static class Dark
{
public const string Primary = "#1C1C1E";
public const string Secondary = "#2C2C2E";
public const string Transparent = "#FFFFFFFF";
}
}
}
public static class Font
{
public const double LargeTitle = 34;
public const double Title1 = 28;
public const double Title2 = 22;
public const double Title3 = 20;
public const double Headline = 17;
public const double Body = 17;
public const double Callout = 16;
public const double Subhead = 15;
public const double Footnote = 13;
public const double Caption1 = 12;
public const double Caption2 = 11;
}
}
}

Просмотреть файл

@ -1,65 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
namespace GraphicsControls
{
public partial class DatePicker
{
void DrawCupertinoDatePickerBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FillColor = BackgroundColor.ToGraphicsColor(Material.Color.White, Material.Color.Black);
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.FillRoundedRectangle(x, y, width, height, 2);
canvas.RestoreState();
}
void DrawCupertinoDatePickerBorder(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
var strokeWidth = 1.0f;
canvas.StrokeColor = ColorHelper.GetGraphicsColor(Material.Color.Gray3, Material.Color.Gray6);
canvas.StrokeSize = strokeWidth;
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.DrawRoundedRectangle(x + strokeWidth / 2, y + strokeWidth / 2, width - strokeWidth, height - strokeWidth, 8);
canvas.RestoreState();
}
void DrawCupertinoDatePickerDate(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontColor = TextColor.ToGraphicsColor(Material.Color.Black, Material.Color.White);
canvas.FontSize = 14f;
float margin = 8f;
var x = dirtyRect.X + margin;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(GetDate().ToShortDateString(), x, 0, width - margin, height, HorizontalAlignment.Left, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,103 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
using GColor = System.Graphics.Color;
namespace GraphicsControls
{
public partial class DatePicker
{
const string FluentDatePickerIcon = "M4.5 4.5H5.25V5.25H4.5V4.5ZM6.75 9H7.5V9.75H6.75V9ZM9 4.5H9.75V5.25H9V4.5ZM6.75 4.5H7.5V5.25H6.75V4.5ZM4.5 6H5.25V6.75H4.5V6ZM2.25 6H3V6.75H2.25V6ZM9 6H9.75V6.75H9V6ZM6.75 6H7.5V6.75H6.75V6ZM4.5 7.5H5.25V8.25H4.5V7.5ZM2.25 7.5H3V8.25H2.25V7.5ZM9 7.5H9.75V8.25H9V7.5ZM6.75 7.5H7.5V8.25H6.75V7.5ZM4.5 9H5.25V9.75H4.5V9ZM2.25 9H3V9.75H2.25V9ZM12 0.75V11.25H0V0.75H2.25V0H3V0.75H9V0H9.75V0.75H12ZM0.75 1.5V3H11.25V1.5H9.75V2.25H9V1.5H3V2.25H2.25V1.5H0.75ZM11.25 10.5V3.75H0.75V10.5H11.25Z";
const float FluentDatePickerHeight = 32.0f;
void DrawFluentDatePickerBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
if (IsEnabled)
canvas.FillColor = BackgroundColor.ToGraphicsColor(Fluent.Color.Foreground.White, Fluent.Color.Foreground.NeutralPrimaryAlt);
else
canvas.FillColor = ColorHelper.GetGraphicsColor(Fluent.Color.Background.NeutralLighter, Fluent.Color.Background.NeutralDark);
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.FillRoundedRectangle(x, y, width, height, 2);
canvas.RestoreState();
}
void DrawFluentDatePickerBorder(ICanvas canvas, RectangleF dirtyRect)
{
if (IsEnabled)
{
canvas.SaveState();
var strokeWidth = 1.0f;
canvas.StrokeColor = ColorHelper.GetGraphicsColor(Fluent.Color.Foreground.NeutralSecondary, Fluent.Color.Foreground.White);
canvas.StrokeSize = strokeWidth;
if (IsFocused)
{
strokeWidth = 2.0f;
canvas.StrokeColor = new GColor(Fluent.Color.Primary.ThemePrimary);
canvas.StrokeSize = strokeWidth;
}
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.DrawRoundedRectangle(x + strokeWidth / 2, y + strokeWidth / 2, width - strokeWidth, height - strokeWidth, 2);
canvas.RestoreState();
}
}
void DrawFluentDatePickerIcon(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
var margin = 10;
canvas.Translate(dirtyRect.Width - (2 * margin), margin);
var vBuilder = new PathBuilder();
var path = vBuilder.BuildPath(FluentDatePickerIcon);
canvas.FillColor = ColorHelper.GetGraphicsColor(Fluent.Color.Foreground.NeutralSecondary, Fluent.Color.Foreground.White);
canvas.FillPath(path);
canvas.RestoreState();
}
void DrawFluentDatePickerDate(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
if (IsEnabled)
canvas.FontColor = TextColor.ToGraphicsColor(Fluent.Color.Foreground.Black, Fluent.Color.Foreground.White);
else
canvas.FontColor = TextColor.ToGraphicsColor(Fluent.Color.Foreground.NeutralTertiary, Fluent.Color.Foreground.White);
canvas.FontSize = 14f;
float margin = 8f;
var x = dirtyRect.X + margin;
var height = FluentDatePickerHeight;
var width = dirtyRect.Width;
canvas.DrawString(GetDate().ToShortDateString(), x, 0, width - margin, height, HorizontalAlignment.Left, VerticalAlignment.Center);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,107 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
using Xamarin.Forms;
using GColor = System.Graphics.Color;
namespace GraphicsControls
{
public partial class DatePicker
{
void DrawMaterialDatePickerBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FillColor = BackgroundColor.ToGraphicsColor(Material.Color.Gray5, Material.Color.Dark);
var width = dirtyRect.Width;
var vBuilder = new PathBuilder();
var path =
vBuilder.BuildPath(
$"M0 4C0 1.79086 1.79086 0 4 0H{width - 4}C{width - 2}.209 0 {width} 1.79086 {width} 4V56H0V4Z");
canvas.FillPath(path);
canvas.RestoreState();
}
void DrawMaterialDatePickerBorder(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
var strokeWidth = 1.0f;
canvas.FillColor = ColorHelper.GetGraphicsColor(Material.Color.Black, Material.Color.White);
if (IsFocused)
{
strokeWidth = 2.0f;
canvas.FillColor = new GColor(Material.Color.Blue);
}
var x = dirtyRect.X;
var y = 53.91f;
var width = dirtyRect.Width;
var height = strokeWidth;
canvas.FillRectangle(x, y, width, height);
canvas.RestoreState();
}
void DrawMaterialDatePickerPlaceholder(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontColor = ColorHelper.GetGraphicsColor(Material.Color.Gray1, Material.Color.Gray6);
canvas.FontSize = 12f;
float margin = 12f;
var horizontalAlignment = HorizontalAlignment.Left;
var x = dirtyRect.X + margin;
if (FlowDirection == FlowDirection.RightToLeft)
{
x = dirtyRect.X;
horizontalAlignment = HorizontalAlignment.Right;
}
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString("Date", x, 6f, width - margin, height, horizontalAlignment, VerticalAlignment.Top);
canvas.RestoreState();
}
void DrawMaterialDatePickerDate(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontColor = TextColor.ToGraphicsColor(Material.Color.Dark, Material.Color.Light);
canvas.FontSize = 16f;
float margin = 12f;
var horizontalAlignment = HorizontalAlignment.Left;
var x = dirtyRect.X + margin;
if (FlowDirection == FlowDirection.RightToLeft)
{
x = dirtyRect.X;
horizontalAlignment = HorizontalAlignment.Right;
}
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(GetDate().ToShortDateString(), x, 22f, width - margin, height, horizontalAlignment, VerticalAlignment.Top);
canvas.RestoreState();
}
}
}

Просмотреть файл

@ -1,283 +0,0 @@
using System;
using System.Collections.Generic;
using System.Graphics;
using System.Runtime.CompilerServices;
using GraphicsControls.Effects;
using Xamarin.Forms;
using XColor = Xamarin.Forms.Color;
namespace GraphicsControls
{
public partial class DatePicker : GraphicsVisualView
{
DatePickerDialogRoutingEffect _datePickerEffect;
public static class Layers
{
public const string Background = "DatePicker.Layers.Background";
public const string Border = "DatePicker.Layers.Border";
public const string Icon = "DatePicker.Layers.Icon";
public const string Placeholder = "DatePicker.Layers.Placeholder";
public const string Date = "DatePicker.Layers.Date";
}
public static readonly BindableProperty DateProperty =
BindableProperty.Create(nameof(Date), typeof(DateTime), typeof(DatePicker), default(DateTime), BindingMode.TwoWay,
coerceValue: CoerceDate,
propertyChanged: DatePropertyChanged,
defaultValueCreator: (bindable) => DateTime.Today);
public static readonly BindableProperty MinimumDateProperty =
BindableProperty.Create(nameof(MinimumDate), typeof(DateTime), typeof(DatePicker), new DateTime(1900, 1, 1),
validateValue: ValidateMinimumDate, coerceValue: CoerceMinimumDate);
public static readonly BindableProperty MaximumDateProperty =
BindableProperty.Create(nameof(MaximumDate), typeof(DateTime), typeof(DatePicker), new DateTime(2100, 12, 31),
validateValue: ValidateMaximumDate, coerceValue: CoerceMaximumDate);
public static readonly BindableProperty TextColorProperty =
BindableProperty.Create(nameof(TextColor), typeof(XColor), typeof(TimePicker), XColor.Default);
static object CoerceDate(BindableObject bindable, object value)
{
var picker = (DatePicker)bindable;
DateTime dateValue = ((DateTime)value).Date;
if (dateValue > picker.MaximumDate)
dateValue = picker.MaximumDate;
if (dateValue < picker.MinimumDate)
dateValue = picker.MinimumDate;
return dateValue;
}
static void DatePropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var datePicker = (DatePicker)bindable;
datePicker.DateSelected?.Invoke(datePicker, new DateChangedEventArgs((DateTime)oldValue, (DateTime)newValue));
}
static bool ValidateMinimumDate(BindableObject bindable, object value)
{
return ((DateTime)value).Date <= ((DatePicker)bindable).MaximumDate.Date;
}
static object CoerceMinimumDate(BindableObject bindable, object value)
{
DateTime dateValue = ((DateTime)value).Date;
var picker = (DatePicker)bindable;
if (picker.Date < dateValue)
picker.Date = dateValue;
return dateValue;
}
static bool ValidateMaximumDate(BindableObject bindable, object value)
{
return ((DateTime)value).Date >= ((DatePicker)bindable).MinimumDate.Date;
}
static object CoerceMaximumDate(BindableObject bindable, object value)
{
DateTime dateValue = ((DateTime)value).Date;
var picker = (DatePicker)bindable;
if (picker.Date > dateValue)
picker.Date = dateValue;
return dateValue;
}
public DateTime Date
{
get { return (DateTime)GetValue(DateProperty); }
set { SetValue(DateProperty, value); }
}
public DateTime MaximumDate
{
get { return (DateTime)GetValue(MaximumDateProperty); }
set { SetValue(MaximumDateProperty, value); }
}
public DateTime MinimumDate
{
get { return (DateTime)GetValue(MinimumDateProperty); }
set { SetValue(MinimumDateProperty, value); }
}
public XColor TextColor
{
get { return (XColor)GetValue(TextColorProperty); }
set { SetValue(TextColorProperty, value); }
}
public List<string> DatePickerLayers = new List<string>
{
Layers.Background,
Layers.Border,
Layers.Icon,
Layers.Placeholder,
Layers.Date
};
public event EventHandler<DateChangedEventArgs> DateSelected;
public override void Load()
{
base.Load();
switch (VisualType)
{
case VisualType.Material:
default:
HeightRequest = 56;
break;
case VisualType.Cupertino:
HeightRequest = 36;
break;
case VisualType.Fluent:
HeightRequest = 32;
break;
}
_datePickerEffect = new DatePickerDialogRoutingEffect();
Effects.Add(_datePickerEffect);
UpdateMaximumDate();
UpdateMinimumDate();
}
public override void Unload()
{
Effects.Remove(_datePickerEffect);
}
public override List<string> GraphicsLayers =>
DatePickerLayers;
public override void DrawLayer(string layer, ICanvas canvas, RectangleF dirtyRect)
{
switch (layer)
{
case Layers.Background:
DrawDatePickerBackground(canvas, dirtyRect);
break;
case Layers.Border:
DrawDatePickerBorder(canvas, dirtyRect);
break;
case Layers.Icon:
DrawDatePickerIcon(canvas, dirtyRect);
break;
case Layers.Placeholder:
DrawDatePickerPlaceholder(canvas, dirtyRect);
break;
case Layers.Date:
DrawDatePickerDate(canvas, dirtyRect);
break;
}
}
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == MaximumDateProperty.PropertyName)
UpdateMaximumDate();
else if (propertyName == MinimumDateProperty.PropertyName)
UpdateMinimumDate();
}
protected virtual void DrawDatePickerBackground(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialDatePickerBackground(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoDatePickerBackground(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentDatePickerBackground(canvas, dirtyRect);
break;
}
}
protected virtual void DrawDatePickerBorder(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialDatePickerBorder(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoDatePickerBorder(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentDatePickerBorder(canvas, dirtyRect);
break;
}
}
protected virtual void DrawDatePickerIcon(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Fluent:
DrawFluentDatePickerIcon(canvas, dirtyRect);
break;
}
}
protected virtual void DrawDatePickerPlaceholder(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
DrawMaterialDatePickerPlaceholder(canvas, dirtyRect);
break;
}
}
protected virtual void DrawDatePickerDate(ICanvas canvas, RectangleF dirtyRect)
{
switch (VisualType)
{
case VisualType.Material:
default:
DrawMaterialDatePickerDate(canvas, dirtyRect);
break;
case VisualType.Cupertino:
DrawCupertinoDatePickerDate(canvas, dirtyRect);
break;
case VisualType.Fluent:
DrawFluentDatePickerDate(canvas, dirtyRect);
break;
}
}
void UpdateMaximumDate()
{
DatePickerDialog.SetMaximumDate(this, MaximumDate);
}
void UpdateMinimumDate()
{
DatePickerDialog.SetMinimumDate(this, MinimumDate);
}
DateTime GetDate()
{
var date = DatePickerDialog.GetDate(this);
if (date == default)
return MinimumDate;
return date;
}
}
}

Просмотреть файл

@ -1,22 +0,0 @@
using Android.Content;
using GraphicsControls;
using GraphicsControls.Android;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(BorderlessEditor), typeof(BorderlessEditorRenderer))]
namespace GraphicsControls.Android
{
public class BorderlessEditorRenderer : EditorRenderer
{
public BorderlessEditorRenderer(Context context) : base(context) { }
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Editor> e)
{
base.OnElementChanged(e);
if (e.OldElement == null)
Control.Background = null;
}
}
}

Просмотреть файл

@ -1,69 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
namespace GraphicsControls
{
public partial class Editor
{
void DrawCupertinoEditorBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FillColor = BackgroundColor.ToGraphicsColor(Material.Color.White, Material.Color.Black);
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.FillRoundedRectangle(x, y, width, height, 8);
canvas.RestoreState();
}
void DrawCupertinoEditorBorder(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
var strokeWidth = 1.0f;
canvas.StrokeColor = ColorHelper.GetGraphicsColor(Material.Color.Gray3, Material.Color.Gray6);
canvas.StrokeSize = strokeWidth;
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.DrawRoundedRectangle(x + strokeWidth / 2, y + strokeWidth / 2, width - strokeWidth, height - strokeWidth, 8);
canvas.RestoreState();
}
void DrawCupertinoEditorPlaceholder(ICanvas canvas, RectangleF dirtyRect)
{
if (!IsFocused && string.IsNullOrEmpty(Text))
{
canvas.SaveState();
canvas.FontColor = PlaceholderColor.ToGraphicsColor(Material.Color.Black, Material.Color.White);
canvas.FontSize = 14f;
float margin = 8f;
var x = dirtyRect.X + margin;
var y = dirtyRect.Y + margin;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Placeholder, x, y, width - margin, height, HorizontalAlignment.Left, VerticalAlignment.Top);
canvas.RestoreState();
}
}
}
}

Просмотреть файл

@ -1,87 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
using GColor = System.Graphics.Color;
namespace GraphicsControls
{
public partial class Editor
{
void DrawFluentEditorBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
if (IsEnabled)
canvas.FillColor = BackgroundColor.ToGraphicsColor(Fluent.Color.Foreground.White, Fluent.Color.Foreground.NeutralPrimaryAlt);
else
canvas.FillColor = ColorHelper.GetGraphicsColor(Fluent.Color.Background.NeutralLighter, Fluent.Color.Background.NeutralDark);
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.FillRoundedRectangle(x, y, width, height, 2);
canvas.RestoreState();
}
void DrawFluentEditorBorder(ICanvas canvas, RectangleF dirtyRect)
{
if (IsEnabled)
{
canvas.SaveState();
var strokeWidth = 1.0f;
canvas.StrokeColor = ColorHelper.GetGraphicsColor(Fluent.Color.Foreground.NeutralSecondary, Fluent.Color.Foreground.White);
canvas.StrokeSize = strokeWidth;
if (IsFocused)
{
strokeWidth = 2.0f;
canvas.StrokeColor = new GColor(Fluent.Color.Primary.ThemePrimary);
canvas.StrokeSize = strokeWidth;
}
var x = dirtyRect.X;
var y = dirtyRect.Y;
var width = dirtyRect.Width;
var height = dirtyRect.Height;
canvas.DrawRoundedRectangle(x + strokeWidth / 2, y + strokeWidth / 2, width - strokeWidth, height - strokeWidth, 2);
canvas.RestoreState();
}
}
void DrawFluentEditorPlaceholder(ICanvas canvas, RectangleF dirtyRect)
{
if (!IsFocused && string.IsNullOrEmpty(Text))
{
canvas.SaveState();
if (IsEnabled)
canvas.FontColor = PlaceholderColor.ToGraphicsColor(Fluent.Color.Foreground.Black, Fluent.Color.Foreground.White);
else
canvas.FontColor = new GColor(Fluent.Color.Foreground.NeutralTertiary);
canvas.FontSize = 14f;
float margin = 8f;
var x = dirtyRect.X + margin;
var y = dirtyRect.Y + margin;
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Placeholder, x, y, width - margin, height, HorizontalAlignment.Left, VerticalAlignment.Top);
canvas.RestoreState();
}
}
}
}

Просмотреть файл

@ -1,20 +0,0 @@
using GraphicsControls;
using GraphicsControls.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(BorderlessEditor), typeof(BorderlessEditorRenderer))]
namespace GraphicsControls.iOS
{
public class BorderlessEditorRenderer : EditorRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Editor> e)
{
base.OnElementChanged(e);
if (Control != null)
Control.Layer.BorderColor = UIColor.Clear.CGColor;
}
}
}

Просмотреть файл

@ -1,23 +0,0 @@
using AppKit;
using GraphicsControls;
using GraphicsControls.Mac;
using Xamarin.Forms;
using Xamarin.Forms.Platform.MacOS;
[assembly: ExportRenderer(typeof(BorderlessEditor), typeof(BorderlessEditorRenderer))]
namespace GraphicsControls.Mac
{
public class BorderlessEditorRenderer : EditorRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Editor> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.Bordered = false;
Control.FocusRingType = NSFocusRingType.None;
}
}
}
}

Просмотреть файл

@ -1,130 +0,0 @@
using System.Graphics;
using GraphicsControls.Extensions;
using GraphicsControls.Helpers;
using Xamarin.Forms;
using GColor = System.Graphics.Color;
namespace GraphicsControls
{
public partial class Editor
{
const float FocusedMaterialPlaceholderFontSize = 12f;
const float UnfocusedMaterialPlaceholderFontSize = 16f;
const float FocusedMaterialPlaceholderPosition = 6f;
const float UnfocusedMaterialPlaceholderPosition = 22f;
float _placeholderY;
float _placeholderFontSize;
float PlaceholderY
{
get { return _placeholderY; }
set
{
_placeholderY = value;
InvalidateDraw();
}
}
float PlaceholderFontSize
{
get { return _placeholderFontSize; }
set
{
_placeholderFontSize = value;
InvalidateDraw();
}
}
void DrawMaterialEditorBackground(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FillColor = BackgroundColor.ToGraphicsColor(Material.Color.Gray5, Material.Color.Dark);
var width = dirtyRect.Width;
var vBuilder = new PathBuilder();
var path =
vBuilder.BuildPath(
$"M0 4C0 1.79086 1.79086 0 4 0H{width - 4}C{width - 2}.209 0 {width} 1.79086 {width} 4V114.95H0V4Z");
canvas.FillPath(path);
canvas.RestoreState();
}
void DrawMaterialEditorBorder(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
var strokeWidth = 1.0f;
canvas.FillColor = ColorHelper.GetGraphicsColor(Material.Color.Black, Material.Color.White);
if (IsFocused)
{
strokeWidth = 2.0f;
canvas.FillColor = new GColor(Material.Color.Blue);
}
var x = dirtyRect.X;
var y = 112.91f;
var width = dirtyRect.Width;
var height = strokeWidth;
canvas.FillRectangle(x, y, width, height);
canvas.RestoreState();
}
void DrawMaterialEditorPlaceholder(ICanvas canvas, RectangleF dirtyRect)
{
canvas.SaveState();
canvas.FontColor = PlaceholderColor.ToGraphicsColor(Material.Color.Dark, Material.Color.Light);
canvas.FontSize = PlaceholderFontSize;
float margin = 12f;
var horizontalAlignment = HorizontalAlignment.Left;
var x = dirtyRect.X + margin;
if (FlowDirection == FlowDirection.RightToLeft)
{
x = dirtyRect.X;
horizontalAlignment = HorizontalAlignment.Right;
}
var height = dirtyRect.Height;
var width = dirtyRect.Width;
canvas.DrawString(Placeholder, x, PlaceholderY, width - margin, height, horizontalAlignment, VerticalAlignment.Top);
canvas.RestoreState();
}
void AnimateMaterialPlaceholder(bool isFocused)
{
if (IsFocused && !string.IsNullOrEmpty(Text))
return;
var materialPlaceholderAnimation = new Animation();
float startFontSize = isFocused ? UnfocusedMaterialPlaceholderFontSize : FocusedMaterialPlaceholderFontSize;
float endFontSize = (isFocused || !string.IsNullOrEmpty(Text)) ? FocusedMaterialPlaceholderFontSize : UnfocusedMaterialPlaceholderFontSize;
var fontSizeAnimation = new Animation(v => PlaceholderFontSize = (int)v, startFontSize, endFontSize, easing: Easing.Linear);
float startPosition = isFocused ? UnfocusedMaterialPlaceholderPosition : FocusedMaterialPlaceholderPosition;
float endPosition = (isFocused || !string.IsNullOrEmpty(Text)) ? FocusedMaterialPlaceholderPosition : UnfocusedMaterialPlaceholderPosition;
var placeholderPositionAnimation = new Animation(v => PlaceholderY = (int)v, startPosition, endPosition, easing: Easing.Linear);
materialPlaceholderAnimation.Add(0, 1, fontSizeAnimation);
materialPlaceholderAnimation.Add(0, 1, placeholderPositionAnimation);
materialPlaceholderAnimation.Commit(this, "MaterialPlaceholderAnimation", length: 100, finished: (l, c) => materialPlaceholderAnimation = null);
}
}
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше