[
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Default settings:\n# A newline ending every file\n# Use 4 spaces as indentation\n[*]\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\n\n# C# files\n[*.cs]\n# New line preferences\ncsharp_new_line_before_open_brace = all\ncsharp_new_line_before_else = true\ncsharp_new_line_before_catch = true\ncsharp_new_line_before_finally = true\ncsharp_new_line_before_members_in_object_initializers = true\ncsharp_new_line_before_members_in_anonymous_types = true\ncsharp_new_line_between_query_expression_clauses = true\n\n# Indentation preferences\ncsharp_indent_block_contents = true\ncsharp_indent_braces = false\ncsharp_indent_case_contents = true\ncsharp_indent_switch_labels = true\ncsharp_indent_labels = one_less_than_current\n\n# avoid this. unless absolutely necessary\ndotnet_style_qualification_for_field = false:suggestion\ndotnet_style_qualification_for_property = false:suggestion\ndotnet_style_qualification_for_method = false:suggestion\ndotnet_style_qualification_for_event = false:suggestion\n\n# prefer var\ncsharp_style_var_for_built_in_types = true\ncsharp_style_var_when_type_is_apparent = true\ncsharp_style_var_elsewhere = true:suggestion\n\n# use language keywords instead of BCL types\ndotnet_style_predefined_type_for_locals_parameters_members = true:suggestion\ndotnet_style_predefined_type_for_member_access = true:suggestion\n\n# name all constant fields using PascalCase\ndotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.constant_fields_should_be_pascal_case.symbols  = constant_fields\ndotnet_naming_rule.constant_fields_should_be_pascal_case.style    = pascal_case_style\n\ndotnet_naming_symbols.constant_fields.applicable_kinds   = field\ndotnet_naming_symbols.constant_fields.required_modifiers = const\n\ndotnet_naming_style.pascal_case_style.capitalization = pascal_case\n\n# static fields should have s_ prefix\ndotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion\ndotnet_naming_rule.static_fields_should_have_prefix.symbols  = static_fields\ndotnet_naming_rule.static_fields_should_have_prefix.style    = static_prefix_style\n\ndotnet_naming_symbols.static_fields.applicable_kinds   = field\ndotnet_naming_symbols.static_fields.required_modifiers = static\n\ndotnet_naming_style.static_prefix_style.required_prefix = s_\ndotnet_naming_style.static_prefix_style.capitalization = camel_case \n\n# internal and private fields should be _camelCase\ndotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion\ndotnet_naming_rule.camel_case_for_private_internal_fields.symbols  = private_internal_fields\ndotnet_naming_rule.camel_case_for_private_internal_fields.style    = camel_case_underscore_style\n\ndotnet_naming_symbols.private_internal_fields.applicable_kinds = field\ndotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal\n\ndotnet_naming_style.camel_case_underscore_style.required_prefix = _\ndotnet_naming_style.camel_case_underscore_style.capitalization = camel_case \n\n# use accessibility modifiers\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion\n\n# Code style defaults\ndotnet_sort_system_directives_first = true\ncsharp_preserve_single_line_blocks = true\ncsharp_preserve_single_line_statements = false\n\n# Expression-level preferences\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_explicit_tuple_names = true:suggestion\ndotnet_style_coalesce_expression = true:suggestion\ndotnet_style_null_propagation = true:suggestion\n\n# Expression-bodied members\ncsharp_style_expression_bodied_methods = false:none\ncsharp_style_expression_bodied_constructors = false:none\ncsharp_style_expression_bodied_operators = false:none\ncsharp_style_expression_bodied_properties = true:none\ncsharp_style_expression_bodied_indexers = true:none\ncsharp_style_expression_bodied_accessors = true:none\n\n# Pattern matching\ncsharp_style_pattern_matching_over_is_with_cast_check = true:suggestion\ncsharp_style_pattern_matching_over_as_with_null_check = true:suggestion\ncsharp_style_inlined_variable_declaration = true:suggestion\n\n# Null checking preferences\ncsharp_style_throw_expression = true:suggestion\ncsharp_style_conditional_delegate_call = true:suggestion\n\n# Space preferences\ncsharp_space_after_cast = false\ncsharp_space_after_colon_in_inheritance_clause = true\ncsharp_space_after_comma = true\ncsharp_space_after_dot = false\ncsharp_space_after_keywords_in_control_flow_statements = true\ncsharp_space_after_semicolon_in_for_statement = true\ncsharp_space_around_binary_operators = before_and_after\ncsharp_space_around_declaration_statements = do_not_ignore\ncsharp_space_before_colon_in_inheritance_clause = true\ncsharp_space_before_comma = false\ncsharp_space_before_dot = false\ncsharp_space_before_open_square_brackets = false\ncsharp_space_before_semicolon_in_for_statement = false\ncsharp_space_between_empty_square_brackets = false\ncsharp_space_between_method_call_empty_parameter_list_parentheses = false\ncsharp_space_between_method_call_name_and_opening_parenthesis = false\ncsharp_space_between_method_call_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_empty_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_name_and_open_parenthesis = false\ncsharp_space_between_method_declaration_parameter_list_parentheses = false\ncsharp_space_between_parentheses = false\ncsharp_space_between_square_brackets = false\n\n# Xaml files\n[*.{xaml,axaml}]\nindent_style = space\nindent_size = 2\n\n# Xml project files\n[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]\nindent_size = 2\n\n# Xml build files\n[*.builds]\nindent_size = 2\n\n# Xml files\n[*.{xml,stylecop,resx,ruleset}]\nindent_size = 2\n\n# Xml config files\n[*.{props,targets,config,nuspec}]\nindent_size = 2\n\n# Shell scripts\n[*.sh]\nend_of_line = lf\n[*.{cmd, bat}]\nend_of_line = crlf\n\n# Verify settings\n[*.{received,verified}.{txt,xml,json}]\ncharset = \"utf-8-bom\"\nend_of_line = lf\nindent_size = unset\nindent_style = unset\ninsert_final_newline = false\ntab_width = unset\ntrim_trailing_whitespace = false"
  },
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n\n\n# VerifyTests\n*.png binary\n*.verified.txt text eol=lf working-tree-encoding=UTF-8\n*.verified.xml text eol=lf working-tree-encoding=UTF-8\n*.verified.json text eol=lf working-tree-encoding=UTF-8"
  },
  {
    "path": ".github/.github/stale.yml",
    "content": "# https://probot.github.io/apps/stale/\n\n# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 7\n\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - pinned\n  - security\n\n# Label to use when marking an issue as stale\nstaleLabel: stale\n\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n\n# Comment to post when closing a stale issue. Set to `false` to disable\n# closeComment: false\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [wieslawsoltes]\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# https://probot.github.io/apps/stale/\n\n# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 7\n\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - pinned\n  - security\n\n# Label to use when marking an issue as stale\nstaleLabel: stale\n\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: true\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: CI\n\non:\n  push:\n    branches:\n    - master\n    - release/*\n  pull_request:\n    branches:\n    - master\n\njobs:\n  build:\n    strategy:\n      matrix:\n        os: [ubuntu-latest, windows-latest, macos-latest]\n    name: Build ${{ matrix.os }}\n    runs-on: ${{ matrix.os }}\n\n    steps:\n    - uses: actions/checkout@v1\n    - name: Setup .NET Core\n      uses: actions/setup-dotnet@v1\n    - name: Build Release\n      run: dotnet build --configuration Release\n    - name: Test Release\n      run: dotnet test --configuration Release\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n**/Properties/launchSettings.json\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Typescript v1 declaration files\ntypings/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\ntools/**\n# !tools/packages.config\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# macOS\n.DS_Store\n\n# VerifyTests\n*.received.*"
  },
  {
    "path": ".nuke/build.schema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"title\": \"Build Schema\",\n  \"$ref\": \"#/definitions/build\",\n  \"definitions\": {\n    \"build\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"Configuration\": {\n          \"type\": \"string\",\n          \"description\": \"configuration\"\n        },\n        \"Continue\": {\n          \"type\": \"boolean\",\n          \"description\": \"Indicates to continue a previously failed build attempt\"\n        },\n        \"Help\": {\n          \"type\": \"boolean\",\n          \"description\": \"Shows the help text for this build assembly\"\n        },\n        \"Host\": {\n          \"type\": \"string\",\n          \"description\": \"Host for execution. Default is 'automatic'\",\n          \"enum\": [\n            \"AppVeyor\",\n            \"AzurePipelines\",\n            \"Bamboo\",\n            \"Bitrise\",\n            \"GitHubActions\",\n            \"GitLab\",\n            \"Jenkins\",\n            \"Rider\",\n            \"SpaceAutomation\",\n            \"TeamCity\",\n            \"Terminal\",\n            \"TravisCI\",\n            \"VisualStudio\",\n            \"VSCode\"\n          ]\n        },\n        \"NoLogo\": {\n          \"type\": \"boolean\",\n          \"description\": \"Disables displaying the NUKE logo\"\n        },\n        \"Partition\": {\n          \"type\": \"string\",\n          \"description\": \"Partition to use on CI\"\n        },\n        \"Plan\": {\n          \"type\": \"boolean\",\n          \"description\": \"Shows the execution plan (HTML)\"\n        },\n        \"Profile\": {\n          \"type\": \"array\",\n          \"description\": \"Defines the profiles to load\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"PublishFramework\": {\n          \"type\": \"string\",\n          \"description\": \"publish-framework\"\n        },\n        \"PublishProject\": {\n          \"type\": \"string\",\n          \"description\": \"publish-project\"\n        },\n        \"PublishRuntime\": {\n          \"type\": \"string\",\n          \"description\": \"publish-runtime\"\n        },\n        \"PublishSelfContained\": {\n          \"type\": \"boolean\",\n          \"description\": \"publish-self-contained\"\n        },\n        \"Root\": {\n          \"type\": \"string\",\n          \"description\": \"Root directory during build execution\"\n        },\n        \"Skip\": {\n          \"type\": \"array\",\n          \"description\": \"List of targets to be skipped. Empty list skips all dependencies\",\n          \"items\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"Clean\",\n              \"Compile\",\n              \"Pack\",\n              \"Publish\",\n              \"Restore\",\n              \"Test\"\n            ]\n          }\n        },\n        \"Solution\": {\n          \"type\": \"string\",\n          \"description\": \"Path to a solution file that is automatically loaded\"\n        },\n        \"Target\": {\n          \"type\": \"array\",\n          \"description\": \"List of targets to be invoked. Default is '{default_target}'\",\n          \"items\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"Clean\",\n              \"Compile\",\n              \"Pack\",\n              \"Publish\",\n              \"Restore\",\n              \"Test\"\n            ]\n          }\n        },\n        \"Verbosity\": {\n          \"type\": \"string\",\n          \"description\": \"Logging verbosity during build execution. Default is 'Normal'\",\n          \"enum\": [\n            \"Minimal\",\n            \"Normal\",\n            \"Quiet\",\n            \"Verbose\"\n          ]\n        },\n        \"VersionSuffix\": {\n          \"type\": \"string\",\n          \"description\": \"version-suffix\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": ".nuke/parameters.json",
    "content": "{\n  \"$schema\": \"./build.schema.json\",\n  \"Solution\": \"AvaloniaBehaviors.sln\"\n}"
  },
  {
    "path": "AvaloniaBehaviors.sln",
    "content": "﻿Microsoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28315.86\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tests\", \"tests\", \"{C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}\"\n\tProjectSection(SolutionItems) = preProject\n\t\ttests\\Directory.Packages.props = tests\\Directory.Packages.props\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"samples\", \"samples\", \"{9B9E3891-2366-4253-A952-D08BCEB71098}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tsamples\\Directory.Packages.props = samples\\Directory.Packages.props\n\tEndProjectSection\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BehaviorsTestApplication\", \"samples\\BehaviorsTestApplication\\BehaviorsTestApplication.csproj\", \"{EA113F1A-D8D7-4142-9948-353270E7EBAE}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Avalonia.Xaml.Behaviors\", \"src\\Avalonia.Xaml.Behaviors\\Avalonia.Xaml.Behaviors.csproj\", \"{2D9FCE6A-DF13-4037-BC33-7EDB06102A2E}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Avalonia.Xaml.Interactivity\", \"src\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\", \"{14006EB4-66E9-4B58-BF5F-5A1983BF4621}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Avalonia.Xaml.Interactions\", \"src\\Avalonia.Xaml.Interactions\\Avalonia.Xaml.Interactions.csproj\", \"{ED03EEAD-938F-447B-BF0B-30857AE78BFF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Avalonia.Xaml.Interactivity.UnitTests\", \"tests\\Avalonia.Xaml.Interactivity.UnitTests\\Avalonia.Xaml.Interactivity.UnitTests.csproj\", \"{C2229490-39CA-4192-A28C-1B5EC186E027}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Avalonia.Xaml.Interactions.UnitTests\", \"tests\\Avalonia.Xaml.Interactions.UnitTests\\Avalonia.Xaml.Interactions.UnitTests.csproj\", \"{80D2C64D-B560-475D-941F-D5F28DDB2591}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{84224365-32B6-46AF-85A2-45640E6D7EEB}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"build\", \"build\", \"{2913483A-3E55-44AE-86BB-88511F372191}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.editorconfig = .editorconfig\n\t\tbuild\\behaviors.public.snk = build\\behaviors.public.snk\n\t\tbuild.ps1 = build.ps1\n\t\tbuild.sh = build.sh\n\t\tglobal.json = global.json\n\t\tazure-pipelines.yml = azure-pipelines.yml\n\t\tDirectory.Build.props = Directory.Build.props\n\t\tDirectory.Packages.props = Directory.Packages.props\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"props\", \"props\", \"{40A43022-EBA7-4E1D-8BB0-2691E41B5622}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tbuild\\SignAssembly.props = build\\SignAssembly.props\n\t\tbuild\\SourceLink.props = build\\SourceLink.props\n\t\tbuild\\XUnit.props = build\\XUnit.props\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"nuget\", \"nuget\", \"{721A55B7-C5B0-44E2-803A-56E291C672FE}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tNuGet.Config = NuGet.Config\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"docs\", \"docs\", \"{8A0733E3-A184-4BD4-8CB7-478977F3F5FB}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tLICENSE.TXT = LICENSE.TXT\n\t\tREADME.md = README.md\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"git\", \"git\", \"{0B395300-CACE-470D-81A9-69B922FB79DE}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.gitattributes = .gitattributes\n\t\t.gitignore = .gitignore\n\tEndProjectSection\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"_build\", \"build\\build\\_build.csproj\", \"{005E7A00-4EA8-43F6-868E-1F8965D39CAA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DragAndDropSample\", \"samples\\DragAndDropSample\\DragAndDropSample.csproj\", \"{438F2B54-FEDB-48C4-B14A-E47541DA443F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DraggableDemo\", \"samples\\DraggableDemo\\DraggableDemo.csproj\", \"{D5855901-BEEF-4179-96E8-9DD276C4DAEE}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"github\", \"github\", \"{9D4D9F1A-6EE5-4B7D-8991-0601F80F39CD}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.github\\workflows\\build.yml = .github\\workflows\\build.yml\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Avalonia.Xaml.Interactions.Responsive\", \"src\\Avalonia.Xaml.Interactions.Responsive\\Avalonia.Xaml.Interactions.Responsive.csproj\", \"{BEC165AA-392E-4193-A762-576A1EB8D40E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Avalonia.Xaml.Interactions.Draggable\", \"src\\Avalonia.Xaml.Interactions.Draggable\\Avalonia.Xaml.Interactions.Draggable.csproj\", \"{681EB965-E5B2-4A6F-9938-578FD19E8A15}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Avalonia.Xaml.Interactions.DragAndDrop\", \"src\\Avalonia.Xaml.Interactions.DragAndDrop\\Avalonia.Xaml.Interactions.DragAndDrop.csproj\", \"{EF243B1A-FF29-41E9-B44B-2E55A73F6CCE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Avalonia.Xaml.Interactions.Custom\", \"src\\Avalonia.Xaml.Interactions.Custom\\Avalonia.Xaml.Interactions.Custom.csproj\", \"{D647E09E-BBF2-4432-A4E0-80FBB921C1EE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Avalonia.Xaml.Interactions.Events\", \"src\\Avalonia.Xaml.Interactions.Events\\Avalonia.Xaml.Interactions.Events.csproj\", \"{648FFF6A-A8F5-491C-AC1C-19FC2061D6B4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EA113F1A-D8D7-4142-9948-353270E7EBAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EA113F1A-D8D7-4142-9948-353270E7EBAE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EA113F1A-D8D7-4142-9948-353270E7EBAE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EA113F1A-D8D7-4142-9948-353270E7EBAE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2D9FCE6A-DF13-4037-BC33-7EDB06102A2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2D9FCE6A-DF13-4037-BC33-7EDB06102A2E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2D9FCE6A-DF13-4037-BC33-7EDB06102A2E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2D9FCE6A-DF13-4037-BC33-7EDB06102A2E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{14006EB4-66E9-4B58-BF5F-5A1983BF4621}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{14006EB4-66E9-4B58-BF5F-5A1983BF4621}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{14006EB4-66E9-4B58-BF5F-5A1983BF4621}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{14006EB4-66E9-4B58-BF5F-5A1983BF4621}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{ED03EEAD-938F-447B-BF0B-30857AE78BFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{ED03EEAD-938F-447B-BF0B-30857AE78BFF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{ED03EEAD-938F-447B-BF0B-30857AE78BFF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{ED03EEAD-938F-447B-BF0B-30857AE78BFF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C2229490-39CA-4192-A28C-1B5EC186E027}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C2229490-39CA-4192-A28C-1B5EC186E027}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C2229490-39CA-4192-A28C-1B5EC186E027}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C2229490-39CA-4192-A28C-1B5EC186E027}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80D2C64D-B560-475D-941F-D5F28DDB2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80D2C64D-B560-475D-941F-D5F28DDB2591}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80D2C64D-B560-475D-941F-D5F28DDB2591}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80D2C64D-B560-475D-941F-D5F28DDB2591}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{005E7A00-4EA8-43F6-868E-1F8965D39CAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{005E7A00-4EA8-43F6-868E-1F8965D39CAA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{005E7A00-4EA8-43F6-868E-1F8965D39CAA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{005E7A00-4EA8-43F6-868E-1F8965D39CAA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{438F2B54-FEDB-48C4-B14A-E47541DA443F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{438F2B54-FEDB-48C4-B14A-E47541DA443F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{438F2B54-FEDB-48C4-B14A-E47541DA443F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{438F2B54-FEDB-48C4-B14A-E47541DA443F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D5855901-BEEF-4179-96E8-9DD276C4DAEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D5855901-BEEF-4179-96E8-9DD276C4DAEE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D5855901-BEEF-4179-96E8-9DD276C4DAEE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D5855901-BEEF-4179-96E8-9DD276C4DAEE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BEC165AA-392E-4193-A762-576A1EB8D40E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BEC165AA-392E-4193-A762-576A1EB8D40E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BEC165AA-392E-4193-A762-576A1EB8D40E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BEC165AA-392E-4193-A762-576A1EB8D40E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{681EB965-E5B2-4A6F-9938-578FD19E8A15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{681EB965-E5B2-4A6F-9938-578FD19E8A15}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{681EB965-E5B2-4A6F-9938-578FD19E8A15}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{681EB965-E5B2-4A6F-9938-578FD19E8A15}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EF243B1A-FF29-41E9-B44B-2E55A73F6CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EF243B1A-FF29-41E9-B44B-2E55A73F6CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EF243B1A-FF29-41E9-B44B-2E55A73F6CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EF243B1A-FF29-41E9-B44B-2E55A73F6CCE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D647E09E-BBF2-4432-A4E0-80FBB921C1EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D647E09E-BBF2-4432-A4E0-80FBB921C1EE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D647E09E-BBF2-4432-A4E0-80FBB921C1EE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D647E09E-BBF2-4432-A4E0-80FBB921C1EE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{648FFF6A-A8F5-491C-AC1C-19FC2061D6B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{648FFF6A-A8F5-491C-AC1C-19FC2061D6B4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{648FFF6A-A8F5-491C-AC1C-19FC2061D6B4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{648FFF6A-A8F5-491C-AC1C-19FC2061D6B4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{EA113F1A-D8D7-4142-9948-353270E7EBAE} = {9B9E3891-2366-4253-A952-D08BCEB71098}\n\t\t{2D9FCE6A-DF13-4037-BC33-7EDB06102A2E} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\t\t{14006EB4-66E9-4B58-BF5F-5A1983BF4621} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\t\t{ED03EEAD-938F-447B-BF0B-30857AE78BFF} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\t\t{C2229490-39CA-4192-A28C-1B5EC186E027} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}\n\t\t{80D2C64D-B560-475D-941F-D5F28DDB2591} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}\n\t\t{40A43022-EBA7-4E1D-8BB0-2691E41B5622} = {2913483A-3E55-44AE-86BB-88511F372191}\n\t\t{721A55B7-C5B0-44E2-803A-56E291C672FE} = {2913483A-3E55-44AE-86BB-88511F372191}\n\t\t{0B395300-CACE-470D-81A9-69B922FB79DE} = {2913483A-3E55-44AE-86BB-88511F372191}\n\t\t{005E7A00-4EA8-43F6-868E-1F8965D39CAA} = {2913483A-3E55-44AE-86BB-88511F372191}\n\t\t{438F2B54-FEDB-48C4-B14A-E47541DA443F} = {9B9E3891-2366-4253-A952-D08BCEB71098}\n\t\t{D5855901-BEEF-4179-96E8-9DD276C4DAEE} = {9B9E3891-2366-4253-A952-D08BCEB71098}\n\t\t{9D4D9F1A-6EE5-4B7D-8991-0601F80F39CD} = {2913483A-3E55-44AE-86BB-88511F372191}\n\t\t{BEC165AA-392E-4193-A762-576A1EB8D40E} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\t\t{681EB965-E5B2-4A6F-9938-578FD19E8A15} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\t\t{EF243B1A-FF29-41E9-B44B-2E55A73F6CCE} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\t\t{D647E09E-BBF2-4432-A4E0-80FBB921C1EE} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\t\t{648FFF6A-A8F5-491C-AC1C-19FC2061D6B4} = {84224365-32B6-46AF-85A2-45640E6D7EEB}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {E64CD420-15B1-487C-9806-41EBE6DC15A4}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Directory.Build.props",
    "content": "﻿<Project>\n  <PropertyGroup>\n    <VersionPrefix>11.0.10.8</VersionPrefix>\n    <VersionSuffix></VersionSuffix>\n    <Authors>Wiesław Šoltés</Authors>\n    <Company>Wiesław Šoltés</Company>\n    <Copyright>Copyright © Wiesław Šoltés 2024</Copyright>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <PackageProjectUrl>https://github.com/wieslawsoltes/AvaloniaBehaviors</PackageProjectUrl>\n  </PropertyGroup>\n  <PropertyGroup>\n    <AnalysisLevel>latest</AnalysisLevel>\n    <LangVersion>latest</LangVersion>\n    <EnableTrimAnalyzer>true</EnableTrimAnalyzer>\n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "Directory.Packages.props",
    "content": "﻿<Project>\n  <PropertyGroup>\n    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n    <AvaloniaVersion>11.0.0</AvaloniaVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageVersion Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Desktop\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Diagnostics\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.ReactiveUI\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Themes.Fluent\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Fonts.Inter\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Browser\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Headless.XUnit\" Version=\"$(AvaloniaVersion)\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageVersion Include=\"System.Reactive\" Version=\"6.0.0\" />\n    <PackageVersion Include=\"Microsoft.SourceLink.GitHub\" Version=\"1.0.0\" />\n    <PackageVersion Include=\"Nuke.Common\" Version=\"5.3.0\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "LICENSE.TXT",
    "content": "The MIT License (MIT)\n\nCopyright (c) Wiesław Šoltés\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "NuGet.Config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<configuration>\n  <packageSources>\n    <clear />\n    <add key=\"api.nuget.org\" value=\"https://api.nuget.org/v3/index.json\" />\n  </packageSources>\n</configuration>\n"
  },
  {
    "path": "README.md",
    "content": "# Repository was moved!\n\nNew location is https://github.com/wieslawsoltes/Avalonia.Xaml.Behaviors\n\n# Avalonia XAML Behaviors\n\n[![Gitter](https://badges.gitter.im/wieslawsoltes/AvaloniaBehaviors.svg)](https://gitter.im/wieslawsoltes/AvaloniaBehaviors?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n\n[![Build Status](https://dev.azure.com/wieslawsoltes/GitHub/_apis/build/status/wieslawsoltes.AvaloniaBehaviors?repoName=wieslawsoltes%2FAvaloniaBehaviors&branchName=master)](https://dev.azure.com/wieslawsoltes/GitHub/_build/latest?definitionId=90&repoName=wieslawsoltes%2FAvaloniaBehaviors&branchName=master)\n[![CI](https://github.com/wieslawsoltes/AvaloniaBehaviors/actions/workflows/build.yml/badge.svg)](https://github.com/wieslawsoltes/AvaloniaBehaviors/actions/workflows/build.yml)\n\n[![NuGet](https://img.shields.io/nuget/v/Avalonia.Xaml.Behaviors.svg)](https://www.nuget.org/packages/Avalonia.Xaml.Behaviors)\n[![NuGet](https://img.shields.io/nuget/dt/Avalonia.Xaml.Interactivity.svg)](https://www.nuget.org/packages/Avalonia.Xaml.Interactivity)\n[![MyGet](https://img.shields.io/myget/xamlbehaviors-nightly/vpre/Avalonia.Xaml.Behaviors.svg?label=myget)](https://www.myget.org/gallery/xamlbehaviors-nightly) \n\n**AvaloniaBehaviors** is a port of [Windows UWP](https://github.com/Microsoft/XamlBehaviors) version of XAML Behaviors for [Avalonia](https://github.com/AvaloniaUI/Avalonia) XAML.\n\nAvalonia XAML Behaviors is an easy-to-use means of adding common and reusable interactivity to your [Avalonia](https://github.com/AvaloniaUI/Avalonia) applications with minimal code. Avalonia port is available only for managed applications. Use of XAML Behaviors is governed by the MIT License. \n\n<a href='https://www.youtube.com/watch?v=pffBS-yQ_uM' target='_blank'>![](https://i.ytimg.com/vi/pffBS-yQ_uM/hqdefault.jpg)<a/>\n\n## Building Avalonia XAML Behaviors\n\nFirst, clone the repository or download the latest zip.\n```\ngit clone https://github.com/wieslawsoltes/AvaloniaBehaviors.git\n```\n\n### Build on Windows using script\n\n* [.NET Core](https://www.microsoft.com/net/download?initial-os=windows).\n\nOpen up a command-prompt and execute the commands:\n```\n.\\build.ps1\n```\n\n### Build on Linux using script\n\n* [.NET Core](https://www.microsoft.com/net/download?initial-os=linux).\n\nOpen up a terminal prompt and execute the commands:\n```\n./build.sh\n```\n\n### Build on OSX using script\n\n* [.NET Core](https://www.microsoft.com/net/download?initial-os=macos).\n\nOpen up a terminal prompt and execute the commands:\n```\n./build.sh\n```\n\n## NuGet\n\nAvalonia XamlBehaviors is delivered as a NuGet package.\n\nYou can find the packages here [NuGet](https://www.nuget.org/packages/Avalonia.Xaml.Behaviors/) and install the package like this:\n\n`Install-Package Avalonia.Xaml.Behaviors`\n\nor by using nightly build feed:\n* Add `https://www.myget.org/F/xamlbehaviors-nightly/api/v2` to your package sources\n* Alternative nightly build feed `https://pkgs.dev.azure.com/wieslawsoltes/GitHub/_packaging/Nightly/nuget/v3/index.json`\n* Update your package using `XamlBehaviors` feed\n\nand install the package like this:\n\n`Install-Package Avalonia.Xaml.Behaviors -Pre`\n\n### Package Sources\n\n* https://api.nuget.org/v3/index.json\n* https://www.myget.org/F/avalonia-ci/api/v2\n\n## Resources\n\n* [GitHub source code repository.](https://github.com/wieslawsoltes/AvaloniaBehaviors)\n\n## License\n\nAvalonia XAML Behaviors is licensed under the [MIT license](LICENSE.TXT).\n"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-cayman"
  },
  {
    "path": "azure-pipelines.yml",
    "content": "name: $(date:yyyyMMdd)$(rev:-rr)\n\nresources:\n  repositories:\n    - repository: templates\n      endpoint: wieslawsoltes\n      type: github\n      name: wieslawsoltes/BuildTemplates\n      ref: refs/tags/v2.0.0\n\nvariables:\n  BuildConfiguration: 'Release'\n  BuildPlatform: 'Any CPU'\n  PublishFramework: 'net8.0'\n  PublishProject: 'BehaviorsTestApplication'\n  PublishRuntime: ''\n\njobs:\n  - template: Test-PowerShell.yml@templates\n    parameters:\n      name: 'Test_Windows'\n      vmImage: 'windows-2022'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n\n  - template: Test-Bash.yml@templates\n    parameters:\n      name: 'Test_Linux'\n      vmImage: 'ubuntu-20.04'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n\n  - template: Test-Bash.yml@templates\n    parameters:\n      name: 'Test_macOS'\n      vmImage: 'macOS-11'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n\n  - template: Pack-MyGet.yml@templates\n    parameters:\n      name: 'Pack_MyGet'\n      vmImage: 'windows-2022'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n\n  - template: Pack-NuGet.yml@templates\n    parameters:\n      name: 'Pack_NuGet'\n      vmImage: 'windows-2022'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n\n  - template: Publish-PowerShell.yml@templates\n    parameters:\n      name: 'Publish_Windows'\n      vmImage: 'windows-2022'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n      PublishFramework: ${{ variables.PublishFramework }}\n      PublishProject: ${{ variables.PublishProject }}\n      PublishRuntime: 'win-x64'\n\n  - template: Publish-Bash.yml@templates\n    parameters:\n      name: 'Publish_Linux'\n      vmImage: 'ubuntu-20.04'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n      PublishFramework: ${{ variables.PublishFramework }}\n      PublishProject: ${{ variables.PublishProject }}\n      PublishRuntime: 'linux-x64'\n\n  - template: Publish-Bash.yml@templates\n    parameters:\n      name: 'Publish_macOS_x64'\n      vmImage: 'macOS-11'\n      BuildConfiguration: ${{ variables.BuildConfiguration }}\n      PublishFramework: ${{ variables.PublishFramework }}\n      PublishProject: ${{ variables.PublishProject }}\n      PublishRuntime: 'osx-x64'\n\n  - template: Publish-Bash.yml@templates\n    parameters:\n        name: 'Publish_macOS_arm64'\n        vmImage: 'macOS-11'\n        BuildConfiguration: ${{ variables.BuildConfiguration }}\n        PublishFramework: ${{ variables.PublishFramework }}\n        PublishProject: ${{ variables.PublishProject }}\n        PublishRuntime: 'osx-arm64'\n"
  },
  {
    "path": "build/SignAssembly.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <SignAssembly>True</SignAssembly>\n    <AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)\\behaviors.public.snk</AssemblyOriginatorKeyFile>\n    <DelaySign>false</DelaySign>\n    <PublicSign Condition=\" '$(OS)' != 'Windows_NT' \">true</PublicSign>\n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "build/SourceLink.props",
    "content": "<Project>\n  <PropertyGroup>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n    <IncludeSymbols>false</IncludeSymbols>\n    <EmbedUntrackedSources>true</EmbedUntrackedSources>\n    <DebugType>embedded</DebugType>\n    <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(TF_BUILD)' == 'true'\">\n    <ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(GITHUB_ACTIONS)' == 'true'\">\n    <ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.SourceLink.GitHub\" PrivateAssets=\"All\"/>\n  </ItemGroup>\n  <ItemGroup>\n    <SourceRoot Include=\"$([MSBuild]::EnsureTrailingSlash($(NuGetPackageRoot)))\" Condition=\"'$(NuGetPackageRoot)' != ''\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "build/XUnit.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <PackageReference Include=\"xunit\" />\n    <PackageReference Include=\"xunit.abstractions\" />\n    <PackageReference Include=\"xunit.assert\" />\n    <PackageReference Include=\"xunit.core\" />\n    <PackageReference Include=\"xunit.extensibility.core\" />\n    <PackageReference Include=\"xunit.extensibility.execution\" />\n    <PackageReference Include=\"xunit.runner.console\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "build/build/Build.cs",
    "content": "using System.Collections.Generic;\nusing Nuke.Common;\nusing Nuke.Common.Git;\nusing Nuke.Common.ProjectModel;\nusing Nuke.Common.Tools.DotNet;\nusing Nuke.Common.IO;\nusing static Nuke.Common.IO.FileSystemTasks;\nusing static Nuke.Common.IO.PathConstruction;\nusing static Nuke.Common.Tools.DotNet.DotNetTasks;\n\nclass Build : NukeBuild\n{\n    public static int Main() => Execute<Build>(x => x.Compile);\n\n    [Solution]\n    readonly Solution Solution;\n\n    [GitRepository]\n    readonly GitRepository GitRepository;\n\n    [Parameter(\"configuration\")]\n    public string Configuration { get; set; }\n\n    [Parameter(\"version-suffix\")]\n    public string VersionSuffix { get; set; }\n\n    [Parameter(\"publish-framework\")]\n    public string PublishFramework { get; set; }\n\n    [Parameter(\"publish-runtime\")]\n    public string PublishRuntime { get; set; }\n\n    [Parameter(\"publish-project\")]\n    public string PublishProject { get; set; }\n\n    [Parameter(\"publish-self-contained\")]\n    public bool PublishSelfContained { get; set; } = true;\n\n    AbsolutePath SourceDirectory => RootDirectory / \"src\";\n\n    AbsolutePath TestsDirectory => RootDirectory / \"tests\";\n\n    AbsolutePath ArtifactsDirectory => RootDirectory / \"artifacts\";\n\n    protected override void OnBuildInitialized()\n    {\n        Configuration = Configuration ?? \"Release\";\n        VersionSuffix = VersionSuffix ?? \"\";\n    }\n\n    private void DeleteDirectories(IReadOnlyCollection<string> directories)\n    {\n        foreach (var directory in directories)\n        {\n            DeleteDirectory(directory);\n        }\n    }\n\n    Target Clean => _ => _\n        .Executes(() =>\n        {\n            DeleteDirectories(GlobDirectories(SourceDirectory, \"**/bin\", \"**/obj\"));\n            DeleteDirectories(GlobDirectories(TestsDirectory, \"**/bin\", \"**/obj\"));\n            EnsureCleanDirectory(ArtifactsDirectory);\n        });\n\n    Target Restore => _ => _\n        .DependsOn(Clean)\n        .Executes(() =>\n        {\n            DotNetRestore(s => s\n                .SetProjectFile(Solution));\n        });\n\n    Target Compile => _ => _\n        .DependsOn(Restore)\n        .Executes(() =>\n        {\n            DotNetBuild(s => s\n                .SetProjectFile(Solution)\n                .SetConfiguration(Configuration)\n                .SetVersionSuffix(VersionSuffix)\n                .EnableNoRestore());\n        });\n\n    Target Test => _ => _\n        .DependsOn(Compile)\n        .Executes(() =>\n        {\n            DotNetTest(s => s\n                .SetProjectFile(Solution)\n                .SetConfiguration(Configuration)\n                .SetLoggers(\"trx\")\n                .SetResultsDirectory(ArtifactsDirectory / \"TestResults\")\n                .EnableNoBuild()\n                .EnableNoRestore());\n        });\n\n    Target Pack => _ => _\n        .DependsOn(Test)\n        .Executes(() =>\n        {\n            DotNetPack(s => s\n                .SetProject(Solution)\n                .SetConfiguration(Configuration)\n                .SetVersionSuffix(VersionSuffix)\n                .SetOutputDirectory(ArtifactsDirectory / \"NuGet\")\n                .EnableNoBuild()\n                .EnableNoRestore());\n        });\n\n    Target Publish => _ => _\n        .DependsOn(Test)\n        .Requires(() => PublishRuntime)\n        .Requires(() => PublishFramework)\n        .Requires(() => PublishProject)\n        .Executes(() =>\n        {\n            DotNetPublish(s => s\n                .SetProject(Solution.GetProject(PublishProject))\n                .SetConfiguration(Configuration)\n                .SetVersionSuffix(VersionSuffix)\n                .SetFramework(PublishFramework)\n                .SetRuntime(PublishRuntime)\n                .SetSelfContained(PublishSelfContained)\n                .SetOutput(ArtifactsDirectory / \"Publish\" / PublishProject + \"-\" + PublishFramework + \"-\" + PublishRuntime));\n        });\n}\n"
  },
  {
    "path": "build/build/_build.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>\n    <IsPackable>False</IsPackable>\n    <NoWarn>CS0649;CS0169</NoWarn>\n    <NukeTelemetryVersion>1</NukeTelemetryVersion>\n    <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Nuke.Common\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <NukeMetadata Include=\"**\\*.json\" Exclude=\"bin\\**;obj\\**\" />\n    <NukeExternalFiles Include=\"**\\*.*.ext\" Exclude=\"bin\\**;obj\\**\" />\n    <None Remove=\"*.ref;*.txt\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "build.cmd",
    "content": ":; set -eo pipefail\n:; SCRIPT_DIR=$(cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd)\n:; ${SCRIPT_DIR}/build.sh \"$@\"\n:; exit $?\n\n@ECHO OFF\npowershell -ExecutionPolicy ByPass -NoProfile -File \"%~dp0build.ps1\" %*\n"
  },
  {
    "path": "build.ps1",
    "content": "[CmdletBinding()]\nParam(\n    [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]\n    [string[]]$BuildArguments\n)\n\nWrite-Output \"PowerShell $($PSVersionTable.PSEdition) version $($PSVersionTable.PSVersion)\"\n\nSet-StrictMode -Version 2.0; $ErrorActionPreference = \"Stop\"; $ConfirmPreference = \"None\"; trap { Write-Error $_ -ErrorAction Continue; exit 1 }\n$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent\n\n###########################################################################\n# CONFIGURATION\n###########################################################################\n\n$BuildProjectFile = \"$PSScriptRoot\\build\\build\\_build.csproj\"\n$TempDirectory = \"$PSScriptRoot\\\\.nuke\\temp\"\n\n$DotNetGlobalFile = \"$PSScriptRoot\\\\global.json\"\n$DotNetInstallUrl = \"https://dot.net/v1/dotnet-install.ps1\"\n$DotNetChannel = \"Current\"\n\n$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1\n$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1\n$env:DOTNET_MULTILEVEL_LOOKUP = 0\n\n###########################################################################\n# EXECUTION\n###########################################################################\n\nfunction ExecSafe([scriptblock] $cmd) {\n    & $cmd\n    if ($LASTEXITCODE) { exit $LASTEXITCODE }\n}\n\n# If dotnet CLI is installed globally and it matches requested version, use for execution\nif ($null -ne (Get-Command \"dotnet\" -ErrorAction SilentlyContinue) -and `\n     $(dotnet --version) -and $LASTEXITCODE -eq 0) {\n    $env:DOTNET_EXE = (Get-Command \"dotnet\").Path\n}\nelse {\n    # Download install script\n    $DotNetInstallFile = \"$TempDirectory\\dotnet-install.ps1\"\n    New-Item -ItemType Directory -Path $TempDirectory -Force | Out-Null\n    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n    (New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile)\n\n    # If global.json exists, load expected version\n    if (Test-Path $DotNetGlobalFile) {\n        $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json)\n        if ($DotNetGlobal.PSObject.Properties[\"sdk\"] -and $DotNetGlobal.sdk.PSObject.Properties[\"version\"]) {\n            $DotNetVersion = $DotNetGlobal.sdk.version\n        }\n    }\n\n    # Install by channel or version\n    $DotNetDirectory = \"$TempDirectory\\dotnet-win\"\n    if (!(Test-Path variable:DotNetVersion)) {\n        ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath }\n    } else {\n        ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath }\n    }\n    $env:DOTNET_EXE = \"$DotNetDirectory\\dotnet.exe\"\n}\n\nWrite-Output \"Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)\"\n\nExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet }\nExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments }\n"
  },
  {
    "path": "build.sh",
    "content": "#!/usr/bin/env bash\n\nbash --version 2>&1 | head -n 1\n\nset -eo pipefail\nSCRIPT_DIR=$(cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd)\n\n###########################################################################\n# CONFIGURATION\n###########################################################################\n\nBUILD_PROJECT_FILE=\"$SCRIPT_DIR/build/build/_build.csproj\"\nTEMP_DIRECTORY=\"$SCRIPT_DIR//.nuke/temp\"\n\nDOTNET_GLOBAL_FILE=\"$SCRIPT_DIR//global.json\"\nDOTNET_INSTALL_URL=\"https://dot.net/v1/dotnet-install.sh\"\nDOTNET_CHANNEL=\"Current\"\n\nexport DOTNET_CLI_TELEMETRY_OPTOUT=1\nexport DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1\nexport DOTNET_MULTILEVEL_LOOKUP=0\n\n###########################################################################\n# EXECUTION\n###########################################################################\n\nfunction FirstJsonValue {\n    perl -nle 'print $1 if m{\"'\"$1\"'\": \"([^\"]+)\",?}' <<< \"${@:2}\"\n}\n\n# If dotnet CLI is installed globally and it matches requested version, use for execution\nif [ -x \"$(command -v dotnet)\" ] && dotnet --version &>/dev/null; then\n    export DOTNET_EXE=\"$(command -v dotnet)\"\nelse\n    # Download install script\n    DOTNET_INSTALL_FILE=\"$TEMP_DIRECTORY/dotnet-install.sh\"\n    mkdir -p \"$TEMP_DIRECTORY\"\n    curl -Lsfo \"$DOTNET_INSTALL_FILE\" \"$DOTNET_INSTALL_URL\"\n    chmod +x \"$DOTNET_INSTALL_FILE\"\n\n    # If global.json exists, load expected version\n    if [[ -f \"$DOTNET_GLOBAL_FILE\" ]]; then\n        DOTNET_VERSION=$(FirstJsonValue \"version\" \"$(cat \"$DOTNET_GLOBAL_FILE\")\")\n        if [[ \"$DOTNET_VERSION\" == \"\"  ]]; then\n            unset DOTNET_VERSION\n        fi\n    fi\n\n    # Install by channel or version\n    DOTNET_DIRECTORY=\"$TEMP_DIRECTORY/dotnet-unix\"\n    if [[ -z ${DOTNET_VERSION+x} ]]; then\n        \"$DOTNET_INSTALL_FILE\" --install-dir \"$DOTNET_DIRECTORY\" --channel \"$DOTNET_CHANNEL\" --no-path\n    else\n        \"$DOTNET_INSTALL_FILE\" --install-dir \"$DOTNET_DIRECTORY\" --version \"$DOTNET_VERSION\" --no-path\n    fi\n    export DOTNET_EXE=\"$DOTNET_DIRECTORY/dotnet\"\nfi\n\necho \"Microsoft (R) .NET Core SDK version $(\"$DOTNET_EXE\" --version)\"\n\n\"$DOTNET_EXE\" build \"$BUILD_PROJECT_FILE\" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet\n\"$DOTNET_EXE\" run --project \"$BUILD_PROJECT_FILE\" --no-build -- \"$@\"\n"
  },
  {
    "path": "global.json",
    "content": "{\n  \"sdk\": {\n    \"version\": \"8.0.100\",\n    \"rollForward\": \"latestMinor\",\n    \"allowPrerelease\": true\n  }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/App.axaml",
    "content": "<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             x:Class=\"BehaviorsTestApplication.App\"\n             Name=\"BehaviorsTestApplication\"\n             RequestedThemeVariant=\"Light\">\n    <Application.Resources>\n        <SolidColorBrush x:Key=\"BlackBrush\">Black</SolidColorBrush>\n        <SolidColorBrush x:Key=\"WhiteBrush\">White</SolidColorBrush>\n        <SolidColorBrush x:Key=\"GrayBrush\">Gray</SolidColorBrush>\n        <SolidColorBrush x:Key=\"RedBrush\">Red</SolidColorBrush>\n        <SolidColorBrush x:Key=\"GreenBrush\">Green</SolidColorBrush>\n        <SolidColorBrush x:Key=\"BlueBrush\">Blue</SolidColorBrush>\n        <SolidColorBrush x:Key=\"YellowBrush\">Yellow</SolidColorBrush>\n        <SolidColorBrush x:Key=\"PinkBrush\">Pink</SolidColorBrush>\n    </Application.Resources>\n    <Application.Styles>\n        <FluentTheme/>\n        <Style Selector=\"Button\">\n            <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\"/>\n            <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Stretch\"/>\n            <Setter Property=\"VerticalContentAlignment\" Value=\"Center\"/>\n        </Style>\n        <StyleInclude Source=\"/SideBar.axaml\"/>\n    </Application.Styles>\n</Application>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\nusing BehaviorsTestApplication.Views;\n\nnamespace BehaviorsTestApplication;\n\npublic class App : Application\n{\n    public override void Initialize()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n\n    public override void OnFrameworkInitializationCompleted()\n    {\n        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)\n        {\n            desktopLifetime.MainWindow = new MainWindow();\n        }\n        else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime)\n        {\n            singleViewLifetime.MainView = new MainView();\n        }\n        base.OnFrameworkInitializationCompleted();\n    }\n}"
  },
  {
    "path": "samples/BehaviorsTestApplication/BehaviorsTestApplication.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <GenerateAssemblyInfo>False</GenerateAssemblyInfo>\n    <IsPackable>False</IsPackable>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n    <PackageReference Include=\"Avalonia.Desktop\" />\n    <PackageReference Include=\"Avalonia.Diagnostics\" />\n    <PackageReference Include=\"Avalonia.Themes.Fluent\" />\n    <PackageReference Include=\"Avalonia.Fonts.Inter\" />\n    <PackageReference Include=\"Avalonia.ReactiveUI\" />\n  </ItemGroup>\n\n  <!--<Import Project=\"..\\..\\build\\SignAssembly.props\" />-->\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions\\Avalonia.Xaml.Interactions.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Custom\\Avalonia.Xaml.Interactions.Custom.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.DragAndDrop\\Avalonia.Xaml.Interactions.DragAndDrop.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Draggable\\Avalonia.Xaml.Interactions.Draggable.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Events\\Avalonia.Xaml.Interactions.Events.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Responsive\\Avalonia.Xaml.Interactions.Responsive.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Converters/ClassesToStringConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data.Converters;\n\nnamespace BehaviorsTestApplication.Converters;\n\npublic class ClassesToStringConverter : IMultiValueConverter\n{\n    public static ClassesToStringConverter Instance = new();\n\n    public object Convert(IList<object?>? values, Type targetType, object? parameter, CultureInfo culture)\n    {\n        if (values?.Count == 2 && values[0] is int && values[1] is Classes classes)\n        {\n            return string.Join(\" \", classes);\n        }\n\n        return AvaloniaProperty.UnsetValue;\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Program.cs",
    "content": "﻿using System;\nusing Avalonia;\nusing Avalonia.ReactiveUI;\nusing Avalonia.Xaml.Interactions.Core;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace BehaviorsTestApplication;\n\nclass Program\n{\n    [STAThread]\n    private static void Main(string[] args)\n    {\n        BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);\n    }\n\n    public static AppBuilder BuildAvaloniaApp()\n    {\n        GC.KeepAlive(typeof(Interaction).Assembly);\n        GC.KeepAlive(typeof(ComparisonConditionType).Assembly);\n        return AppBuilder.Configure<App>()\n            .UsePlatformDetect()\n            .UseReactiveUI()\n            .LogToTrace();\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/SideBar.axaml",
    "content": "<Styles xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n    <Design.PreviewWith>\n        <Border Padding=\"20\" Width=\"500\" Height=\"400\">\n            <TabControl Classes=\"sidebar\">\n                <TabItem Header=\"Item1\">\n                  <Button Content=\"Button\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" />\n                </TabItem>\n                <TabItem Header=\"Item2\">\n                  <TextBlock Text=\"Text\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" />\n                </TabItem>\n            </TabControl> \n        </Border>\n    </Design.PreviewWith>\n    <Style Selector=\"TabControl.sidebar\">\n      <Setter Property=\"TabStripPlacement\" Value=\"Left\" />\n      <Setter Property=\"Template\">\n          <ControlTemplate>\n            <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\n                    BorderThickness=\"{TemplateBinding BorderThickness}\"\n                    CornerRadius=\"{TemplateBinding CornerRadius}\"\n                    Background=\"{TemplateBinding Background}\"\n                    HorizontalAlignment=\"{TemplateBinding HorizontalAlignment}\"\n                    VerticalAlignment=\"{TemplateBinding VerticalAlignment}\">\n              <DockPanel>\n                <ScrollViewer>\n                  <ItemsPresenter Name=\"PART_ItemsPresenter\"\n                                  ItemsPanel=\"{TemplateBinding ItemsPanel}\"\n                                  DockPanel.Dock=\"{TemplateBinding TabStripPlacement}\"/>\n                </ScrollViewer>\n                <ContentPresenter Name=\"PART_SelectedContentHost\"\n                                  Margin=\"{TemplateBinding Padding}\"\n                                  HorizontalContentAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\n                                  VerticalContentAlignment=\"{TemplateBinding VerticalContentAlignment}\"\n                                  Content=\"{TemplateBinding SelectedContent}\"\n                                  ContentTemplate=\"{TemplateBinding SelectedContentTemplate}\" />\n              </DockPanel>\n            </Border>\n          </ControlTemplate>\n        </Setter>\n    </Style>\n</Styles>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/ViewModels/Core/ViewModelBase.cs",
    "content": "﻿using ReactiveUI;\n\nnamespace BehaviorsTestApplication.ViewModels.Core;\n\npublic abstract class ViewModelBase : ReactiveObject\n{\n}"
  },
  {
    "path": "samples/BehaviorsTestApplication/ViewModels/ItemViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing BehaviorsTestApplication.ViewModels.Core;\nusing ReactiveUI;\n\nnamespace BehaviorsTestApplication.ViewModels;\n\npublic class ItemViewModel(string name) : ViewModelBase\n{\n    private ObservableCollection<ItemViewModel>? _items;\n\n    public string Name\n    {\n        get => name;\n        set => this.RaiseAndSetIfChanged(ref name, value);\n    }\n\n    public ObservableCollection<ItemViewModel>? Items\n    {\n        get => _items;\n        set => this.RaiseAndSetIfChanged(ref _items, value);\n    }\n\n    public override string ToString() => name;\n}"
  },
  {
    "path": "samples/BehaviorsTestApplication/ViewModels/MainWindowViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Reactive.Linq;\nusing System.Windows.Input;\nusing BehaviorsTestApplication.ViewModels.Core;\nusing ReactiveUI;\n\nnamespace BehaviorsTestApplication.ViewModels;\n\npublic class MainWindowViewModel : ViewModelBase\n{\n    private int _value;\n    private int _count;\n    private double _position;\n    private ObservableCollection<ItemViewModel>? _items;\n\n    public int Count\n    {\n        get => _count;\n        set => this.RaiseAndSetIfChanged(ref _count, value);\n    }\n\n    public double Position\n    {\n        get => _position;\n        set => this.RaiseAndSetIfChanged(ref _position, value);\n    }\n\n    public ObservableCollection<ItemViewModel>? Items\n    {\n        get => _items;\n        set => this.RaiseAndSetIfChanged(ref _items, value);\n    }\n\n    public IObservable<int> Values { get; }\n\n    public ICommand MoveLeftCommand { get; set; }\n\n    public ICommand MoveRightCommand { get; set; }\n\n    public ICommand ResetMoveCommand { get; set; }\n\n    public MainWindowViewModel()\n    {\n        Count = 0;\n        Position = 100.0;\n        MoveLeftCommand = ReactiveCommand.Create(() => Position -= 5.0);\n        MoveRightCommand = ReactiveCommand.Create(() => Position += 5.0);\n        ResetMoveCommand = ReactiveCommand.Create(() => Position = 100.0);\n        Items = new ObservableCollection<ItemViewModel>()\n        {\n            new(\"First Item\")\n            {\n                Items = new ObservableCollection<ItemViewModel>()\n                {\n                    new(\"First Item Sub Item 1\"),\n                    new(\"First Item Sub Item 2\"),\n                    new(\"First Item Sub Item 3\"),\n                }\n            },\n            new(\"Second Item\")\n            {\n                Items = new ObservableCollection<ItemViewModel>()\n                {\n                    new(\"Second Item Sub Item 1\"),\n                    new(\"Second Item Sub Item 2\"),\n                    new(\"Second Item Sub Item 3\"),\n                }\n            },\n            new(\"Third Item\")\n            {\n                Items = new ObservableCollection<ItemViewModel>()\n                {\n                    new(\"Third Item Sub Item 1\"),\n                    new(\"Third Item Sub Item 2\"),\n                    new(\"Third Item Sub Item 3\"),\n                }\n            },\n            new(\"Fourth Item\")\n            {\n                Items = new ObservableCollection<ItemViewModel>()\n                {\n                    new(\"Fourth Item Sub Item 1\"),\n                    new(\"Fourth Item Sub Item 2\"),\n                    new(\"Fourth Item Sub Item 3\"),\n                }\n            },\n            new(\"Fifth Item\")\n            {\n                Items = new ObservableCollection<ItemViewModel>()\n                {\n                    new(\"Fifth Item Sub Item 1\"),\n                    new(\"Fifth Item Sub Item 2\"),\n                    new(\"Fifth Item Sub Item 3\"),\n                }\n            },\n            new(\"Sixth Item\")\n            {\n                Items = new ObservableCollection<ItemViewModel>()\n                {\n                    new(\"Sixth Item Sub Item 1\"),\n                    new(\"Sixth Item Sub Item 2\"),\n                    new(\"Sixth Item Sub Item 3\"),\n                }\n            },\n        };\n\n        Values = Observable.Interval(TimeSpan.FromSeconds(1)).Select(_ => _value++);\n    }\n\n    public void IncrementCount() => Count++;\n\n    public void DecrementCount(object? sender, object parameter) => Count--;\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/ItemView.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:iac=\"clr-namespace:Avalonia.Xaml.Interactions.Custom;assembly=Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:ItemViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"BehaviorsTestApplication.Views.ItemView\">\n  <Panel Background=\"Transparent\">\n    <i:Interaction.Behaviors>\n      <iac:ShowOnDoubleTappedBehavior TargetControl=\"TextBoxEdit\" />\n      <iac:ShowOnKeyDownBehavior TargetControl=\"TextBoxEdit\" Key=\"F2\" />\n    </i:Interaction.Behaviors>\n    <TextBox x:Name=\"TextBoxEdit\"\n             IsVisible=\"False\"\n             Height=\"{Binding #TextStackPanel.Bounds.Height}\"\n             VerticalContentAlignment=\"Center\"\n             VerticalAlignment=\"Center\"\n             Margin=\"0\"\n             Padding=\"6,0,6,0\"\n             BorderThickness=\"0\"\n             Text=\"{Binding Name, Mode=TwoWay}\">\n      <i:Interaction.Behaviors>\n        <iac:HideOnKeyPressedBehavior TargetControl=\"TextBoxEdit\" Key=\"Escape\" />\n        <iac:HideOnKeyPressedBehavior TargetControl=\"TextBoxEdit\" Key=\"Enter\" />\n        <iac:HideOnLostFocusBehavior TargetControl=\"TextBoxEdit\" />\n        <iac:SelectAllOnGotFocusBehavior />\n      </i:Interaction.Behaviors>\n    </TextBox>\n    <StackPanel x:Name=\"TextStackPanel\"\n                Orientation=\"Horizontal\"\n                Background=\"Transparent\"\n                Focusable=\"True\"\n                IsVisible=\"{Binding !#TextBoxEdit.IsVisible}\">\n      <TextBlock x:Name=\"StyleTextBlock\"\n                 Text=\"{Binding Name}\"\n                 Margin=\"6,8,6,8\" />\n    </StackPanel>\n  </Panel>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/ItemView.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views;\n\npublic partial class ItemView : UserControl\n{\n    public ItemView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/MainView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.MainView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:pages=\"using:BehaviorsTestApplication.Views.Pages\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"1000\" d:DesignHeight=\"700\"\n             FontFamily=\"avares://Avalonia.Fonts.Inter/Assets#Inter\">\n  <UserControl.Styles>\n    <Style Selector=\"TabItem\">\n      <Setter Property=\"FontSize\" Value=\"16\" />\n    </Style>\n  </UserControl.Styles>\n  <TabControl Classes=\"sidebar\">\n    <TabItem Header=\"CallMethodAction\">\n      <pages:CallMethodActionView />\n    </TabItem>\n    <TabItem Header=\"ChangePropertyAction\">\n      <pages:ChangePropertyActionView />\n    </TabItem>\n    <TabItem Header=\"DataTriggerBehavior\">\n      <pages:DataTriggerBehaviorView />\n    </TabItem>\n    <TabItem Header=\"ValueChangedTriggerBehavior\">\n      <pages:ValueChangedTriggerBehaviorView />\n    </TabItem>\n    <TabItem Header=\"EventTriggerBehavior\">\n      <pages:EventTriggerBehaviorView />\n    </TabItem>\n    <TabItem Header=\"InvokeCommandAction\">\n      <pages:InvokeCommandActionView />\n    </TabItem>\n    <TabItem Header=\"RoutedEventTriggerBehavior\">\n      <pages:RoutedEventTriggerBehaviorView />\n    </TabItem>\n    <TabItem Header=\"ChangeAvaloniaPropertyAction\">\n      <pages:ChangeAvaloniaPropertyActionView />\n    </TabItem>\n    <TabItem Header=\"Custom Action\">\n      <pages:CustomActionView />\n    </TabItem>\n    <TabItem Header=\"Custom Behavior\">\n      <pages:CustomBehaviorView />\n    </TabItem>\n    <TabItem Header=\"ButtonClickEventTriggerBehavior\">\n      <pages:ButtonClickEventTriggerBehaviorView />\n    </TabItem>\n    <TabItem Header=\"Advanced Behavior\">\n      <pages:AdvancedView />\n    </TabItem>\n    <TabItem Header=\"Add/RemoveClassAction\">\n      <pages:AddRemoveClassActionView />\n    </TabItem>\n    <TabItem Header=\"AdaptiveBehavior\">\n      <pages:AdaptiveBehaviorView />\n    </TabItem>\n    <TabItem Header=\"EditableListBox\">\n      <pages:EditableListBoxView />\n    </TabItem>\n    <TabItem Header=\"EditableTree\">\n      <pages:EditableTreeViewView />\n    </TabItem>\n  </TabControl>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/MainView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views;\n\npublic partial class MainView : UserControl\n{\n    public MainView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/MainWindow.axaml",
    "content": "<Window x:Class=\"BehaviorsTestApplication.Views.MainWindow\"\n        xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:views=\"using:BehaviorsTestApplication.Views\"\n        Title=\"XamlBehaviors Test Application\" Width=\"1000\" Height=\"700\">\n  <views:MainView />\n</Window>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/MainWindow.axaml.cs",
    "content": "﻿using BehaviorsTestApplication.ViewModels;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views;\n\npublic partial class MainWindow : Window\n{\n    public MainWindow()\n    {\n        InitializeComponent();\n        DataContext = new MainWindowViewModel();\n        this.AttachDevTools();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/AdaptiveBehaviorView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.AdaptiveBehaviorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ir=\"clr-namespace:Avalonia.Xaml.Interactions.Responsive;assembly=Avalonia.Xaml.Interactions.Responsive\"\n             xmlns:converters=\"using:BehaviorsTestApplication.Converters\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"500\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n\n  <UserControl.Styles>\n\n    <!-- Adaptive SplitView -->\n\n    <Style Selector=\"SplitView.adaptive\">\n      <Setter Property=\"PanePlacement\" Value=\"Left\" />\n      <Setter Property=\"CompactPaneLength\" Value=\"80\" />\n      <Setter Property=\"OpenPaneLength\" Value=\"200\" />\n      <Setter Property=\"PaneBackground\" Value=\"Transparent\" />\n      <Setter Property=\"IsPaneOpen\" Value=\"False\" />\n      <Setter Property=\"DisplayMode\" Value=\"Inline\" />\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <ir:AdaptiveBehavior SourceControl=\"{Binding $parent[TopLevel]}\">\n              <ir:AdaptiveClassSetter MinWidth=\"0\" MaxWidth=\"500\" ClassName=\"small\" />\n              <ir:AdaptiveClassSetter MinWidth=\"500\" MaxWidth=\"900\" ClassName=\"medium\" />\n              <ir:AdaptiveClassSetter MinWidth=\"900\" MaxWidth=\"Infinity\" ClassName=\"wide\" />\n            </ir:AdaptiveBehavior>\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n    <Style Selector=\"SplitView.small\">\n      <Setter Property=\"IsPaneOpen\" Value=\"False\" />\n      <Setter Property=\"DisplayMode\" Value=\"Inline\" />\n    </Style>\n    <Style Selector=\"SplitView.medium\">\n      <Setter Property=\"IsPaneOpen\" Value=\"False\" />\n      <Setter Property=\"DisplayMode\" Value=\"CompactInline\" />\n    </Style>\n    <Style Selector=\"SplitView.wide\">\n      <Setter Property=\"IsPaneOpen\" Value=\"True\" />\n      <Setter Property=\"DisplayMode\" Value=\"Inline\" />\n    </Style>\n\n    <!-- Responsive StackPanel -->\n\n    <Style Selector=\"StackPanel.responsive\">\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <ir:AdaptiveBehavior SourceControl=\"{Binding $parent[TopLevel]}\">\n            <ir:AdaptiveClassSetter MinWidth=\"0\" MinWidthOperator=\"GreaterThanOrEqual\" MaxWidth=\"500\" MaxWidthOperator=\"LessThan\" ClassName=\"small\" />\n            <ir:AdaptiveClassSetter MinWidth=\"500\" MinWidthOperator=\"GreaterThanOrEqual\" MaxWidth=\"700\" MaxWidthOperator=\"LessThan\" ClassName=\"medium\" />\n            <ir:AdaptiveClassSetter MinWidth=\"700\" MinWidthOperator=\"GreaterThanOrEqual\" MaxWidth=\"900\" MaxWidthOperator=\"LessThan\" ClassName=\"large\" />\n            <ir:AdaptiveClassSetter MinWidth=\"900\" MinWidthOperator=\"GreaterThanOrEqual\" MaxWidth=\"Infinity\" MaxWidthOperator=\"LessThan\" ClassName=\"wide\" />\n            <ir:AdaptiveClassSetter MinHeight=\"0\" MinWidthOperator=\"GreaterThanOrEqual\" MaxHeight=\"600\" MaxWidthOperator=\"LessThan\" ClassName=\":short\" IsPseudoClass=\"True\" />\n            <ir:AdaptiveClassSetter MinHeight=\"600\" MinWidthOperator=\"GreaterThanOrEqual\" MaxHeight=\"Infinity\" MaxWidthOperator=\"LessThan\" ClassName=\":tall\" IsPseudoClass=\"True\" />\n            <ir:AdaptiveClassSetter MinWidth=\"1280\" MinHeight=\"720\" ClassName=\":hd-ready\" IsPseudoClass=\"True\" />\n            </ir:AdaptiveBehavior>\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n    <Style Selector=\"StackPanel:short\">\n      <Setter Property=\"Background\" Value=\"LightGray\" />\n    </Style>\n    <Style Selector=\"StackPanel:tall\">\n      <Setter Property=\"Background\" Value=\"DarkGray\" />\n    </Style>\n    <Style Selector=\"StackPanel:pointerover:short\">\n      <Setter Property=\"Background\" Value=\"Yellow\" />\n    </Style>\n    <Style Selector=\"StackPanel:pointerover:tall\">\n      <Setter Property=\"Background\" Value=\"Cyan\" />\n    </Style>\n    <Style Selector=\"StackPanel\">\n      <Setter Property=\"Spacing\" Value=\"0\" />\n      <Setter Property=\"(TextBlock.Foreground)\" Value=\"Black\" />\n    </Style>\n    <Style Selector=\"StackPanel.small\">\n      <Setter Property=\"Spacing\" Value=\"10\" />\n      <Setter Property=\"(TextBlock.Foreground)\" Value=\"Purple\" />\n    </Style>\n    <Style Selector=\"StackPanel.medium\">\n      <Setter Property=\"Spacing\" Value=\"20\" />\n      <Setter Property=\"(TextBlock.Foreground)\" Value=\"Red\" />\n    </Style>\n    <Style Selector=\"StackPanel.large\">\n      <Setter Property=\"Spacing\" Value=\"30\" />\n      <Setter Property=\"(TextBlock.Foreground)\" Value=\"Blue\" />\n    </Style>\n    <Style Selector=\"StackPanel.wide\">\n      <Setter Property=\"Spacing\" Value=\"40\" />\n      <Setter Property=\"(TextBlock.Foreground)\" Value=\"Green\" />\n    </Style>\n\n  </UserControl.Styles>\n\n  <SplitView Classes=\"adaptive\" Name=\"AdaptiveSplitView\">\n\n    <SplitView.Pane>\n      <Border Margin=\"5\" Background=\"Gray\" />\n    </SplitView.Pane>\n\n    <DockPanel Background=\"{DynamicResource GrayBrush}\" Margin=\"0,5,0,5\">\n      <StackPanel Orientation=\"Horizontal\" Spacing=\"5\" Margin=\"5\" DockPanel.Dock=\"Bottom\">\n        <TextBlock Text=\"Width: \" />\n        <TextBlock Text=\"{Binding $parent[TopLevel].Bounds.Width}\" />\n        <TextBlock Text=\" Height: \" />\n        <TextBlock Text=\"{Binding $parent[TopLevel].Bounds.Height}\" />\n        <TextBlock Text=\" Classes: \" />\n        <TextBlock>\n          <TextBlock.Text>\n            <MultiBinding Converter=\"{x:Static converters:ClassesToStringConverter.Instance}\">\n              <Binding ElementName=\"ResponsiveStackPanel\" Path=\"Classes.Count\" />\n              <Binding ElementName=\"ResponsiveStackPanel\" Path=\"Classes\" />\n            </MultiBinding>\n          </TextBlock.Text>\n        </TextBlock>\n      </StackPanel>\n      <StackPanel Classes=\"responsive\" Name=\"ResponsiveStackPanel\" Margin=\"5\">\n        <TextBlock Text=\"Item1\" />\n        <TextBlock Text=\"Item2\" />\n        <TextBlock Text=\"Item3\" />\n        <TextBlock Text=\"Item4\" />\n        <TextBlock Text=\"Item5\" />\n        <TextBlock Text=\"Item7\" />\n        <TextBlock Text=\"Item8\" />\n      </StackPanel>\n    </DockPanel>\n\n  </SplitView>\n\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/AdaptiveBehaviorView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class AdaptiveBehaviorView : UserControl\n{\n    public AdaptiveBehaviorView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/AddRemoveClassActionView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.AddRemoveClassActionView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:iac=\"clr-namespace:Avalonia.Xaml.Interactions.Custom;assembly=Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid Background=\"{DynamicResource GrayBrush}\" Margin=\"5\">\n    <StackPanel Name=\"ResponsiveStackPanel\">\n      <StackPanel.Styles>\n        <Style Selector=\"StackPanel\">\n          <Setter Property=\"Spacing\" Value=\"20\" />\n          <Setter Property=\"Orientation\" Value=\"Horizontal\" />\n        </Style>\n        <Style Selector=\"StackPanel.vertical\">\n          <Setter Property=\"Spacing\" Value=\"10\" />\n          <Setter Property=\"Orientation\" Value=\"Vertical\" />\n        </Style>\n      </StackPanel.Styles>\n      <i:Interaction.Behaviors>\n        <ia:DataTriggerBehavior Binding=\"{Binding #ResponsiveStackPanel.Bounds.Width}\" \n                                ComparisonCondition=\"LessThan\"\n                                Value=\"500\">\n          <iac:AddClassAction StyledElement=\"ResponsiveStackPanel\" \n                              ClassName=\"vertical\"\n                              RemoveIfExists=\"True\" />\n        </ia:DataTriggerBehavior>\n        <ia:DataTriggerBehavior Binding=\"{Binding #ResponsiveStackPanel.Bounds.Width}\"\n                                ComparisonCondition=\"GreaterThanOrEqual\" Value=\"500\">\n          <iac:RemoveClassAction StyledElement=\"ResponsiveStackPanel\"\n                                 ClassName=\"vertical\" />\n        </ia:DataTriggerBehavior>\n      </i:Interaction.Behaviors>\n      <TextBlock Text=\"Item1\" />\n      <TextBlock Text=\"Item2\" />\n      <TextBlock Text=\"Item3\" />\n      <TextBlock Text=\"Item4\" />\n      <TextBlock Text=\"Item5\" />\n      <TextBlock Text=\"Item7\" />\n      <TextBlock Text=\"Item8\" />\n    </StackPanel>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/AddRemoveClassActionView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class AddRemoveClassActionView : UserControl\n{\n    public AddRemoveClassActionView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/AdvancedView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.AdvancedView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"Auto,*\" ColumnDefinitions=\"*\">\n    <Border x:Name=\"Button\" \n            Background=\"{DynamicResource GreenBrush}\" \n            Width=\"100\" Height=\"50\" \n            Grid.Row=\"1\" Grid.Column=\"0\" \n            Margin=\"5,0,0,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"PointerPressed\" \n                                 SourceObject=\"Button\">\n          <ia:ChangePropertyAction TargetObject=\"Button\" \n                                   PropertyName=\"Background\"\n                                   Value=\"{DynamicResource RedBrush}\" />\n          <ia:ChangePropertyAction TargetObject=\"Text\" \n                                   PropertyName=\"Foreground\"\n                                   Value=\"{DynamicResource YellowBrush}\" />\n          <ia:CallMethodAction TargetObject=\"{Binding}\" \n                               MethodName=\"IncrementCount\" />\n        </ia:EventTriggerBehavior>\n        <ia:EventTriggerBehavior EventName=\"PointerReleased\" \n                                 SourceObject=\"Button\">\n          <ia:ChangePropertyAction TargetObject=\"Button\" \n                                   PropertyName=\"Background\"\n                                   Value=\"{DynamicResource GreenBrush}\" />\n          <ia:ChangePropertyAction TargetObject=\"Text\" \n                                   PropertyName=\"Foreground\"\n                                   Value=\"{DynamicResource WhiteBrush}\" />\n          <ia:CallMethodAction TargetObject=\"{Binding}\"\n                               MethodName=\"DecrementCount\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n      <TextBlock x:Name=\"Text\" \n                 Text=\"{Binding Count}\" \n                 Foreground=\"{DynamicResource WhiteBrush}\"\n                 VerticalAlignment=\"Center\" \n                 HorizontalAlignment=\"Center\" />\n    </Border>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/AdvancedView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class AdvancedView : UserControl\n{\n    public AdvancedView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ButtonClickEventTriggerBehaviorView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.ButtonClickEventTriggerBehaviorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:ic=\"using:Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Grid RowDefinitions=\"*,Auto\" ColumnDefinitions=\"30*,5,30*,5,30*\">\n    <Canvas Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"5\" \n            Margin=\"5\" \n            Background=\"{DynamicResource GrayBrush}\">\n      <Ellipse Canvas.Left=\"{Binding Position, Mode=TwoWay}\" \n               Canvas.Top=\"200\" \n               Fill=\"{DynamicResource RedBrush}\"\n               Stroke=\"{DynamicResource YellowBrush}\" \n               StrokeThickness=\"5\" \n               Height=\"100\" Width=\"100\" />\n    </Canvas>\n    <Button Content=\"Left (Hold Control), Reset (Hold Shift), Right (Hold Control+Shift)\" \n            Grid.Row=\"1\" Grid.Column=\"0\" Grid.ColumnSpan=\"5\" \n            Margin=\"5,0,0,5\">\n      <i:Interaction.Behaviors>\n        <ic:ButtonClickEventTriggerBehavior KeyModifiers=\"Control\">\n          <ia:InvokeCommandAction Command=\"{Binding MoveLeftCommand}\" />\n        </ic:ButtonClickEventTriggerBehavior>\n        <ic:ButtonClickEventTriggerBehavior KeyModifiers=\"Shift\">\n          <ia:InvokeCommandAction Command=\"{Binding ResetMoveCommand}\" />\n        </ic:ButtonClickEventTriggerBehavior>\n        <ic:ButtonClickEventTriggerBehavior KeyModifiers=\"Control,Shift\">\n          <ia:InvokeCommandAction Command=\"{Binding MoveRightCommand}\" />\n        </ic:ButtonClickEventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ButtonClickEventTriggerBehaviorView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class ButtonClickEventTriggerBehaviorView : UserControl\n{\n    public ButtonClickEventTriggerBehaviorView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/CallMethodActionView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.CallMethodActionView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"*,Auto\" ColumnDefinitions=\"30*,5,30*,5,30*\">\n    <Border Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"5\" \n            Margin=\"5\"\n            Background=\"{DynamicResource PinkBrush}\" \n            BorderBrush=\"{DynamicResource GrayBrush}\"\n            BorderThickness=\"5\">\n      <TextBlock Text=\"{Binding Count}\" \n                 FontSize=\"100\" \n                 VerticalAlignment=\"Center\" \n                 HorizontalAlignment=\"Center\"\n                 Foreground=\"{DynamicResource YellowBrush}\" />\n    </Border>\n    <Button x:Name=\"DecrementButton\" Content=\"Decrement\" Grid.Row=\"1\" Grid.Column=\"0\" Margin=\"5,0,0,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"DecrementButton\">\n          <ia:CallMethodAction TargetObject=\"{Binding}\" MethodName=\"DecrementCount\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n    <Button Name=\"ResetButton\" Content=\"Reset\" Grid.Row=\"1\" Grid.Column=\"2\" Margin=\"0,0,0,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"ResetButton\">\n          <ia:ChangePropertyAction TargetObject=\"{Binding}\" PropertyName=\"Count\" Value=\"0\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n    <Button x:Name=\"IncrementButton\" Content=\"Increment\" Grid.Row=\"1\" Grid.Column=\"4\" Margin=\"0,0,5,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"IncrementButton\">\n          <ia:CallMethodAction TargetObject=\"{Binding}\" MethodName=\"IncrementCount\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/CallMethodActionView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class CallMethodActionView : UserControl\n{\n    public CallMethodActionView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ChangeAvaloniaPropertyActionView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.ChangeAvaloniaPropertyActionView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:iac=\"clr-namespace:Avalonia.Xaml.Interactions.Custom;assembly=Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"*,Auto\" ColumnDefinitions=\"50*,5,50*\">\n    <Rectangle Name=\"ChangePropertyRectangle\" \n               Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"3\" \n               Margin=\"5\"\n               Fill=\"{DynamicResource PinkBrush}\" \n               Stroke=\"{DynamicResource GrayBrush}\" \n               StrokeThickness=\"5\" />\n    <Button Name=\"PinkButton\" Content=\"Pink\" Grid.Row=\"1\" Grid.Column=\"0\" Margin=\"5,0,0,5\">\n      <i:Interaction.Behaviors>\n        <iac:RoutedEventTriggerBehavior RoutedEvent=\"{x:Static Button.ClickEvent}\"\n                                        RoutingStrategies=\"Bubble\"\n                                        SourceInteractive=\"PinkButton\">\n          <iac:ChangeAvaloniaPropertyAction TargetObject=\"ChangePropertyRectangle\" \n                                            TargetProperty=\"{x:Static Shape.FillProperty}\"\n                                            Value=\"{DynamicResource PinkBrush}\" />\n        </iac:RoutedEventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n    <Button Name=\"YellowButton\" Content=\"Yellow\" Grid.Row=\"1\" Grid.Column=\"2\" Margin=\"0,0,5,5\">\n      <i:Interaction.Behaviors>\n        <iac:RoutedEventTriggerBehavior RoutedEvent=\"{x:Static Button.ClickEvent}\"\n                                        RoutingStrategies=\"Bubble\"\n                                        SourceInteractive=\"YellowButton\">\n          <iac:ChangeAvaloniaPropertyAction TargetObject=\"ChangePropertyRectangle\" \n                                            TargetProperty=\"{x:Static Shape.FillProperty}\"\n                                            Value=\"{DynamicResource YellowBrush}\" />\n        </iac:RoutedEventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ChangeAvaloniaPropertyActionView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class ChangeAvaloniaPropertyActionView : UserControl\n{\n    public ChangeAvaloniaPropertyActionView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ChangePropertyActionView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.ChangePropertyActionView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"*,Auto\" ColumnDefinitions=\"50*,5,50*\">\n    <Rectangle Name=\"ChangePropertyRectangle\" \n               Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"3\" \n               Margin=\"5\"\n               Fill=\"{DynamicResource PinkBrush}\" \n               Stroke=\"{DynamicResource GrayBrush}\" \n               StrokeThickness=\"5\" />\n    <Button Name=\"PinkButton\" Content=\"Pink\" Grid.Row=\"1\" Grid.Column=\"0\" Margin=\"5,0,0,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"PinkButton\">\n          <ia:ChangePropertyAction TargetObject=\"ChangePropertyRectangle\" \n                                   PropertyName=\"Fill\"\n                                   Value=\"{DynamicResource PinkBrush}\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n    <Button Name=\"YellowButton\" Content=\"Yellow\" Grid.Row=\"1\" Grid.Column=\"2\" Margin=\"0,0,5,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"YellowButton\">\n          <ia:ChangePropertyAction TargetObject=\"ChangePropertyRectangle\" \n                                   PropertyName=\"Fill\"\n                                   Value=\"{DynamicResource YellowBrush}\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ChangePropertyActionView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class ChangePropertyActionView : UserControl\n{\n    public ChangePropertyActionView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/CustomActionView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.CustomActionView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:iac=\"clr-namespace:Avalonia.Xaml.Interactions.Custom;assembly=Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"Auto,*\">\n    <TextBlock Text=\"Move Pointer\" \n               Name=\"Position\"\n               Grid.Row=\"0\" \n               Margin=\"5\" \n               Background=\"{DynamicResource GrayBrush}\"\n               Foreground=\"{DynamicResource YellowBrush}\" \n               FontSize=\"14\" \n               TextAlignment=\"Center\"\n               HorizontalAlignment=\"Stretch\" \n               VerticalAlignment=\"Stretch\" />\n    <Border Name=\"Border\" \n            Grid.Row=\"1\" \n            Margin=\"5,0,5,5\" \n            Background=\"{DynamicResource GrayBrush}\"\n            HorizontalAlignment=\"Stretch\" \n            VerticalAlignment=\"Stretch\">\n      <i:Interaction.Behaviors>\n        <iac:ShowPointerPositionBehavior TargetTextBlock=\"Position\" />\n        <ia:EventTriggerBehavior EventName=\"PointerPressed\" SourceObject=\"Border\">\n          <iac:PopupAction>\n            <Border DataContext=\"{Binding Count}\" \n                    Width=\"300\" Height=\"200\" \n                    Background=\"Yellow\" \n                    BorderBrush=\"Red\"\n                    BorderThickness=\"1\" \n                    Padding=\"5\">\n              <StackPanel Orientation=\"Horizontal\">\n                <TextBlock Text=\"Count: \" Foreground=\"Red\" />\n                <TextBlock Text=\"{Binding}\" Foreground=\"Red\" />\n              </StackPanel>\n            </Border>\n          </iac:PopupAction>\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n      <TextBlock Text=\"Click Me\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" FontSize=\"20\" />\n    </Border>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/CustomActionView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class CustomActionView : UserControl\n{\n    public CustomActionView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/CustomBehaviorView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.CustomBehaviorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:iac=\"clr-namespace:Avalonia.Xaml.Interactions.Custom;assembly=Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <UserControl.Styles>\n    <Style Selector=\"Canvas.drag > :is(Control)\">\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <iac:DragControlBehavior />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n  </UserControl.Styles>\n  <DockPanel>\n    <Canvas Classes=\"drag\" Width=\"300\" Height=\"300\" Background=\"{DynamicResource GrayBrush}\" Margin=\"5\">\n      <Rectangle Fill=\"Blue\" Width=\"60\" Height=\"40\" Canvas.Left=\"20\" Canvas.Top=\"100\" />\n      <Ellipse Fill=\"Red\" Width=\"50\" Height=\"50\" Canvas.Left=\"120\" Canvas.Top=\"30\" />\n      <TextBlock Text=\"Hello from Avalonia\" Canvas.Left=\"40\" Canvas.Top=\"200\" />\n      <Panel Background=\"Purple\" Width=\"80\" Height=\"70\" Canvas.Left=\"200\" Canvas.Top=\"150\" />\n    </Canvas>\n    <Grid Background=\"{DynamicResource GrayBrush}\" Margin=\"5\">\n      <Ellipse Fill=\"{DynamicResource RedBrush}\" \n               Stroke=\"{DynamicResource BlackBrush}\"\n               Height=\"125\" Width=\"125\"\n               StrokeThickness=\"0\" \n               HorizontalAlignment=\"Left\">\n        <i:Interaction.Behaviors>\n          <iac:DragControlBehavior />\n        </i:Interaction.Behaviors>\n      </Ellipse>\n      <Ellipse Fill=\"{DynamicResource BlueBrush}\" \n               Stroke=\"{DynamicResource BlackBrush}\" \n               Height=\"125\" Width=\"125\"\n               StrokeThickness=\"0\" \n               HorizontalAlignment=\"Right\">\n        <i:Interaction.Behaviors>\n          <iac:DragControlBehavior />\n        </i:Interaction.Behaviors>\n      </Ellipse>\n    </Grid>\n  </DockPanel>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/CustomBehaviorView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class CustomBehaviorView : UserControl\n{\n    public CustomBehaviorView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/DataTriggerBehaviorView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.DataTriggerBehaviorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"*,Auto\">\n    <Rectangle Name=\"DataTriggerRectangle\" \n               Grid.Row=\"0\" Margin=\"5\"\n               Fill=\"{DynamicResource BlueBrush}\"\n               Stroke=\"{DynamicResource GrayBrush}\"\n               StrokeThickness=\"5\">\n      <i:Interaction.Behaviors>\n        <ia:DataTriggerBehavior Binding=\"{Binding #Slider.Value}\" \n                                ComparisonCondition=\"GreaterThan\" \n                                Value=\"50\">\n          <ia:ChangePropertyAction TargetObject=\"DataTriggerRectangle\" \n                                   PropertyName=\"Fill\"\n                                   Value=\"{DynamicResource YellowBrush}\" />\n        </ia:DataTriggerBehavior>\n        <ia:DataTriggerBehavior Binding=\"{Binding #Slider.Value}\" \n                                ComparisonCondition=\"LessThanOrEqual\" \n                                Value=\"50\">\n          <ia:ChangePropertyAction TargetObject=\"DataTriggerRectangle\" \n                                   PropertyName=\"Fill\"\n                                   Value=\"{DynamicResource BlueBrush}\" />\n        </ia:DataTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Rectangle>\n    <StackPanel Grid.Row=\"1\" \n                Margin=\"5,0,5,5\" \n                Orientation=\"Horizontal\"\n                HorizontalAlignment=\"Center\"\n                VerticalAlignment=\"Center\">\n      <TextBlock Text=\"{Binding #Slider.Value}\" \n                 VerticalAlignment=\"Center\" \n                 Width=\"50\"\n                 Foreground=\"{DynamicResource GrayBrush}\" />\n      <Slider Name=\"Slider\" Width=\"400\" IsSnapToTickEnabled=\"True\" TickFrequency=\"1\" />\n    </StackPanel>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/DataTriggerBehaviorView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class DataTriggerBehaviorView : UserControl\n{\n    public DataTriggerBehaviorView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/EditableListBoxView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.EditableListBoxView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             xmlns:views=\"clr-namespace:BehaviorsTestApplication.Views\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <ListBox ItemsSource=\"{Binding Items}\">\n    <ListBox.Styles>\n      <Style Selector=\"ListBoxItem\">\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Margin\" Value=\"0\" />\n        <Setter Property=\"Padding\" Value=\"0\" />\n      </Style>\n    </ListBox.Styles>\n    <ListBox.ItemTemplate>\n      <DataTemplate DataType=\"vm:ItemViewModel\" x:CompileBindings=\"False\">\n        <views:ItemView />\n      </DataTemplate>\n    </ListBox.ItemTemplate>\n  </ListBox>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/EditableListBoxView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class EditableListBoxView : UserControl\n{\n    public EditableListBoxView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/EditableTreeViewView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.EditableTreeViewView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             xmlns:views=\"clr-namespace:BehaviorsTestApplication.Views\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <TreeView ItemsSource=\"{Binding Items}\">\n    <TreeView.Styles>\n      <Style Selector=\"TreeViewItem\">\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Margin\" Value=\"0\" />\n        <Setter Property=\"Padding\" Value=\"0\" />\n      </Style>\n    </TreeView.Styles>\n    <TreeView.ItemTemplate>\n      <TreeDataTemplate DataType=\"vm:ItemViewModel\" x:CompileBindings=\"False\"\n                        ItemsSource=\"{Binding Items}\">\n        <views:ItemView />\n      </TreeDataTemplate>\n    </TreeView.ItemTemplate>\n  </TreeView>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/EditableTreeViewView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class EditableTreeViewView : UserControl\n{\n    public EditableTreeViewView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/EventTriggerBehaviorView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.EventTriggerBehaviorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"Auto,Auto\">\n    <TextBox Name=\"TextBox\" Text=\"Hello\" Grid.Row=\"0\" Margin=\"5\" />\n    <Button Name=\"ChangeProperty\" Content=\"Change Property\" Grid.Row=\"1\" Margin=\"5,0,5,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"ChangeProperty\">\n          <ia:ChangePropertyAction TargetObject=\"TextBox\" PropertyName=\"Text\" Value=\"World\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/EventTriggerBehaviorView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class EventTriggerBehaviorView : UserControl\n{\n    public EventTriggerBehaviorView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/InvokeCommandActionView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.InvokeCommandActionView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             xmlns:reactive=\"using:System.Reactive\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"*,Auto\" ColumnDefinitions=\"30*,5,30*,5,30*\">\n    <Canvas Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"5\" Margin=\"5\" Background=\"{DynamicResource GrayBrush}\">\n      <Ellipse Canvas.Left=\"{Binding Position, Mode=TwoWay}\" \n               Canvas.Top=\"200\" \n               Fill=\"{DynamicResource RedBrush}\"\n               Stroke=\"{DynamicResource YellowBrush}\" \n               StrokeThickness=\"5\" \n               Height=\"100\" Width=\"100\" />\n    </Canvas>\n    <Button x:Name=\"MoveLeftButton\" Content=\"Move Left\" Grid.Row=\"1\" Grid.Column=\"0\" Margin=\"5,0,0,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"MoveLeftButton\">\n          <ia:InvokeCommandAction Command=\"{Binding MoveLeftCommand}\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n    <Button x:Name=\"ResetMoveButton\" Content=\"Reset Move\" Grid.Row=\"1\" Grid.Column=\"2\" Margin=\"0,0,0,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"ResetMoveButton\">\n          <ia:InvokeCommandAction Command=\"{Binding ResetMoveCommand}\"\n                                  CommandParameter=\"{x:Static reactive:Unit.Default}\"  />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n    <Button x:Name=\"MoveRightButton\" Content=\"Move Right\" Grid.Row=\"1\" Grid.Column=\"4\" Margin=\"0,0,5,5\">\n      <i:Interaction.Behaviors>\n        <ia:EventTriggerBehavior EventName=\"Click\" SourceObject=\"MoveRightButton\">\n          <ia:InvokeCommandAction Command=\"{Binding MoveRightCommand}\" />\n        </ia:EventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/InvokeCommandActionView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class InvokeCommandActionView : UserControl\n{\n    public InvokeCommandActionView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/RoutedEventTriggerBehaviorView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.RoutedEventTriggerBehaviorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:iac=\"clr-namespace:Avalonia.Xaml.Interactions.Custom;assembly=Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid RowDefinitions=\"Auto,*,*\">\n    <TextBox Name=\"TextBox\" Text=\"Hello\" Grid.Row=\"0\" Margin=\"5\" />\n    <Button Name=\"ChangeProperty\" Content=\"Change Property\" Grid.Row=\"1\" Margin=\"5,0,5,5\">\n      <i:Interaction.Behaviors>\n        <iac:RoutedEventTriggerBehavior RoutedEvent=\"{x:Static Button.ClickEvent}\" \n                                        RoutingStrategies=\"Bubble\"\n                                        SourceInteractive=\"ChangeProperty\">\n          <ia:ChangePropertyAction TargetObject=\"TextBox\" PropertyName=\"Text\" Value=\"World\" />\n        </iac:RoutedEventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Button>\n    <Rectangle Name=\"Rectangle\" \n               Grid.Row=\"2\" Margin=\"5\"\n               Fill=\"{DynamicResource BlueBrush}\"\n               Stroke=\"{DynamicResource GrayBrush}\"\n               StrokeThickness=\"5\">\n      <i:Interaction.Behaviors>\n        <iac:RoutedEventTriggerBehavior RoutedEvent=\"{x:Static InputElement.PointerPressedEvent}\" \n                                        RoutingStrategies=\"Tunnel\">\n          <ia:ChangePropertyAction TargetObject=\"Rectangle\" \n                                   PropertyName=\"Fill\"\n                                   Value=\"{DynamicResource YellowBrush}\" />\n        </iac:RoutedEventTriggerBehavior>\n        <iac:RoutedEventTriggerBehavior RoutedEvent=\"{x:Static InputElement.PointerReleasedEvent}\" \n                                        RoutingStrategies=\"Tunnel\">\n          <ia:ChangePropertyAction TargetObject=\"Rectangle\" \n                                   PropertyName=\"Fill\"\n                                   Value=\"{DynamicResource BlueBrush}\" />\n        </iac:RoutedEventTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </Rectangle>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/RoutedEventTriggerBehaviorView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class RoutedEventTriggerBehaviorView : UserControl\n{\n    public RoutedEventTriggerBehaviorView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ValueChangedTriggerBehaviorView.axaml",
    "content": "﻿<UserControl x:Class=\"BehaviorsTestApplication.Views.Pages.ValueChangedTriggerBehaviorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n             xmlns:ia=\"clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions\"\n             xmlns:iac=\"clr-namespace:Avalonia.Xaml.Interactions.Custom;assembly=Avalonia.Xaml.Interactions.Custom\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:vm=\"using:BehaviorsTestApplication.ViewModels\"\n             x:CompileBindings=\"True\" x:DataType=\"vm:MainWindowViewModel\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"600\" d:DesignHeight=\"450\">\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n  <Grid>\n    <TextBlock Name=\"Text\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\n      <i:Interaction.Behaviors>\n        <iac:ValueChangedTriggerBehavior Binding=\"{Binding Values^}\">\n          <ia:ChangePropertyAction TargetObject=\"Text\" \n                                   PropertyName=\"Text\"\n                                   Value=\"{Binding Values^, StringFormat={} Value: {0}}\" />\n        </iac:ValueChangedTriggerBehavior>\n      </i:Interaction.Behaviors>\n    </TextBlock>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "samples/BehaviorsTestApplication/Views/Pages/ValueChangedTriggerBehaviorView.axaml.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace BehaviorsTestApplication.Views.Pages;\n\npublic partial class ValueChangedTriggerBehaviorView : UserControl\n{\n    public ValueChangedTriggerBehaviorView()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/Directory.Packages.props",
    "content": "﻿<Project>\n  <PropertyGroup>\n    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n    <AvaloniaVersion>11.0.10</AvaloniaVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageVersion Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Controls.DataGrid\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Desktop\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Diagnostics\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.ReactiveUI\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Themes.Fluent\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Fonts.Inter\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Browser\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Headless.XUnit\" Version=\"$(AvaloniaVersion)\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageVersion Include=\"System.Reactive\" Version=\"6.0.0\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/DragAndDropSample/App.axaml",
    "content": "<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"using:DragAndDropSample\"\n             x:Class=\"DragAndDropSample.App\"\n             Name=\"DragAndDropSample\"\n             RequestedThemeVariant=\"Light\">\n  <Application.DataTemplates>\n    <local:ViewLocator />\n  </Application.DataTemplates>\n\n  <Application.Styles>\n    <FluentTheme />\n    <StyleInclude Source=\"avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml\"/>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "samples/DragAndDropSample/App.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\nusing DragAndDropSample.ViewModels;\nusing DragAndDropSample.Views;\n\nnamespace DragAndDropSample;\n\npublic class App : Application\n{\n    public override void Initialize()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n\n    public override void OnFrameworkInitializationCompleted()\n    {\n        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n        {\n            desktop.MainWindow = new MainWindow {DataContext = new MainWindowViewModel(),};\n        }\n\n        base.OnFrameworkInitializationCompleted();\n    }\n}"
  },
  {
    "path": "samples/DragAndDropSample/Behaviors/BaseDataGridDropHandler.cs",
    "content": "using System.Collections.ObjectModel;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.VisualTree;\nusing Avalonia.Xaml.Interactions.DragAndDrop;\nusing DragAndDropSample.ViewModels;\n\nnamespace DragAndDropSample.Behaviors;\n\npublic abstract class BaseDataGridDropHandler<T> : DropHandlerBase\n    where T : ViewModelBase\n{\n    private const string rowDraggingUpStyleClass = \"DraggingUp\";\n    private const string rowDraggingDownStyleClass = \"DraggingDown\";\n\n    protected abstract T MakeCopy(ObservableCollection<T> parentCollection, T item);\n\n    protected abstract bool Validate(DataGrid dg, DragEventArgs e, object? sourceContext, object? targetContext, bool bExecute);\n\n    public override bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        if (e.Source is Control c && sender is DataGrid dg)\n        {\n            bool valid = Validate(dg, e, sourceContext, targetContext, false);\n            if (valid)\n            {\n                var row = FindDataGridRowFromChildView(c);\n                string direction = e.Data.Contains(\"direction\") ? (string) e.Data.Get(\"direction\")! : \"down\";\n                ApplyDraggingStyleToRow(row!, direction);\n                ClearDraggingStyleFromAllRows(sender, exceptThis: row);\n            }\n            return valid;\n        }\n        ClearDraggingStyleFromAllRows(sender);\n        return false;\n    }\n\n    public override bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        ClearDraggingStyleFromAllRows(sender);\n        if (e.Source is Control && sender is DataGrid dg)\n        {\n            return Validate(dg, e, sourceContext, targetContext, true);\n        }\n        return false;\n    }\n\n    public override void Cancel(object? sender, RoutedEventArgs e)\n    {\n        base.Cancel(sender, e);\n        // this is necessary to clear adorner borders when mouse leaves DataGrid\n        // they would remain even after changing screens\n        ClearDraggingStyleFromAllRows(sender);\n    }\n\n    protected bool RunDropAction(DataGrid dg, DragEventArgs e, bool bExecute, T sourceItem, T targetItem, ObservableCollection<T> items)\n    {\n        int sourceIndex = items.IndexOf(sourceItem);\n        int targetIndex = items.IndexOf(targetItem);\n\n        if (sourceIndex < 0 || targetIndex < 0)\n        {\n            return false;\n        }\n\n        switch (e.DragEffects)\n        {\n            case DragDropEffects.Copy:\n            {\n                if (bExecute)\n                {\n                    var clone = MakeCopy(items, sourceItem);\n                    InsertItem(items, clone, targetIndex + 1);\n                    dg.SelectedIndex = targetIndex + 1;\n                }\n                return true;\n            }\n            case DragDropEffects.Move:\n            {\n                if (bExecute)\n                {\n                    MoveItem(items, sourceIndex, targetIndex);\n                    dg.SelectedIndex = targetIndex;\n                }\n                return true;\n            }\n            case DragDropEffects.Link:\n            {\n                if (bExecute)\n                {\n                    SwapItem(items, sourceIndex, targetIndex);\n                    dg.SelectedIndex = targetIndex;\n                }\n                return true;\n            }\n            default:\n                return false;\n        }\n    }\n\n    private static DataGridRow? FindDataGridRowFromChildView(StyledElement sourceChild)\n    {\n        int maxDepth = 16;\n        DataGridRow? row = null;\n        StyledElement? current = sourceChild;\n        while (maxDepth --> 0 || row is null)\n        {\n            if (current is DataGridRow dgr)\n                row = dgr;\n\n            current = current?.Parent;\n        }\n        return row;\n    }\n\n    private static DataGridRowsPresenter? GetRowsPresenter(Visual v)\n    {\n        foreach (var cv in v.GetVisualChildren())\n        {\n            if (cv is DataGridRowsPresenter dgrp)\n                return dgrp;\n            else if (GetRowsPresenter(cv) is DataGridRowsPresenter dgrp2)\n                return dgrp2;                \n        }\n        return null;\n    }\n\n    private static void ClearDraggingStyleFromAllRows(object? sender, DataGridRow? exceptThis = null)\n    {\n        if (sender is DataGrid dg)\n        {\n            var presenter = GetRowsPresenter(dg);\n            if (presenter is null) return;\n\n            foreach (var r in presenter.Children)\n            {\n                if (r == exceptThis) continue;\n\n                if (r!.Classes.Contains(rowDraggingUpStyleClass))\n                {\n                    r?.Classes?.Remove(rowDraggingUpStyleClass);\n                }\n                if (r!.Classes.Contains(rowDraggingDownStyleClass))\n                {\n                    r?.Classes?.Remove(rowDraggingDownStyleClass);\n                }\n            }\n        }\n    }\n\n    private static void ApplyDraggingStyleToRow(DataGridRow row, string direction)\n    {\n        if (direction == \"up\")\n        {\n            if (row.Classes.Contains(rowDraggingDownStyleClass) == true)\n            {\n                row.Classes.Remove(rowDraggingDownStyleClass);\n            }\n            if (row.Classes.Contains(rowDraggingUpStyleClass) == false)\n            {\n                row.Classes.Add(rowDraggingUpStyleClass);\n            }\n        }\n        else if (direction == \"down\")\n        {\n            if (row.Classes.Contains(rowDraggingUpStyleClass) == true)\n            {\n                row.Classes.Remove(rowDraggingUpStyleClass);\n            }\n            if (row.Classes.Contains(rowDraggingDownStyleClass) == false)\n            {\n                row.Classes.Add(rowDraggingDownStyleClass);\n            }\n        }\n    }\n}"
  },
  {
    "path": "samples/DragAndDropSample/Behaviors/ContextDragWithDirectionBehavior.cs",
    "content": "using System;\nusing System.Threading.Tasks;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactions.DragAndDrop;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace DragAndDropSample.Behaviors;\n\n/// <summary>\n/// \n/// </summary>\npublic sealed class ContextDragWithDirectionBehavior : Behavior<Control>\n{\n    private Point _dragStartPoint;\n    private PointerEventArgs? _triggerEvent;\n    private bool _lock;\n    private bool _captured;\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<object?> ContextProperty =\n        AvaloniaProperty.Register<ContextDragBehavior, object?>(nameof(Context));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<IDragHandler?> HandlerProperty =\n        AvaloniaProperty.Register<ContextDragBehavior, IDragHandler?>(nameof(Handler));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<double> HorizontalDragThresholdProperty = \n        AvaloniaProperty.Register<ContextDragBehavior, double>(nameof(HorizontalDragThreshold), 3);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<double> VerticalDragThresholdProperty =\n        AvaloniaProperty.Register<ContextDragBehavior, double>(nameof(VerticalDragThreshold), 3);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public object? Context\n    {\n        get => GetValue(ContextProperty);\n        set => SetValue(ContextProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public IDragHandler? Handler\n    {\n        get => GetValue(HandlerProperty);\n        set => SetValue(HandlerProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public double HorizontalDragThreshold\n    {\n        get => GetValue(HorizontalDragThresholdProperty);\n        set => SetValue(HorizontalDragThresholdProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public double VerticalDragThreshold\n    {\n        get => GetValue(VerticalDragThresholdProperty);\n        set => SetValue(VerticalDragThresholdProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerPressedEvent, AssociatedObject_PointerPressed, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerReleasedEvent, AssociatedObject_PointerReleased, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerMovedEvent, AssociatedObject_PointerMoved, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerCaptureLostEvent, AssociatedObject_CaptureLost, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerPressedEvent, AssociatedObject_PointerPressed);\n        AssociatedObject?.RemoveHandler(InputElement.PointerReleasedEvent, AssociatedObject_PointerReleased);\n        AssociatedObject?.RemoveHandler(InputElement.PointerMovedEvent, AssociatedObject_PointerMoved);\n        AssociatedObject?.RemoveHandler(InputElement.PointerCaptureLostEvent, AssociatedObject_CaptureLost);\n    }\n\n    private async Task DoDragDrop(PointerEventArgs triggerEvent, object? value, string upOrDown)\n    {\n        var data = new DataObject();\n        data.Set(ContextDropBehavior.DataFormat, value!);\n        data.Set(\"direction\", upOrDown);\n\n        var effect = DragDropEffects.None;\n\n        if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Alt))\n        {\n            effect |= DragDropEffects.Link;\n        }\n        else if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Shift))\n        {\n            effect |= DragDropEffects.Move;\n        }\n        else if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Control))\n        {\n            effect |= DragDropEffects.Copy;\n        }\n        else\n        {\n            effect |= DragDropEffects.Move;\n        }\n\n        await DragDrop.DoDragDrop(triggerEvent, data, effect);\n    }\n\n    private void Released()\n    {\n        _triggerEvent = null;\n        _lock = false;\n    }\n\n    private void AssociatedObject_PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.IsLeftButtonPressed)\n        {\n            if (e.Source is Control control\n                && AssociatedObject?.DataContext == control.DataContext)\n            {\n                _dragStartPoint = e.GetPosition(null);\n                _triggerEvent = e;\n                _lock = true;\n                _captured = true;\n            }\n        }\n    }\n\n    private void AssociatedObject_PointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n        if (_captured)\n        {\n            if (e.InitialPressMouseButton == MouseButton.Left && _triggerEvent is { })\n            {\n                Released();\n            }\n\n            _captured = false;\n        }\n    }\n\n    private async void AssociatedObject_PointerMoved(object? sender, PointerEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (_captured\n            && properties.IsLeftButtonPressed &&\n            _triggerEvent is { })\n        {\n            var point = e.GetPosition(null);\n            var diff = _dragStartPoint - point;\n            var horizontalDragThreshold = HorizontalDragThreshold;\n            var verticalDragThreshold = VerticalDragThreshold;\n\n            if (Math.Abs(diff.X) > horizontalDragThreshold || Math.Abs(diff.Y) > verticalDragThreshold)\n            {\n                if (_lock)\n                {\n                    _lock = false;\n                }\n                else\n                {\n                    return;\n                }\n\n                var context = Context ?? AssociatedObject?.DataContext;\n                    \n                Handler?.BeforeDragDrop(sender, _triggerEvent, context);\n\n                await DoDragDrop(_triggerEvent, context, diff.Y > 0 ? \"up\" : \"down\");\n\n                Handler?.AfterDragDrop(sender, _triggerEvent, context);\n\n                _triggerEvent = null;\n            }\n        }\n    }\n\n    private void AssociatedObject_CaptureLost(object? sender, PointerCaptureLostEventArgs e)\n    {\n        Released();\n        _captured = false;\n    }\n}\n"
  },
  {
    "path": "samples/DragAndDropSample/Behaviors/ItemsDataGridDropHandler.cs",
    "content": "using System.Collections.ObjectModel;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.VisualTree;\nusing DragAndDropSample.ViewModels;\n\nnamespace DragAndDropSample.Behaviors;\n\npublic sealed class ItemsDataGridDropHandler : BaseDataGridDropHandler<ItemViewModel>\n{\n    protected override ItemViewModel MakeCopy(ObservableCollection<ItemViewModel> parentCollection, ItemViewModel item) =>\n        new() { Title = item.Title };\n\n    protected override bool Validate(DataGrid dg, DragEventArgs e, object? sourceContext, object? targetContext, bool bExecute)\n    {\n        if (sourceContext is not ItemViewModel sourceItem\n         || targetContext is not MainWindowViewModel vm\n         || dg.GetVisualAt(e.GetPosition(dg)) is not Control targetControl\n         || targetControl.DataContext is not ItemViewModel targetItem)\n        {\n            return false;\n        }\n\n        var items = vm.Items;\n        return RunDropAction(dg, e, bExecute, sourceItem, targetItem, items);\n    }\n}"
  },
  {
    "path": "samples/DragAndDropSample/Behaviors/ItemsListBoxDropHandler.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.VisualTree;\nusing Avalonia.Xaml.Interactions.DragAndDrop;\nusing DragAndDropSample.ViewModels;\n\nnamespace DragAndDropSample.Behaviors;\n\npublic class ItemsListBoxDropHandler : DropHandlerBase\n{\n    private bool Validate<T>(ListBox listBox, DragEventArgs e, object? sourceContext, object? targetContext, bool bExecute) where T : ItemViewModel\n    {\n        if (sourceContext is not T sourceItem\n            || targetContext is not MainWindowViewModel vm\n            || listBox.GetVisualAt(e.GetPosition(listBox)) is not Control targetControl\n            || targetControl.DataContext is not T targetItem)\n        {\n            return false;\n        }\n\n        var items = vm.Items;\n        var sourceIndex = items.IndexOf(sourceItem);\n        var targetIndex = items.IndexOf(targetItem);\n\n        if (sourceIndex < 0 || targetIndex < 0)\n        {\n            return false;\n        }\n\n        switch (e.DragEffects)\n        {\n            case DragDropEffects.Copy:\n            {\n                if (bExecute)\n                {\n                    var clone = new ItemViewModel() { Title = sourceItem.Title + \"_copy\" };\n                    InsertItem(items, clone, targetIndex + 1);\n                }\n                return true;\n            }\n            case DragDropEffects.Move:\n            {\n                if (bExecute)\n                {\n                    MoveItem(items, sourceIndex, targetIndex);\n                }\n                return true;\n            }\n            case DragDropEffects.Link:\n            {\n                if (bExecute)\n                {\n                    SwapItem(items, sourceIndex, targetIndex);\n                }\n                return true;\n            }\n            default:\n                return false;\n        }\n    }\n        \n    public override bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        if (e.Source is Control && sender is ListBox listBox)\n        {\n            return Validate<ItemViewModel>(listBox, e, sourceContext, targetContext, false);\n        }\n        return false;\n    }\n\n    public override bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        if (e.Source is Control && sender is ListBox listBox)\n        {\n            return Validate<ItemViewModel>(listBox, e, sourceContext, targetContext, true);\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "samples/DragAndDropSample/Behaviors/NodesListBoxDropHandler.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.VisualTree;\nusing Avalonia.Xaml.Interactions.DragAndDrop;\nusing DragAndDropSample.ViewModels;\n\nnamespace DragAndDropSample.Behaviors;\n\npublic class NodesListBoxDropHandler : DropHandlerBase\n{\n    private bool Validate<T>(ListBox listBox, DragEventArgs e, object? sourceContext, object? targetContext, bool bExecute) where T : NodeViewModel\n    {\n        if (sourceContext is not T sourceNode\n            || targetContext is not MainWindowViewModel vm\n            || listBox.GetVisualAt(e.GetPosition(listBox)) is not Control targetControl\n            || targetControl.DataContext is not T targetNode)\n        {\n            return false;\n        }\n\n        var nodes = vm.Nodes;\n        var sourceIndex = nodes.IndexOf(sourceNode);\n        var targetIndex = nodes.IndexOf(targetNode);\n\n        if (sourceIndex < 0 || targetIndex < 0)\n        {\n            return false;\n        }\n\n        switch (e.DragEffects)\n        {\n            case DragDropEffects.Copy:\n            {\n                if (bExecute)\n                {\n                    var clone = new NodeViewModel() { Title = sourceNode.Title + \"_copy\" };\n                    InsertItem(nodes, clone, targetIndex + 1);\n                }\n                return true;\n            }\n            case DragDropEffects.Move:\n            {\n                if (bExecute)\n                {\n                    MoveItem(nodes, sourceIndex, targetIndex);\n                }\n                return true;\n            }\n            case DragDropEffects.Link:\n            {\n                if (bExecute)\n                {\n                    SwapItem(nodes, sourceIndex, targetIndex);\n                }\n                return true;\n            }\n            default:\n                return false;\n        }\n    }\n        \n    public override bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        if (e.Source is Control && sender is ListBox listBox)\n        {\n            return Validate<NodeViewModel>(listBox, e, sourceContext, targetContext, false);\n        }\n        return false;\n    }\n\n    public override bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        if (e.Source is Control && sender is ListBox listBox)\n        {\n            return Validate<NodeViewModel>(listBox, e, sourceContext, targetContext, true);\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "samples/DragAndDropSample/Behaviors/NodesTreeViewDropHandler.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.VisualTree;\nusing Avalonia.Xaml.Interactions.DragAndDrop;\nusing DragAndDropSample.ViewModels;\n\nnamespace DragAndDropSample.Behaviors;\n\npublic class NodesTreeViewDropHandler : DropHandlerBase\n{\n    private bool Validate<T>(TreeView treeView, DragEventArgs e, object? sourceContext, object? targetContext, bool bExecute) where T : NodeViewModel\n    {\n        if (sourceContext is not T sourceNode\n            || targetContext is not MainWindowViewModel vm\n            || treeView.GetVisualAt(e.GetPosition(treeView)) is not Control targetControl\n            || targetControl.DataContext is not T targetNode)\n        {\n            return false;\n        }\n\n        var sourceParent = sourceNode.Parent;\n        var targetParent = targetNode.Parent;\n        var sourceNodes = sourceParent is not null ? sourceParent.Nodes : vm.Nodes;\n        var targetNodes = targetParent is not null ? targetParent.Nodes : vm.Nodes;\n\n        if (sourceNodes is not null && targetNodes is not null)\n        {\n            var sourceIndex = sourceNodes.IndexOf(sourceNode);\n            var targetIndex = targetNodes.IndexOf(targetNode);\n\n            if (sourceIndex < 0 || targetIndex < 0)\n            {\n                return false;\n            }\n\n            switch (e.DragEffects)\n            {\n                case DragDropEffects.Copy:\n                {\n                    if (bExecute)\n                    {\n                        var clone = new NodeViewModel() { Title = sourceNode.Title + \"_copy\" };\n                        InsertItem(targetNodes, clone, targetIndex + 1);\n                    }\n\n                    return true;\n                }\n                case DragDropEffects.Move:\n                {\n                    if (bExecute)\n                    {\n                        if (sourceNodes == targetNodes)\n                        {\n                            MoveItem(sourceNodes, sourceIndex, targetIndex);\n                        }\n                        else\n                        {\n                            sourceNode.Parent = targetParent;\n\n                            MoveItem(sourceNodes, targetNodes, sourceIndex, targetIndex);\n                        }\n                    }\n\n                    return true;\n                }\n                case DragDropEffects.Link:\n                {\n                    if (bExecute)\n                    {\n                        if (sourceNodes == targetNodes)\n                        {\n                            SwapItem(sourceNodes, sourceIndex, targetIndex);\n                        }\n                        else\n                        {\n                            sourceNode.Parent = targetParent;\n                            targetNode.Parent = sourceParent;\n\n                            SwapItem(sourceNodes, targetNodes, sourceIndex, targetIndex);\n                        }\n                    }\n\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n        \n    public override bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        if (e.Source is Control && sender is TreeView treeView)\n        {\n            return Validate<NodeViewModel>(treeView, e, sourceContext, targetContext, false);\n        }\n        return false;\n    }\n\n    public override bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        if (e.Source is Control && sender is TreeView treeView)\n        {\n            return Validate<NodeViewModel>(treeView, e, sourceContext, targetContext, true);\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "samples/DragAndDropSample/DragAndDropSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <GenerateAssemblyInfo>False</GenerateAssemblyInfo>\n    <IsPackable>False</IsPackable>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n    <PackageReference Include=\"Avalonia.Controls.DataGrid\" />\n    <PackageReference Include=\"Avalonia.Desktop\" />\n    <PackageReference Include=\"Avalonia.Diagnostics\" />\n    <PackageReference Include=\"Avalonia.Themes.Fluent\" />\n    <PackageReference Include=\"Avalonia.Fonts.Inter\" />\n    <PackageReference Include=\"Avalonia.ReactiveUI\" />\n  </ItemGroup>\n\n  <!--<Import Project=\"..\\..\\build\\SignAssembly.props\" />-->\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions\\Avalonia.Xaml.Interactions.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.DragAndDrop\\Avalonia.Xaml.Interactions.DragAndDrop.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "samples/DragAndDropSample/Program.cs",
    "content": "﻿using System;\nusing Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.ReactiveUI;\nusing Avalonia.Xaml.Interactions.Core;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace DragAndDropSample;\n\nclass Program\n{\n    // Initialization code. Don't use any Avalonia, third-party APIs or any\n    // SynchronizationContext-reliant code before AppMain is called: things aren't initialized\n    // yet and stuff might break.\n    [STAThread]\n    public static void Main(string[] args) => BuildAvaloniaApp()\n        .StartWithClassicDesktopLifetime(args);\n\n    // Avalonia configuration, don't remove; also used by visual designer.\n    public static AppBuilder BuildAvaloniaApp()\n    {\n        GC.KeepAlive(typeof(Interaction).Assembly);\n        GC.KeepAlive(typeof(ComparisonConditionType).Assembly);\n        return AppBuilder.Configure<App>()\n            .UsePlatformDetect()\n            .LogToTrace()\n            .UseReactiveUI();\n    }\n}\n"
  },
  {
    "path": "samples/DragAndDropSample/ViewLocator.cs",
    "content": "using System;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Templates;\nusing DragAndDropSample.ViewModels;\n\nnamespace DragAndDropSample;\n\npublic class ViewLocator : IDataTemplate\n{\n    public Control Build(object? data)\n    {\n        var name = data?.GetType().FullName?.Replace(\"ViewModel\", \"View\");\n        var type = name is null ? null : Type.GetType(name);\n\n        if (type != null)\n        {\n            return (Control)Activator.CreateInstance(type)!;\n        }\n        else\n        {\n            return new TextBlock {Text = \"Not Found: \" + name};\n        }\n    }\n\n    public bool Match(object? data)\n    {\n        return data is ViewModelBase;\n    }\n}\n"
  },
  {
    "path": "samples/DragAndDropSample/ViewModels/ItemViewModel.cs",
    "content": "﻿using ReactiveUI;\n\nnamespace DragAndDropSample.ViewModels;\n\npublic class ItemViewModel : ViewModelBase\n{\n    private string? _title;\n\n    public string? Title\n    {\n        get => _title;\n        set => this.RaiseAndSetIfChanged(ref _title, value);\n    }\n\n    public override string? ToString() => _title;\n}"
  },
  {
    "path": "samples/DragAndDropSample/ViewModels/MainWindowViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing ReactiveUI;\n\nnamespace DragAndDropSample.ViewModels;\n\npublic class MainWindowViewModel : ViewModelBase\n{\n    private ObservableCollection<ItemViewModel> _items;\n    private ObservableCollection<NodeViewModel> _nodes;\n        \n    public ObservableCollection<ItemViewModel> Items\n    {\n        get => _items;\n        set => this.RaiseAndSetIfChanged(ref _items, value);\n    }\n\n    public ObservableCollection<NodeViewModel> Nodes\n    {\n        get => _nodes;\n        set => this.RaiseAndSetIfChanged(ref _nodes, value);\n    }\n\n    public MainWindowViewModel()\n    {\n        _items = new ObservableCollection<ItemViewModel>()\n        {\n            new() { Title = \"Item0\" },\n            new() { Title = \"Item1\" },\n            new() { Title = \"Item2\" },\n            new() { Title = \"Item3\" },\n            new() { Title = \"Item4\" }\n        };\n\n        var node0 = new NodeViewModel()\n        {\n            Title = \"Node0\"\n        };\n        node0.Nodes = new ObservableCollection<NodeViewModel>()\n        {\n            new() { Title = \"Node0-0\", Parent = node0},\n            new() { Title = \"Node0-1\", Parent = node0},\n            new() { Title = \"Node0-2\", Parent = node0},\n        }; \n\n        var node1 = new NodeViewModel()\n        {\n            Title = \"Node1\"\n        };\n        node1.Nodes = new ObservableCollection<NodeViewModel>()\n        {\n            new() { Title = \"Node1-0\", Parent = node1},\n            new() { Title = \"Node1-1\", Parent = node1},\n            new() { Title = \"Node1-2\", Parent = node1},\n        }; \n\n        var node2 = new NodeViewModel()\n        {\n            Title = \"Node2\"\n        };\n        node2.Nodes = new ObservableCollection<NodeViewModel>()\n        {\n            new() { Title = \"Node2-0\", Parent = node2},\n            new() { Title = \"Node2-1\", Parent = node2},\n            new() { Title = \"Node2-2\", Parent = node2},\n        }; \n\n        _nodes = new ObservableCollection<NodeViewModel>()\n        {\n            node0,\n            node1,\n            node2\n        };\n    }\n}"
  },
  {
    "path": "samples/DragAndDropSample/ViewModels/NodeViewModel.cs",
    "content": "using System.Collections.ObjectModel;\nusing ReactiveUI;\n\nnamespace DragAndDropSample.ViewModels;\n\npublic class NodeViewModel : ViewModelBase\n{\n    private string? _title;\n    private NodeViewModel? _parent;\n    private ObservableCollection<NodeViewModel>? _nodes;\n\n    public string? Title\n    {\n        get => _title;\n        set => this.RaiseAndSetIfChanged(ref _title, value);\n    }\n\n    public NodeViewModel? Parent\n    {\n        get => _parent;\n        set => this.RaiseAndSetIfChanged(ref _parent, value);\n    }\n\n    public ObservableCollection<NodeViewModel>? Nodes\n    {\n        get => _nodes;\n        set => this.RaiseAndSetIfChanged(ref _nodes, value);\n    }\n\n    public override string? ToString() => _title;\n}"
  },
  {
    "path": "samples/DragAndDropSample/ViewModels/ViewModelBase.cs",
    "content": "﻿using ReactiveUI;\n\nnamespace DragAndDropSample.ViewModels;\n\npublic class ViewModelBase : ReactiveObject\n{\n}"
  },
  {
    "path": "samples/DragAndDropSample/Views/MainWindow.axaml",
    "content": "<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:vm=\"using:DragAndDropSample.ViewModels\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n        xmlns:idd=\"clr-namespace:Avalonia.Xaml.Interactions.DragAndDrop;assembly=Avalonia.Xaml.Interactions.DragAndDrop\"\n        xmlns:b=\"using:DragAndDropSample.Behaviors\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        mc:Ignorable=\"d\" d:DesignWidth=\"650\" d:DesignHeight=\"450\"\n        x:Class=\"DragAndDropSample.Views.MainWindow\"\n        Icon=\"/Assets/avalonia-logo.ico\"\n        Width=\"650\" WindowStartupLocation=\"CenterScreen\"\n        Title=\"DragAndDropSample\">\n\n  <Design.DataContext>\n    <vm:MainWindowViewModel />\n  </Design.DataContext>\n\n  <Window.Resources>\n    <!-- IconGrabber, MIT License, author: Primer, taken from: https://www.svgrepo.com/svg/347759/grabber -->\n    <PathGeometry x:Key=\"IconGrabberGeometry\">M15 18a1 1 0 100-2 1 1 0 000 2zm1-6a1 1 0 11-2 0 1 1 0 012 0zm-7 6a1 1 0 100-2 1 1 0 000 2zm0-5a1 1 0 100-2 1 1 0 000 2zm7-6a1 1 0 11-2 0 1 1 0 012 0zM9 8a1 1 0 100-2 1 1 0 000 2z</PathGeometry>\n    <GeometryDrawing x:Key=\"IconGrabber\" Brush=\"Black\" Geometry=\"{StaticResource IconGrabberGeometry}\" />\n  </Window.Resources>\n\n  <Window.Styles>\n\n    <Style Selector=\"ListBox.ItemsDragAndDrop\">\n      <Style.Resources>\n        <b:ItemsListBoxDropHandler x:Key=\"ItemsListBoxDropHandler\" />\n      </Style.Resources>\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDropBehavior Handler=\"{StaticResource ItemsListBoxDropHandler}\" />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"ListBox.ItemsDragAndDrop ListBoxItem\">\n      <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDragBehavior HorizontalDragThreshold=\"3\" VerticalDragThreshold=\"3\" />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"ListBox.NodesDragAndDrop\">\n      <Style.Resources>\n        <b:NodesListBoxDropHandler x:Key=\"NodesListBoxDropHandler\" />\n      </Style.Resources>\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDropBehavior Handler=\"{StaticResource NodesListBoxDropHandler}\" />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"ListBox.NodesDragAndDrop ListBoxItem\">\n      <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDragBehavior />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"TreeView.NodesDragAndDrop\">\n      <Style.Resources>\n        <b:NodesTreeViewDropHandler x:Key=\"NodesTreeViewDropHandler\" />\n      </Style.Resources>\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDropBehavior Handler=\"{StaticResource NodesTreeViewDropHandler}\" />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"TreeView.NodesDragAndDrop TreeViewItem\">\n      <Setter Property=\"IsExpanded\" Value=\"True\" />\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDragBehavior />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"DataGrid.DragAndDrop\">\n      <Style.Resources>\n        <b:ItemsDataGridDropHandler x:Key=\"ItemsDataGridDropHandler\" />\n      </Style.Resources>\n      <Setter\n        Property=\"RowHeaderWidth\"\n        Value=\"24\" />\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDropBehavior Handler=\"{StaticResource ItemsDataGridDropHandler}\" />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"DataGrid.DragAndDrop DataGridRow.DraggingUp\">\n      <Setter Property=\"AdornerLayer.Adorner\">\n        <Template>\n          <Border BorderThickness=\"0 2 0 0\" BorderBrush=\"{DynamicResource SystemAccentColor}\"/>\n        </Template>\n      </Setter>\n    </Style>\n  \n    <Style Selector=\"DataGrid.DragAndDrop DataGridRow.DraggingDown\">\n      <Setter Property=\"AdornerLayer.Adorner\">\n        <Template>\n          <Border BorderThickness=\"0 0 0 2\" BorderBrush=\"{DynamicResource SystemAccentColor}\"/>\n        </Template>\n      </Setter>\n    </Style>\n  \n    <!-- This makes only the DataGridRowHeader available for dragging, instead of making the entire row draggable -->\n    <!-- Which prevents a conflict between text selection in a cell and drag-and-drop -->\n    <Style Selector=\"DataGrid.DragAndDrop DataGridRowHeader\">\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <b:ContextDragWithDirectionBehavior HorizontalDragThreshold=\"3\" VerticalDragThreshold=\"3\" />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n      <Setter Property=\"Content\">\n        <Template>\n          <Image\n            Margin=\"12,0,12,0\"\n            Width=\"12\"\n            Height=\"12\"\n            VerticalAlignment=\"Center\"\n            HorizontalAlignment=\"Center\">\n            <Image.Source>\n              <!-- Use your own image here, I used this: https://www.svgrepo.com/svg/347759/grabber -->\n              <DrawingImage Drawing=\"{StaticResource IconGrabber}\" />\n            </Image.Source>\n          </Image>\n        </Template>\n      </Setter>\n    </Style>\n\n    <Style Selector=\"DataGrid.ItemsDragAndDrop\">\n      <Style.Resources>\n        <b:ItemsDataGridDropHandler x:Key=\"ItemsDataGridDropHandler\" />\n      </Style.Resources>\n      <Setter Property=\"(i:Interaction.Behaviors)\">\n        <i:BehaviorCollectionTemplate>\n          <i:BehaviorCollection>\n            <idd:ContextDropBehavior Handler=\"{StaticResource ItemsDataGridDropHandler}\" />\n          </i:BehaviorCollection>\n        </i:BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n    \n  </Window.Styles>\n\n  <TabControl>\n\n    <TabItem Header=\"TreeView\">\n      <Grid ColumnDefinitions=\"*,8,*\">\n        <TreeView ItemsSource=\"{Binding Nodes}\"\n                  Classes=\"NodesDragAndDrop\"\n                  Grid.Column=\"0\">\n          <TreeView.ItemTemplate>\n            <TreeDataTemplate DataType=\"vm:NodeViewModel\" ItemsSource=\"{Binding Nodes}\">\n              <TextBlock Text=\"{Binding Title}\" />\n            </TreeDataTemplate>\n          </TreeView.ItemTemplate>\n        </TreeView>\n        <GridSplitter Width=\"8\" ResizeDirection=\"Columns\" ResizeBehavior=\"PreviousAndNext\" Background=\"Transparent\" Grid.Column=\"1\"/>\n        <ListBox ItemsSource=\"{Binding Nodes}\"\n                 Classes=\"NodesDragAndDrop\"\n                 Grid.Column=\"2\">\n          <ListBox.ItemTemplate>\n            <DataTemplate DataType=\"vm:NodeViewModel\">\n              <TextBlock Text=\"{Binding Title}\" />\n            </DataTemplate>\n          </ListBox.ItemTemplate>\n        </ListBox>\n      </Grid>\n    </TabItem>\n\n    <TabItem Header=\"ListBox\">\n      <ListBox ItemsSource=\"{Binding Items}\"\n               Classes=\"ItemsDragAndDrop\">\n        <ListBox.ItemTemplate>\n          <DataTemplate DataType=\"vm:ItemViewModel\">\n            <TextBlock Text=\"{Binding Title}\" />\n          </DataTemplate>\n        </ListBox.ItemTemplate>\n      </ListBox>\n    </TabItem>\n\n    <TabItem Header=\"DataGrid\">\n      <Grid>\n        <DataGrid\n          AutoGenerateColumns=\"False\"\n          ItemsSource=\"{Binding Items}\"\n          CanUserResizeColumns=\"True\"\n          HeadersVisibility=\"All\"\n          Classes=\"DragAndDrop ItemsDragAndDrop\">\n          <DataGrid.Columns>\n            <DataGridTextColumn\n              Width=\"*\"\n              Binding=\"{Binding Title}\">\n            <DataGridTextColumn.Header>\n              <TextBlock Text=\"Title\"/>\n            </DataGridTextColumn.Header>\n          </DataGridTextColumn>\n          </DataGrid.Columns>\n        </DataGrid>\n      </Grid>\n    </TabItem>\n\n  </TabControl>\n\n</Window>\n"
  },
  {
    "path": "samples/DragAndDropSample/Views/MainWindow.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace DragAndDropSample.Views;\n\npublic partial class MainWindow : Window\n{\n    public MainWindow()\n    {\n        InitializeComponent();\n#if DEBUG\n        this.AttachDevTools();\n#endif\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/DraggableDemo/App.axaml",
    "content": "<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             x:Class=\"DraggableDemo.App\"\n             Name=\"DraggableDemo\"\n             RequestedThemeVariant=\"Light\">\n  <Application.Styles>\n    <FluentTheme />\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "samples/DraggableDemo/App.axaml.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\n\nnamespace DraggableDemo;\n\npublic class App : Application\n{\n    public override void Initialize()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n\n    public override void OnFrameworkInitializationCompleted()\n    {\n        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n        {\n            desktop.MainWindow = new MainWindow();\n        }\n\n        base.OnFrameworkInitializationCompleted();\n    }\n}"
  },
  {
    "path": "samples/DraggableDemo/DraggableDemo.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n    <GenerateAssemblyInfo>False</GenerateAssemblyInfo>\n    <IsPackable>False</IsPackable>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n    <PackageReference Include=\"Avalonia.Desktop\" />\n    <PackageReference Include=\"Avalonia.Diagnostics\" />\n    <PackageReference Include=\"Avalonia.Themes.Fluent\" />\n    <PackageReference Include=\"Avalonia.Fonts.Inter\" />\n    <PackageReference Include=\"Avalonia.ReactiveUI\" />\n  </ItemGroup>\n\n  <!--<Import Project=\"..\\..\\build\\SignAssembly.props\" />-->\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions\\Avalonia.Xaml.Interactions.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Draggable\\Avalonia.Xaml.Interactions.Draggable.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "samples/DraggableDemo/MainWindow.axaml",
    "content": "<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n        xmlns:id=\"clr-namespace:Avalonia.Xaml.Interactions.Draggable;assembly=Avalonia.Xaml.Interactions.Draggable\"\n        xmlns:local=\"clr-namespace:DraggableDemo\"\n        xmlns:models=\"clr-namespace:DraggableDemo.Models\"\n        mc:Ignorable=\"d\" d:DesignWidth=\"1200\" d:DesignHeight=\"550\"\n        x:Class=\"DraggableDemo.MainWindow\"\n        x:CompileBindings=\"True\" x:DataType=\"local:MainWindow\"\n        WindowState=\"Normal\" WindowStartupLocation=\"CenterScreen\"\n        Width=\"1200\" Height=\"550\"\n        Title=\"Draggable Controls Demo\">\n\n  <Window.Styles>\n    <StyleInclude Source=\"avares://Avalonia.Xaml.Interactions.Draggable/Styles.axaml\" />\n    <StyleInclude Source=\"/Styles/Custom.axaml\" />\n    <Style Selector=\"TextBlock\">\n      <Setter Property=\"HorizontalAlignment\" Value=\"Center\" />\n      <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\n      <Setter Property=\"ClipToBounds\" Value=\"False\" />\n    </Style>\n  </Window.Styles>\n\n  <TabControl Classes=\"draggable\">\n\n    <TabItem Header=\"TabControl\">\n      <TabControl Classes=\"draggable custom\" Background=\"LightGray\">\n        <TabControl.Styles>\n          <Style Selector=\"TabItem:not(:dragging)\">\n            <Setter Property=\"Transitions\">\n              <Setter.Value>\n                  <Transitions>\n                    <TransformOperationsTransition Property=\"RenderTransform\" Duration=\"0:0:0.1\" />\n                  </Transitions>\n              </Setter.Value>\n            </Setter>\n          </Style>\n        </TabControl.Styles>\n        <TabItem Header=\"Tab1\">\n          <TextBlock Text=\"Tab1\" />\n        </TabItem>\n        <TabItem Header=\"Tab2\">\n          <TextBlock Text=\"Tab2\" />\n        </TabItem>\n        <TabItem Header=\"Tab3\">\n          <TextBlock Text=\"Tab3\" />\n        </TabItem>\n      </TabControl>\n    </TabItem>\n\n    <TabItem Header=\"TabControl (Items)\">\n      <TabControl Classes=\"draggableVirtualizing custom\" ItemsSource=\"{Binding Items}\" Background=\"LightGray\" >\n        <TabControl.Styles>\n          <Style Selector=\"TabItem:not(:dragging)\">\n            <Setter Property=\"Transitions\">\n              <Setter.Value>\n                <Transitions>\n                  <TransformOperationsTransition Property=\"RenderTransform\" Duration=\"0:0:0.1\" />\n                </Transitions>\n              </Setter.Value>\n            </Setter>\n          </Style>\n        </TabControl.Styles>\n      </TabControl>\n    </TabItem>\n\n    <TabItem Header=\"ListBox\">\n      <ListBox Classes=\"draggable\">\n        <ListBox.Styles>\n          <Style Selector=\"ListBoxItem > TextBlock\">\n            <Setter Property=\"HorizontalAlignment\" Value=\"Left\" />\n          </Style>\n          <Style Selector=\"ListBoxItem:not(:dragging)\">\n            <Setter Property=\"Transitions\">\n              <Setter.Value>\n                <Transitions>\n                  <TransformOperationsTransition Property=\"RenderTransform\" Duration=\"0:0:0.1\" />\n                </Transitions>\n              </Setter.Value>\n            </Setter>\n          </Style>\n        </ListBox.Styles>\n        <ListBoxItem>\n          <TextBlock Text=\"Item1\" />\n        </ListBoxItem>\n        <ListBoxItem>\n          <TextBlock Text=\"Item2\" />\n        </ListBoxItem>\n        <ListBoxItem>\n          <TextBlock Text=\"Item3\" />\n        </ListBoxItem>\n      </ListBox>\n    </TabItem>\n\n    <TabItem Header=\"ListBox (Items)\">\n      <ListBox Classes=\"draggableVirtualizing\" ItemsSource=\"{Binding Strings}\">\n        <ListBox.Styles>\n          <Style Selector=\"ListBoxItem > TextBlock\">\n            <Setter Property=\"HorizontalAlignment\" Value=\"Left\" />\n          </Style>\n          <Style Selector=\"ListBoxItem:not(:dragging)\">\n            <Setter Property=\"Transitions\">\n              <Setter.Value>\n                <Transitions>\n                  <TransformOperationsTransition Property=\"RenderTransform\" Duration=\"0:0:0.1\" />\n                </Transitions>\n              </Setter.Value>\n            </Setter>\n          </Style>\n        </ListBox.Styles>\n      </ListBox>\n    </TabItem>\n\n    <TabItem Header=\"Canvas\">\n      <Canvas Classes=\"draggable\" Width=\"500\" Height=\"300\" Background=\"LightGray\">\n        <Canvas.Styles>\n          <Style Selector=\"Canvas > :is(Control):dragging\">\n            <Setter Property=\"ZIndex\" Value=\"1\" />\n          </Style>\n        </Canvas.Styles>\n        <Rectangle Fill=\"Blue\" Width=\"60\" Height=\"40\" Canvas.Left=\"20\" Canvas.Top=\"10\" />\n        <Ellipse Fill=\"Red\" Width=\"50\" Height=\"50\" Canvas.Left=\"120\" Canvas.Top=\"30\" />\n        <TextBlock Text=\"Hello from Avalonia\" Background=\"Transparent\" Canvas.Left=\"40\" Canvas.Top=\"100\" />\n        <Panel Background=\"Purple\" Width=\"80\" Height=\"70\" Canvas.Left=\"250\" Canvas.Top=\"100\" />\n      </Canvas>\n    </TabItem>\n\n    <TabItem Header=\"Canvas (Items)\">\n      <ItemsControl Classes=\"draggable\" ItemsSource=\"{Binding Items}\" Width=\"500\" Height=\"300\" Background=\"LightGray\">\n        <ItemsControl.Styles>\n          <Style Selector=\"ItemsControl > ContentPresenter\" x:DataType=\"models:Item\">\n            <Setter Property=\"(Canvas.Left)\" Value=\"{Binding X}\" />\n            <Setter Property=\"(Canvas.Top)\" Value=\"{Binding Y}\" />\n          </Style>\n          <Style Selector=\"ItemsControl > ContentPresenter:dragging\">\n            <Setter Property=\"Opacity\" Value=\"0.5\" />\n            <Setter Property=\"ZIndex\" Value=\"1\" />\n          </Style>\n        </ItemsControl.Styles>\n        <ItemsControl.ItemsPanel>\n          <ItemsPanelTemplate>\n            <Canvas />\n          </ItemsPanelTemplate>\n        </ItemsControl.ItemsPanel>\n        <ItemsControl.DataTemplates>\n          <DataTemplate DataType=\"models:Item\">\n            <Rectangle Fill=\"Black\" Width=\"30\" Height=\"30\" />\n          </DataTemplate>\n        </ItemsControl.DataTemplates>\n      </ItemsControl>\n    </TabItem>\n\n    <TabItem Header=\"Grid\">\n      <Grid Classes=\"draggable\" ColumnDefinitions=\"*,*,*\" RowDefinitions=\"*,*,*\" ShowGridLines=\"True\" Width=\"500\" Height=\"300\" Background=\"LightGray\">\n        <Grid.Styles>\n          <Style Selector=\"Grid > :is(Control):dragging\">\n            <Setter Property=\"Opacity\" Value=\"0.5\" />\n            <Setter Property=\"ZIndex\" Value=\"1\" />\n          </Style>\n        </Grid.Styles>\n        <Rectangle Fill=\"Blue\" Grid.Column=\"0\" Grid.ColumnSpan=\"2\" Grid.Row=\"0\" />\n        <Ellipse Fill=\"Red\" Grid.Column=\"2\" Grid.Row=\"0\" />\n        <TextBlock Text=\"Hello from Avalonia\" Background=\"Transparent\" Grid.Column=\"0\" Grid.Row=\"1\" />\n        <Panel Background=\"Purple\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.RowSpan=\"2\" />\n        <Ellipse Fill=\"Cyan\" Grid.Column=\"2\" Grid.Row=\"2\" />\n      </Grid>\n    </TabItem>\n\n    <TabItem Header=\"Grid (Items)\">\n      <ItemsControl ItemsSource=\"{Binding Tiles}\" Width=\"800\" Height=\"300\" Background=\"LightGray\">\n        <ItemsControl.Styles>\n          <Style Selector=\":is(ItemsControl) > :is(ContentPresenter)\">\n            <Setter Property=\"(i:Interaction.Behaviors)\">\n              <i:BehaviorCollectionTemplate>\n                <i:BehaviorCollection>\n                  <id:GridDragBehavior CopyColumn=\"True\" CopyRow=\"True\" CopyColumnSpan=\"True\" CopyRowSpan=\"True\" />\n                </i:BehaviorCollection>\n              </i:BehaviorCollectionTemplate>\n            </Setter>\n          </Style>\n          <Style Selector=\"ItemsControl > ContentPresenter\" x:DataType=\"models:Tile\">\n            <Setter Property=\"(Grid.Column)\" Value=\"{Binding Column}\" />\n            <Setter Property=\"(Grid.Row)\" Value=\"{Binding Row}\" />\n            <Setter Property=\"(Grid.ColumnSpan)\" Value=\"{Binding ColumnSpan}\" />\n            <Setter Property=\"(Grid.RowSpan)\" Value=\"{Binding RowSpan}\" />\n          </Style>\n          <Style Selector=\"ItemsControl > ContentPresenter:dragging\">\n            <Setter Property=\"Opacity\" Value=\"0.5\" />\n            <Setter Property=\"ZIndex\" Value=\"1\" />\n          </Style>\n        </ItemsControl.Styles>\n        <ItemsControl.ItemsPanel>\n          <ItemsPanelTemplate>\n            <Grid ShowGridLines=\"True\" ColumnDefinitions=\"*,*,*\" RowDefinitions=\"*,*\" />\n          </ItemsPanelTemplate>\n        </ItemsControl.ItemsPanel>\n        <ItemsControl.DataTemplates>\n          <DataTemplate DataType=\"models:Tile\">\n            <Border Background=\"{Binding Background}\" CornerRadius=\"6\" Margin=\"6\" BorderBrush=\"Gray\" BorderThickness=\"2\">\n              <Label Content=\"{Binding Title}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" />\n            </Border>\n          </DataTemplate>\n        </ItemsControl.DataTemplates>\n      </ItemsControl>\n    </TabItem>\n\n  </TabControl>\n\n</Window>\n"
  },
  {
    "path": "samples/DraggableDemo/MainWindow.axaml.cs",
    "content": "using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing DraggableDemo.Models;\n\nnamespace DraggableDemo;\n\npublic partial class MainWindow : Window\n{\n    public IList<Item> Items { get; set; }\n\n    public IList<string> Strings { get; }\n\n    public IList<Tile> Tiles { get; set; }\n\n    public MainWindow()\n    {\n        InitializeComponent();\n\n        Items = new ObservableCollection<Item>()\n        {\n            new () { Title = \"Item1\", X = 30, Y = 30 },\n            new () { Title = \"Item2\", X = 90, Y = 30 },\n            new () { Title = \"Item3\", X = 120, Y = 60 },\n            new () { Title = \"Item4\", X = 45, Y = 90 },\n            new () { Title = \"Item5\", X = 60, Y = 120 },\n            new () { Title = \"Item6\", X = 150, Y = 180 },\n            new () { Title = \"Item7\", X = 250, Y = 120 },\n            new () { Title = \"Item8\", X = 300, Y = 150 }\n        };\n\n        Strings = new ObservableCollection<string>();\n\n        for (var i = 0; i < 1_000; i++)\n        {\n            Strings.Add($\"Item {i+1} / {1000}\");\n        }\n\n        Tiles = new ObservableCollection<Tile>()\n        {\n            new () { Title = \"Tile1\", Column = 0, Row = 0, ColumnSpan = 1, RowSpan = 1, Background = \"Red\" },\n            new () { Title = \"Tile2\", Column = 0, Row = 1, ColumnSpan = 1, RowSpan = 1, Background = \"Green\" },\n            new () { Title = \"Tile3\", Column = 1, Row = 0, ColumnSpan = 1, RowSpan = 2, Background = \"Blue\" },\n            new () { Title = \"Tile4\", Column = 2, Row = 0, ColumnSpan = 1, RowSpan = 2, Background = \"Cyan\" },\n        };\n\n        DataContext = this;\n#if DEBUG\n        this.AttachDevTools();\n#endif\n    }\n\n    private void InitializeComponent()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "samples/DraggableDemo/Models/Item.cs",
    "content": "namespace DraggableDemo.Models;\n\npublic class Item\n{\n    public string? Title { get; set; }\n\n    public double X { get; set; }\n\n    public double Y { get; set; }\n\n    public override string? ToString() => Title;\n}"
  },
  {
    "path": "samples/DraggableDemo/Models/Tile.cs",
    "content": "namespace DraggableDemo.Models;\n\npublic class Tile\n{\n    public string? Title { get; set; }\n\n    public int Column { get; set; }\n\n    public int Row { get; set; }\n\n    public int ColumnSpan { get; set; }\n\n    public int RowSpan { get; set; }\n\n    public string? Background { get; set; }\n\n    public override string? ToString() => Title;\n}"
  },
  {
    "path": "samples/DraggableDemo/Program.cs",
    "content": "﻿using System;\nusing Avalonia;\nusing Avalonia.Xaml.Interactions.Core;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace DraggableDemo;\n\nclass Program\n{\n    public static void Main(string[] args) => BuildAvaloniaApp()\n        .StartWithClassicDesktopLifetime(args);\n\n    public static AppBuilder BuildAvaloniaApp()\n    {\n        GC.KeepAlive(typeof(Interaction).Assembly);\n        GC.KeepAlive(typeof(ComparisonConditionType).Assembly);\n        return AppBuilder.Configure<App>()\n            .UsePlatformDetect()\n            .LogToTrace();\n    }\n}\n"
  },
  {
    "path": "samples/DraggableDemo/Styles/Custom.axaml",
    "content": "<Styles xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n\n  <Styles.Resources>\n    <Thickness x:Key=\"TabControlTopPlacementItemMargin\">0 0 0 2</Thickness>\n  </Styles.Resources>\n\n  <!-- TabControl Custom Styles -->\n\n  <Style Selector=\":is(TabControl).custom\">\n    <Setter Property=\"Margin\" Value=\"0\" />\n    <Setter Property=\"Padding\" Value=\"{DynamicResource TabItemMargin}\" />\n    <Setter Property=\"Background\" Value=\"{DynamicResource TabControlBackground}\" />\n    <Setter Property=\"Template\">\n      <ControlTemplate>\n        <Border Margin=\"{TemplateBinding Margin}\"\n                BorderBrush=\"{TemplateBinding BorderBrush}\"\n                BorderThickness=\"{TemplateBinding BorderThickness}\"\n                Background=\"{TemplateBinding Background}\"\n                HorizontalAlignment=\"{TemplateBinding HorizontalAlignment}\"\n                VerticalAlignment=\"{TemplateBinding VerticalAlignment}\">\n          <DockPanel>\n            <Border Name=\"PART_ItemsPresenterBorder\"\n                    DockPanel.Dock=\"{TemplateBinding TabStripPlacement}\">\n              <ItemsPresenter Name=\"PART_ItemsPresenter\"\n                              ItemsPanel=\"{TemplateBinding ItemsPanel}\"/>\n            </Border>\n            <ContentPresenter Name=\"PART_SelectedContentHost\"\n                              Margin=\"{TemplateBinding Padding}\"\n                              HorizontalContentAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\n                              VerticalContentAlignment=\"{TemplateBinding VerticalContentAlignment}\"\n                              Content=\"{TemplateBinding SelectedContent}\"\n                              ContentTemplate=\"{TemplateBinding SelectedContentTemplate}\" />\n          </DockPanel>\n        </Border>\n      </ControlTemplate>\n    </Setter>\n  </Style>\n\n  <Style\n    Selector=\":is(TabControl)[TabStripPlacement=Left].custom /template/ ItemsPresenter#PART_ItemsPresenter > WrapPanel\">\n    <Setter Property=\"Orientation\" Value=\"Vertical\" />\n  </Style>\n\n  <Style\n    Selector=\":is(TabControl)[TabStripPlacement=Right].custom /template/ ItemsPresenter#PART_ItemsPresenter > WrapPanel\">\n    <Setter Property=\"Orientation\" Value=\"Vertical\" />\n  </Style>\n\n  <Style Selector=\":is(TabControl)[TabStripPlacement=Top].custom /template/ ItemsPresenter#PART_ItemsPresenter\">\n    <Setter Property=\"Margin\" Value=\"{DynamicResource TabControlTopPlacementItemMargin}\" />\n  </Style>\n\n  <Style Selector=\":is(TabControl).custom\">\n    <Setter Property=\"Background\" Value=\"LightGray\" />\n  </Style>\n\n  <Style Selector=\":is(TabControl).custom /template/ Border#PART_ItemsPresenterBorder\">\n    <Setter Property=\"Background\" Value=\"DarkGray\" />\n  </Style>\n\n  <!-- TabItem Custom Styles -->\n\n  <Style Selector=\":is(TabControl).custom > :is(TabItem)\">\n    <Setter Property=\"Margin\" Value=\"0,0,0,0\" />\n    <Setter Property=\"Padding\" Value=\"12,0,12,0\" />\n    <Setter Property=\"Background\" Value=\"WhiteSmoke\" />\n    <Setter Property=\"BorderBrush\" Value=\"Black\" />\n    <Setter Property=\"BorderThickness\" Value=\"1\" />\n  </Style>\n\n  <Style Selector=\":is(TabControl).custom > :is(TabItem):selected\">\n    <Setter Property=\"Background\" Value=\"White\" />\n  </Style>\n\n  <Style Selector=\":is(TabControl).custom > :is(TabItem):pointerover /template/ Border#PART_LayoutRoot\">\n    <Setter Property=\"Background\" Value=\"LightGray\" />\n  </Style>\n\n  <Style Selector=\":is(TabControl).custom > :is(TabItem):selected:pointerover /template/ Border#PART_LayoutRoot\">\n    <Setter Property=\"Background\" Value=\"LightGray\" />\n  </Style>\n\n  <Style Selector=\":is(TabControl).custom > :is(TabItem):selected /template/ Border#PART_SelectedPipe\">\n    <Setter Property=\"IsVisible\" Value=\"False\" />\n  </Style>\n\n</Styles>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Behaviors/Avalonia.Xaml.Behaviors.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <IncludeBuildOutput>False</IncludeBuildOutput>\n    <Nullable>enable</Nullable>\n    <NoWarn>$(NoWarn);NU5128</NoWarn>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Behaviors</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactions\\Avalonia.Xaml.Interactions.csproj\" />\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactions.Custom\\Avalonia.Xaml.Interactions.Custom.csproj\" />\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactions.DragAndDrop\\Avalonia.Xaml.Interactions.DragAndDrop.csproj\" />\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactions.Draggable\\Avalonia.Xaml.Interactions.Draggable.csproj\" />\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactions.Events\\Avalonia.Xaml.Interactions.Events.csproj\" />\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactions.Responsive\\Avalonia.Xaml.Interactions.Responsive.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions/Avalonia.Xaml.Interactions.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <OutputType>Library</OutputType>\n    <DocumentationFile>bin\\$(Configuration)\\$(TargetFramework)\\$(AssemblyName).xml</DocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Interactions</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions/Core/CallMethodAction.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Reflection;\nusing System.Threading.Tasks;\nusing Avalonia.Controls;\nusing Avalonia.Reactive;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Core;\n\n/// <summary>\n/// An action that calls a method on a specified object when invoked.\n/// </summary>\npublic class CallMethodAction : AvaloniaObject, IAction\n{\n    private Type? _targetObjectType;\n    private readonly List<MethodDescriptor> _methodDescriptors = new();\n    private MethodDescriptor? _cachedMethodDescriptor;\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"IsEnabled\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<bool> IsEnabledProperty =\n        AvaloniaProperty.Register<CallMethodAction, bool>(nameof(IsEnabled), defaultValue: true);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MethodName\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<string> MethodNameProperty =\n        AvaloniaProperty.Register<CallMethodAction, string>(nameof(MethodName));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetObject\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> TargetObjectProperty =\n        AvaloniaProperty.Register<CallMethodAction, object?>(nameof(TargetObject));\n\n    /// <summary>\n    /// Gets or sets a value indicating whether this instance is enabled.\n    /// </summary>\n    /// <value><c>true</c> if this instance is enabled; otherwise, <c>false</c>.</value>\n    public bool IsEnabled\n    {\n        get => GetValue(IsEnabledProperty);\n        set => SetValue(IsEnabledProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the name of the method to invoke. This is a avalonia property.\n    /// </summary>\n    public string MethodName\n    {\n        get => GetValue(MethodNameProperty);\n        set => SetValue(MethodNameProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the object that exposes the method of interest. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public object? TargetObject\n    {\n        get => GetValue(TargetObjectProperty);\n        set => SetValue(TargetObjectProperty, value);\n    }\n\n    static CallMethodAction()\n    {\n        MethodNameProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<string>>(MethodNameChanged));\n\n        TargetObjectProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<object?>>(TargetObjectChanged));\n    }\n\n    private static void MethodNameChanged(AvaloniaPropertyChangedEventArgs<string> e)\n    {\n        if (e.Sender is not CallMethodAction callMethodAction)\n        {\n            return;\n        }\n        \n        callMethodAction.UpdateMethodDescriptors();\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private static void TargetObjectChanged(AvaloniaPropertyChangedEventArgs<object?> e)\n    {\n        if (e.Sender is not CallMethodAction callMethodAction)\n        {\n            return;\n        }\n\n        var newValue = e.NewValue.GetValueOrDefault();\n        if (newValue is not null)\n        {\n            var newType = newValue.GetType();\n            callMethodAction.UpdateTargetType(newType);\n        }\n    }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>True if the method is called; else false.</returns>\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    public virtual object Execute(object? sender, object? parameter)\n    {\n        if (!IsEnabled)\n        {\n            return false;\n        }\n\n        var target = GetValue(TargetObjectProperty) is not null ? TargetObject : sender;\n        if (target is null || string.IsNullOrEmpty(MethodName))\n        {\n            return false;\n        }\n\n        UpdateTargetType(target.GetType());\n\n        var methodDescriptor = FindBestMethod(parameter);\n        if (methodDescriptor is null)\n        {\n            if (TargetObject is not null)\n            {\n                throw new ArgumentException(string.Format(\n                    CultureInfo.CurrentCulture,\n                    \"Cannot find method named {0} on object of type {1} that matches the expected signature.\",\n                    MethodName,\n                    _targetObjectType));\n            }\n\n            return false;\n        }\n\n        var parameters = methodDescriptor.Parameters;\n        switch (parameters.Length)\n        {\n            case 0:\n                methodDescriptor.MethodInfo.Invoke(target, null);\n                return true;\n            case 2:\n                methodDescriptor.MethodInfo.Invoke(target, new[] { target, parameter! });\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private MethodDescriptor? FindBestMethod(object? parameter)\n    {\n        if (parameter is null)\n        {\n            return _cachedMethodDescriptor;\n        }\n\n        var parameterTypeInfo = parameter.GetType().GetTypeInfo();\n\n        MethodDescriptor? mostDerivedMethod = null;\n\n        // Loop over the methods looking for the one whose type is closest to the type of the given parameter.\n        foreach (var currentMethod in _methodDescriptors)\n        {\n            var currentTypeInfo = currentMethod.SecondParameterTypeInfo;\n\n            if (currentTypeInfo is not null && currentTypeInfo.IsAssignableFrom(parameterTypeInfo))\n            {\n                if (mostDerivedMethod is null || !currentTypeInfo.IsAssignableFrom(mostDerivedMethod.SecondParameterTypeInfo))\n                {\n                    mostDerivedMethod = currentMethod;\n                }\n            }\n        }\n\n        return mostDerivedMethod ?? _cachedMethodDescriptor;\n    }\n\n    private void UpdateTargetType(Type newTargetType)\n    {\n        if (newTargetType == _targetObjectType)\n        {\n            return;\n        }\n\n        _targetObjectType = newTargetType;\n\n        UpdateMethodDescriptors();\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private void UpdateMethodDescriptors()\n    {\n        _methodDescriptors.Clear();\n        _cachedMethodDescriptor = null;\n\n        if (string.IsNullOrEmpty(MethodName) || _targetObjectType is null)\n        {\n            return;\n        }\n\n        // Find all public methods that match the given name  and have either no parameters,\n        // or two parameters where the first is of type Object.\n        foreach (var method in _targetObjectType.GetRuntimeMethods())\n        {\n            if (string.Equals(method.Name, MethodName, StringComparison.Ordinal)\n                && (method.ReturnType == typeof(void) || method.ReturnType == typeof(Task))\n                && method.IsPublic)\n            {\n                var parameters = method.GetParameters();\n                if (parameters.Length == 0)\n                {\n                    // There can be only one parameterless method of the given name.\n                    _cachedMethodDescriptor = new MethodDescriptor(method, parameters);\n                }\n                else if (parameters.Length == 2 && parameters[0].ParameterType == typeof(object))\n                {\n                    _methodDescriptors.Add(new MethodDescriptor(method, parameters));\n                }\n            }\n        }\n\n        // We didn't find a parameterless method, so we want to find a method that accepts null\n        // as a second parameter, but if we have more than one of these it is ambiguous which\n        // we should call, so we do nothing.\n        if (_cachedMethodDescriptor is null)\n        {\n            foreach (var method in _methodDescriptors)\n            {\n                var typeInfo = method.SecondParameterTypeInfo;\n                if (typeInfo is not null && (!typeInfo.IsValueType || typeInfo.IsGenericType && typeInfo.GetGenericTypeDefinition() == typeof(Nullable<>)))\n                {\n                    if (_cachedMethodDescriptor is not null)\n                    {\n                        _cachedMethodDescriptor = null;\n                        return;\n                    }\n\n                    _cachedMethodDescriptor = method;\n                }\n            }\n        }\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    [DebuggerDisplay($\"{{{nameof(MethodInfo)}}}\")]\n    private class MethodDescriptor(MethodInfo methodInfo, ParameterInfo[] methodParameters)\n    {\n        public MethodInfo MethodInfo { get; private set; } = methodInfo;\n\n        public ParameterInfo[] Parameters { get; private set; } = methodParameters;\n\n        public int ParameterCount => Parameters.Length;\n\n        public TypeInfo? SecondParameterTypeInfo\n        {\n            get => ParameterCount < 2 ? null : Parameters[1].ParameterType.GetTypeInfo();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions/Core/ChangePropertyAction.cs",
    "content": "﻿using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing Avalonia.Controls;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Core;\n\n/// <summary>\n/// An action that will change a specified property to a specified value when invoked.\n/// </summary>\npublic class ChangePropertyAction : AvaloniaObject, IAction\n{\n    private static readonly char[] s_trimChars = { '(', ')' };\n    private static readonly char[] s_separator = { '.' };\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private static Type? GetTypeByName(string name)\n    {\n        return\n            AppDomain.CurrentDomain.GetAssemblies()\n                .Reverse()\n                .Select(assembly => assembly.GetType(name))\n                .FirstOrDefault(t => t is not null)\n            ??\n            AppDomain.CurrentDomain.GetAssemblies()\n                .Reverse()\n                .SelectMany(assembly => assembly.GetTypes())\n                .FirstOrDefault(t => t.Name == name);\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private static AvaloniaProperty? FindAttachedProperty(object? targetObject, string propertyName)\n    {\n        if (targetObject is null)\n        {\n            return null;\n        }\n        \n        var propertyNames = propertyName.Trim().Trim(s_trimChars).Split(s_separator);\n        if (propertyNames.Length != 2)\n        {\n            return null;\n        }\n        var targetPropertyTypeName = propertyNames[0];\n        var targetPropertyName = propertyNames[1];\n        var targetType = GetTypeByName(targetPropertyTypeName) ?? targetObject.GetType();\n\n        var registeredAttached = AvaloniaPropertyRegistry.Instance.GetRegisteredAttached(targetType);\n\n        foreach (var avaloniaProperty in registeredAttached)\n        {\n            if (avaloniaProperty.OwnerType.Name == targetPropertyTypeName && avaloniaProperty.Name == targetPropertyName)\n            {\n                return avaloniaProperty;\n            }\n        }\n\n        var registeredInherited = AvaloniaPropertyRegistry.Instance.GetRegisteredInherited(targetType);\n\n        foreach (var avaloniaProperty in registeredInherited)\n        {\n            if (avaloniaProperty.Name == targetPropertyName)\n            {\n                return avaloniaProperty;\n            }\n        }\n\n        return null;\n    }\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"PropertyName\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<string> PropertyNameProperty =\n        AvaloniaProperty.Register<ChangePropertyAction, string>(nameof(PropertyName));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetObject\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> TargetObjectProperty =\n        AvaloniaProperty.Register<ChangePropertyAction, object?>(nameof(TargetObject));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"Value\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> ValueProperty =\n        AvaloniaProperty.Register<ChangePropertyAction, object?>(nameof(Value));\n\n    /// <summary>\n    /// Gets or sets the name of the property to change. This is a avalonia property.\n    /// </summary>\n    public string PropertyName\n    {\n        get => GetValue(PropertyNameProperty);\n        set => SetValue(PropertyNameProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the value to set. This is a avalonia property.\n    /// </summary>\n    public object? Value\n    {\n        get => GetValue(ValueProperty);\n        set => SetValue(ValueProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the object whose property will be changed.\n    /// If <seealso cref=\"TargetObject\"/> is not set or cannot be resolved, the sender of <seealso cref=\"Execute\"/> will be used. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public object? TargetObject\n    {\n        get => GetValue(TargetObjectProperty);\n        set => SetValue(TargetObjectProperty, value);\n    }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>True if updating the property value succeeds; else false.</returns>\n    public virtual object Execute(object? sender, object? parameter)\n    {\n        object? targetObject;\n        if (GetValue(TargetObjectProperty) is not null)\n        {\n            targetObject = TargetObject;\n        }\n        else\n        {\n            targetObject = sender;\n        }\n\n        if (targetObject is null)\n        {\n            return false;\n        }\n\n        if (targetObject is AvaloniaObject avaloniaObject)\n        {\n            if (PropertyName.Contains('.'))\n            {\n                var avaloniaProperty = FindAttachedProperty(targetObject, PropertyName);\n                if (avaloniaProperty is not null)\n                {\n                    UpdateAvaloniaPropertyValue(avaloniaObject, avaloniaProperty);\n                    return true;\n                }\n\n                return false;\n            }\n            else\n            {\n                var avaloniaProperty = AvaloniaPropertyRegistry.Instance.FindRegistered(avaloniaObject, PropertyName);\n                if (avaloniaProperty is not null)\n                {\n                    UpdateAvaloniaPropertyValue(avaloniaObject, avaloniaProperty);\n                    return true;\n                }\n            }\n        }\n\n        UpdatePropertyValue(targetObject);\n        return true;\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private void UpdatePropertyValue(object targetObject)\n    {\n        var targetType = targetObject.GetType();\n        var targetTypeName = targetType.Name;\n        var propertyInfo = targetType.GetRuntimeProperty(PropertyName);\n\n        if (propertyInfo is null)\n        {\n            throw new ArgumentException(string.Format(\n                CultureInfo.CurrentCulture,\n                \"Cannot find a property named {0} on type {1}.\",\n                PropertyName,\n                targetTypeName));\n        }\n        else if (!propertyInfo.CanWrite)\n        {\n            throw new ArgumentException(string.Format(\n                CultureInfo.CurrentCulture,\n                \"Cannot find a property named {0} on type {1}.\",\n                PropertyName,\n                targetTypeName));\n        }\n\n        Exception? innerException = null;\n        try\n        {\n            object? result = null;\n            var propertyType = propertyInfo.PropertyType;\n            var propertyTypeInfo = propertyType.GetTypeInfo();\n            if (Value is null)\n            {\n                // The result can be null if the type is generic (nullable), or the default value of the type in question\n                result = propertyTypeInfo.IsValueType ? Activator.CreateInstance(propertyType) : null;\n            }\n            else if (propertyTypeInfo.IsAssignableFrom(Value.GetType().GetTypeInfo()))\n            {\n                result = Value;\n            }\n            else\n            {\n                var valueAsString = Value.ToString();\n                if (valueAsString is not null)\n                {\n                    result = propertyTypeInfo.IsEnum ? Enum.Parse(propertyType, valueAsString, false) :\n                        TypeConverterHelper.Convert(valueAsString, propertyType);\n                }\n            }\n\n            propertyInfo.SetValue(targetObject, result, Array.Empty<object>());\n        }\n        catch (FormatException e)\n        {\n            innerException = e;\n        }\n        catch (ArgumentException e)\n        {\n            innerException = e;\n        }\n\n        if (innerException is not null)\n        {\n            throw new ArgumentException(string.Format(\n                    CultureInfo.CurrentCulture,\n                    \"Cannot assign value of type {0} to property {1} of type {2}. The {1} property can be assigned only values of type {2}.\",\n                    Value?.GetType().Name ?? \"null\",\n                    PropertyName,\n                    propertyInfo.PropertyType.Name),\n                innerException);\n        }\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private void UpdateAvaloniaPropertyValue(AvaloniaObject avaloniaObject, AvaloniaProperty property)\n    {\n        ValidateAvaloniaProperty(property);\n\n        Exception? innerException = null;\n        try\n        {\n            object? result = null;\n            var propertyType = property.PropertyType;\n            var propertyTypeInfo = propertyType.GetTypeInfo();\n            if (Value is null)\n            {\n                // The result can be null if the type is generic (nullable), or the default value of the type in question\n                result = propertyTypeInfo.IsValueType ? Activator.CreateInstance(propertyType) : null;\n            }\n            else if (propertyTypeInfo.IsAssignableFrom(Value.GetType().GetTypeInfo()))\n            {\n                result = Value;\n            }\n            else\n            {\n                var valueAsString = Value.ToString();\n                if (valueAsString is not null)\n                {\n                    result = propertyTypeInfo.IsEnum ? Enum.Parse(propertyType, valueAsString, false) :\n                        TypeConverterHelper.Convert(valueAsString, propertyType);\n                }\n            }\n\n            avaloniaObject.SetValue(property, result);\n        }\n        catch (FormatException e)\n        {\n            innerException = e;\n        }\n        catch (ArgumentException e)\n        {\n            innerException = e;\n        }\n\n        if (innerException is not null)\n        {\n            throw new ArgumentException(string.Format(\n                    CultureInfo.CurrentCulture,\n                    \"Cannot assign value of type {0} to property {1} of type {2}. The {1} property can be assigned only values of type {2}.\",\n                    Value?.GetType().Name ?? \"null\",\n                    PropertyName,\n                    avaloniaObject.GetType().Name),\n                innerException);\n        }\n    }\n\n    /// <summary>\n    /// Ensures the property is not null and can be written to.\n    /// </summary>\n    private void ValidateAvaloniaProperty(AvaloniaProperty? property)\n    {\n        if (property is null)\n        {\n            throw new ArgumentException(string.Format(\n                CultureInfo.CurrentCulture,\n                \"Cannot find a property named {0}.\",\n                PropertyName));\n        }\n        else if (property.IsReadOnly)\n        {\n            throw new ArgumentException(string.Format(\n                CultureInfo.CurrentCulture,\n                \"Cannot find a property named {0}.\",\n                PropertyName));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions/Core/DataTriggerBehavior.cs",
    "content": "﻿using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing Avalonia.Reactive;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Core;\n\n/// <summary>\n/// A behavior that performs actions when the bound data meets a specified condition.\n/// </summary>\npublic class DataTriggerBehavior : Trigger\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"Binding\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> BindingProperty =\n        AvaloniaProperty.Register<DataTriggerBehavior, object?>(nameof(Binding));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"ComparisonCondition\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<ComparisonConditionType> ComparisonConditionProperty =\n        AvaloniaProperty.Register<DataTriggerBehavior, ComparisonConditionType>(nameof(ComparisonCondition));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"Value\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> ValueProperty =\n        AvaloniaProperty.Register<DataTriggerBehavior, object?>(nameof(Value));\n\n    /// <summary>\n    /// Gets or sets the bound object that the <see cref=\"DataTriggerBehavior\"/> will listen to. This is a avalonia property.\n    /// </summary>\n    public object? Binding\n    {\n        get => GetValue(BindingProperty);\n        set => SetValue(BindingProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the type of comparison to be performed between <see cref=\"DataTriggerBehavior.Binding\"/> and <see cref=\"DataTriggerBehavior.Value\"/>. This is a avalonia property.\n    /// </summary>\n    public ComparisonConditionType ComparisonCondition\n    {\n        get => GetValue(ComparisonConditionProperty);\n        set => SetValue(ComparisonConditionProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the value to be compared with the value of <see cref=\"DataTriggerBehavior.Binding\"/>. This is a avalonia property.\n    /// </summary>\n    public object? Value\n    {\n        get => GetValue(ValueProperty);\n        set => SetValue(ValueProperty, value);\n    }\n\n    static DataTriggerBehavior()\n    {\n        BindingProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<object?>>(OnValueChanged));\n\n        ComparisonConditionProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<ComparisonConditionType>>(OnValueChanged));\n\n        ValueProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<object?>>(OnValueChanged));\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private static bool Compare(object? leftOperand, ComparisonConditionType operatorType, object? rightOperand)\n    {\n        if (leftOperand is not null && rightOperand is not null)\n        {\n            var value = rightOperand.ToString();\n            var destinationType = leftOperand.GetType();\n            if (value is not null)\n            {\n                rightOperand = TypeConverterHelper.Convert(value, destinationType);\n            }\n        }\n\n        var leftComparableOperand = leftOperand as IComparable;\n        var rightComparableOperand = rightOperand as IComparable;\n        if (leftComparableOperand is not null && rightComparableOperand is not null)\n        {\n            return EvaluateComparable(leftComparableOperand, operatorType, rightComparableOperand);\n        }\n\n        switch (operatorType)\n        {\n            case ComparisonConditionType.Equal:\n                return Equals(leftOperand, rightOperand);\n\n            case ComparisonConditionType.NotEqual:\n                return !Equals(leftOperand, rightOperand);\n\n            case ComparisonConditionType.LessThan:\n            case ComparisonConditionType.LessThanOrEqual:\n            case ComparisonConditionType.GreaterThan:\n            case ComparisonConditionType.GreaterThanOrEqual:\n            {\n                throw leftComparableOperand switch\n                {\n                    null when rightComparableOperand is null => new ArgumentException(string.Format(\n                        CultureInfo.CurrentCulture,\n                        \"Binding property of type {0} and Value property of type {1} cannot be used with operator {2}.\",\n                        leftOperand?.GetType().Name ?? \"null\", rightOperand?.GetType().Name ?? \"null\",\n                        operatorType.ToString())),\n                    null => new ArgumentException(string.Format(CultureInfo.CurrentCulture,\n                        \"Binding property of type {0} cannot be used with operator {1}.\",\n                        leftOperand?.GetType().Name ?? \"null\", operatorType.ToString())),\n                    _ => new ArgumentException(string.Format(CultureInfo.CurrentCulture,\n                        \"Value property of type {0} cannot be used with operator {1}.\",\n                        rightOperand?.GetType().Name ?? \"null\", operatorType.ToString()))\n                };\n            }\n        }\n\n        return false;\n    }\n\n    /// <summary>\n    /// Evaluates both operands that implement the IComparable interface.\n    /// </summary>\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private static bool EvaluateComparable(IComparable leftOperand, ComparisonConditionType operatorType, IComparable rightOperand)\n    {\n        object? convertedOperand = null;\n        try\n        {\n            convertedOperand = Convert.ChangeType(rightOperand, leftOperand.GetType(), CultureInfo.CurrentCulture);\n        }\n        catch (FormatException)\n        {\n            // FormatException: Convert.ChangeType(\"hello\", typeof(double), ...);\n        }\n        catch (InvalidCastException)\n        {\n            // InvalidCastException: Convert.ChangeType(4.0d, typeof(Rectangle), ...);\n        }\n\n        if (convertedOperand is null)\n        {\n            return operatorType == ComparisonConditionType.NotEqual;\n        }\n\n        var comparison = leftOperand.CompareTo((IComparable)convertedOperand);\n        return operatorType switch\n        {\n            ComparisonConditionType.Equal => comparison == 0,\n            ComparisonConditionType.NotEqual => comparison != 0,\n            ComparisonConditionType.LessThan => comparison < 0,\n            ComparisonConditionType.LessThanOrEqual => comparison <= 0,\n            ComparisonConditionType.GreaterThan => comparison > 0,\n            ComparisonConditionType.GreaterThanOrEqual => comparison >= 0,\n            _ => false\n        };\n    }\n\n    private static void OnValueChanged(AvaloniaPropertyChangedEventArgs args)\n    {\n        if (args.Sender is not DataTriggerBehavior behavior || behavior.AssociatedObject is null)\n        {\n            return;\n        }\n\n        // NOTE: In UWP version binding null check is not present but Avalonia throws exception as Bindings are null when first initialized.\n        var binding = behavior.Binding;\n        if (binding is not null)\n        {\n            // Some value has changed--either the binding value, reference value, or the comparison condition. Re-evaluate the equation.\n            if (Compare(behavior.Binding, behavior.ComparisonCondition, behavior.Value))\n            {\n                Interaction.ExecuteActions(behavior.AssociatedObject, behavior.Actions, args);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions/Core/EventTriggerBehavior.cs",
    "content": "﻿using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Reflection;\nusing Avalonia.Xaml.Interactivity;\nusing Avalonia.Controls;\nusing Avalonia.Reactive;\n\nnamespace Avalonia.Xaml.Interactions.Core;\n\n/// <summary>\n/// A behavior that listens for a specified event on its source and executes its actions when that event is fired.\n/// </summary>\npublic class EventTriggerBehavior : Trigger\n{\n    private const string EventNameDefaultValue = \"AttachedToVisualTree\";\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"EventName\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<string> EventNameProperty =\n        AvaloniaProperty.Register<EventTriggerBehavior, string>(nameof(EventName), EventNameDefaultValue);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"SourceObject\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> SourceObjectProperty =\n        AvaloniaProperty.Register<EventTriggerBehavior, object?>(nameof(SourceObject));\n\n    private object? _resolvedSource;\n    private Delegate? _eventHandler;\n    private bool _isLoadedEventRegistered;\n\n    /// <summary>\n    /// Gets or sets the name of the event to listen for. This is a avalonia property.\n    /// </summary>\n    public string EventName\n    {\n        get => GetValue(EventNameProperty);\n        set => SetValue(EventNameProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the source object from which this behavior listens for events.\n    /// If <seealso cref=\"SourceObject\"/> is not set, the source will default to <seealso cref=\"Behavior.AssociatedObject\"/>. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public object? SourceObject\n    {\n        get => GetValue(SourceObjectProperty);\n        set => SetValue(SourceObjectProperty, value);\n    }\n\n    static EventTriggerBehavior()\n    {\n        EventNameProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<string>>(EventNameChanged));\n\n        SourceObjectProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<object?>>(SourceObjectChanged));\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private static void EventNameChanged(AvaloniaPropertyChangedEventArgs<string> e)\n    {\n        if (e.Sender is not EventTriggerBehavior behavior)\n        {\n            return;\n        }\n\n        if (behavior.AssociatedObject is null || behavior._resolvedSource is null)\n        {\n            return;\n        }\n\n        var oldEventName = e.OldValue.GetValueOrDefault();\n        var newEventName = e.NewValue.GetValueOrDefault();\n\n        if (oldEventName is not null)\n        {\n            behavior.UnregisterEvent(oldEventName);\n        }\n\n        if (newEventName is not null)\n        {\n            behavior.RegisterEvent(newEventName);\n        }\n    }\n\n    private static void SourceObjectChanged(AvaloniaPropertyChangedEventArgs<object?> e)\n    {\n        if (e.Sender is EventTriggerBehavior behavior)\n        {\n            behavior.SetResolvedSource(behavior.ComputeResolvedSource());\n        }\n    }\n\n    /// <summary>\n    /// Called after the behavior is attached to the <see cref=\"Behavior.AssociatedObject\"/>.\n    /// </summary>\n    protected override void OnAttached()\n    {\n        base.OnAttached();\n        SetResolvedSource(ComputeResolvedSource());\n    }\n\n    /// <summary>\n    /// Called when the behavior is being detached from its <see cref=\"Behavior.AssociatedObject\"/>.\n    /// </summary>\n    protected override void OnDetaching()\n    {\n        base.OnDetaching();\n        SetResolvedSource(null);\n    }\n\n    private void SetResolvedSource(object? newSource)\n    {\n        if (AssociatedObject is null || _resolvedSource == newSource)\n        {\n            return;\n        }\n\n        if (_resolvedSource is not null)\n        {\n            UnregisterEvent(EventName);\n        }\n\n        _resolvedSource = newSource;\n\n        if (_resolvedSource is not null)\n        {\n            RegisterEvent(EventName);\n        }\n    }\n\n    private object? ComputeResolvedSource()\n    {\n        // If the SourceObject property is set at all, we want to use it. It is possible that it is data\n        // bound and bindings haven't been evaluated yet. Plus, this makes the API more predictable.\n        if (GetValue(SourceObjectProperty) is not null)\n        {\n            return SourceObject;\n        }\n\n        return AssociatedObject;\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private void RegisterEvent(string eventName)\n    {\n        if (string.IsNullOrEmpty(eventName))\n        {\n            return;\n        }\n\n        if (eventName != EventNameDefaultValue)\n        {\n            if (_resolvedSource is null)\n            {\n                return;\n            }\n            \n            var sourceObjectType = _resolvedSource.GetType();\n            var eventInfo = sourceObjectType.GetRuntimeEvent(EventName);\n            if (eventInfo is null)\n            {\n                throw new ArgumentException(string.Format(\n                    CultureInfo.CurrentCulture,\n                    \"Cannot find an event named {0} on type {1}.\",\n                    EventName,\n                    sourceObjectType.Name));\n            }\n\n            var methodInfo = typeof(EventTriggerBehavior).GetTypeInfo().GetDeclaredMethod(\"AttachedToVisualTree\");\n            if (methodInfo is not null)\n            {\n                var eventHandlerType = eventInfo.EventHandlerType;\n                if (eventHandlerType is not null)\n                {\n                    _eventHandler = methodInfo.CreateDelegate(eventHandlerType, this);\n                    if (_eventHandler is not null)\n                    {\n                        eventInfo.AddEventHandler(_resolvedSource, _eventHandler);\n                    }\n                }\n            }\n        }\n        else if (!_isLoadedEventRegistered)\n        {\n            if (_resolvedSource is Control element && !IsElementLoaded(element))\n            {\n                _isLoadedEventRegistered = true;\n                element.AttachedToVisualTree += AttachedToVisualTree;\n            }\n        }\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private void UnregisterEvent(string eventName)\n    {\n        if (string.IsNullOrEmpty(eventName))\n        {\n            return;\n        }\n\n        if (eventName != EventNameDefaultValue)\n        {\n            if (_eventHandler is null)\n            {\n                return;\n            }\n\n            if (_resolvedSource is not null)\n            {\n                var eventInfo = _resolvedSource.GetType().GetRuntimeEvent(eventName);\n                eventInfo?.RemoveEventHandler(_resolvedSource, _eventHandler); \n            }\n            _eventHandler = null;\n        }\n        else if (_isLoadedEventRegistered)\n        {\n            _isLoadedEventRegistered = false;\n            if (_resolvedSource is Control element)\n            {\n                element.AttachedToVisualTree -= AttachedToVisualTree; \n            }\n        }\n    }\n\n    /// <summary>\n    /// Raised when the control is attached to a rooted visual tree.\n    /// </summary>\n    /// <param name=\"sender\">The sender object.</param>\n    /// <param name=\"eventArgs\">The event args.</param>\n    protected virtual void AttachedToVisualTree(object? sender, object eventArgs)\n    {\n        Interaction.ExecuteActions(_resolvedSource, Actions, eventArgs);\n    }\n\n    private static bool IsElementLoaded(Control element) => element.Parent is not null;\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions/Core/InvokeCommandAction.cs",
    "content": "﻿using System.Windows.Input;\nusing Avalonia.Xaml.Interactivity;\nusing Avalonia.Data.Converters;\n\nnamespace Avalonia.Xaml.Interactions.Core;\n\n/// <summary>\n/// Executes a specified <see cref=\"System.Windows.Input.ICommand\"/> when invoked. \n/// </summary>\npublic class InvokeCommandAction : AvaloniaObject, IAction\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"IsEnabled\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<bool> IsEnabledProperty =\n        AvaloniaProperty.Register<InvokeCommandAction, bool>(nameof(IsEnabled), defaultValue: true);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"Command\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<ICommand?> CommandProperty =\n        AvaloniaProperty.Register<InvokeCommandAction, ICommand?>(nameof(Command));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"CommandParameter\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> CommandParameterProperty =\n        AvaloniaProperty.Register<InvokeCommandAction, object?>(nameof(CommandParameter));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"InputConverter\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<IValueConverter?> InputConverterProperty =\n        AvaloniaProperty.Register<InvokeCommandAction, IValueConverter?>(nameof(InputConverter));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"InputConverterParameter\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> InputConverterParameterProperty =\n        AvaloniaProperty.Register<InvokeCommandAction, object?>(nameof(InputConverterParameter));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"InputConverterLanguage\"/> avalonia property.\n    /// </summary>\n    /// <remarks>The string.Empty used for default value string means the invariant culture.</remarks>\n    public static readonly StyledProperty<string?> InputConverterLanguageProperty =\n        AvaloniaProperty.Register<InvokeCommandAction, string?>(nameof(InputConverterLanguage), string.Empty);\n\n    /// <summary>\n    /// Gets or sets a value indicating whether this instance is enabled.\n    /// </summary>\n    /// <value><c>true</c> if this instance is enabled; otherwise, <c>false</c>.</value>\n    public bool IsEnabled\n    {\n        get => GetValue(IsEnabledProperty);\n        set => SetValue(IsEnabledProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the command this action should invoke. This is a avalonia property.\n    /// </summary>\n    public ICommand? Command\n    {\n        get => GetValue(CommandProperty);\n        set => SetValue(CommandProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the parameter that is passed to <see cref=\"System.Windows.Input.ICommand.Execute(object)\"/>.\n    /// If this is not set, the parameter from the <seealso cref=\"Execute(object, object)\"/> method will be used.\n    /// This is an optional avalonia property.\n    /// </summary>\n    public object? CommandParameter\n    {\n        get => GetValue(CommandParameterProperty);\n        set => SetValue(CommandParameterProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the converter that is run on the parameter from the <seealso cref=\"Execute(object, object)\"/> method.\n    /// This is an optional avalonia property.\n    /// </summary>\n    public IValueConverter? InputConverter\n    {\n        get => GetValue(InputConverterProperty);\n        set => SetValue(InputConverterProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the parameter that is passed to the <see cref=\"IValueConverter.Convert\"/>\n    /// method of <see cref=\"InputConverter\"/>.\n    /// This is an optional avalonia property.\n    /// </summary>\n    public object? InputConverterParameter\n    {\n        get => GetValue(InputConverterParameterProperty);\n        set => SetValue(InputConverterParameterProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the language that is passed to the <see cref=\"IValueConverter.Convert\"/>\n    /// method of <see cref=\"InputConverter\"/>.\n    /// This is an optional avalonia property.\n    /// </summary>\n    public string? InputConverterLanguage\n    {\n        get => GetValue(InputConverterLanguageProperty);\n        set => SetValue(InputConverterLanguageProperty, value);\n    }\n\n    /// <summary>\n    /// Specifies whether the EventArgs of the event that triggered this action should be passed to the Command as a parameter.\n    /// </summary>\n    public bool PassEventArgsToCommand { get; set; }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>True if the command is successfully executed; else false.</returns>\n    public virtual object Execute(object? sender, object? parameter)\n    {\n        if (IsEnabled != true || Command is null)\n        {\n            return false;\n        }\n\n        object? resolvedParameter = default;\n        if (IsSet(CommandParameterProperty))\n        {\n            resolvedParameter = CommandParameter;\n        }\n        else if (InputConverter is not null)\n        {\n            resolvedParameter = InputConverter.Convert(\n                parameter,\n                typeof(object),\n                InputConverterParameter,\n                InputConverterLanguage is not null\n                    ? \n                    new System.Globalization.CultureInfo(InputConverterLanguage)\n                    : System.Globalization.CultureInfo.CurrentCulture);\n        }\n        else\n        {\n            if (PassEventArgsToCommand)\n            {\n                resolvedParameter = parameter;\n            }\n        }\n\n        if (!Command.CanExecute(resolvedParameter))\n        {\n            return false;\n        }\n\n        Command.Execute(resolvedParameter);\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing Avalonia.Metadata;\n\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactions\")]\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactions.Core\")]\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/AddClassAction.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Adds a specified <see cref=\"AddClassAction.ClassName\"/> to the <see cref=\"StyledElement.Classes\"/> collection when invoked. \n/// </summary>\npublic class AddClassAction : AvaloniaObject, IAction\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"ClassName\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<string> ClassNameProperty =\n        AvaloniaProperty.Register<AddClassAction, string>(nameof(ClassName));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"StyledElement\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<StyledElement?> StyledElementProperty =\n        AvaloniaProperty.Register<AddClassAction, StyledElement?>(nameof(StyledElement));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"RemoveIfExists\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<bool> RemoveIfExistsProperty =\n        AvaloniaProperty.Register<AddClassAction, bool>(nameof(RemoveIfExists));\n\n    /// <summary>\n    /// Gets or sets the class name that should be added. This is a avalonia property.\n    /// </summary>\n    public string ClassName\n    {\n        get => GetValue(ClassNameProperty);\n        set => SetValue(ClassNameProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the target styled element that class name that should be added to. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public StyledElement? StyledElement\n    {\n        get => GetValue(StyledElementProperty);\n        set => SetValue(StyledElementProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the flag indicated whether to remove the class if already exists before adding. This is a avalonia property.\n    /// </summary>\n    public bool RemoveIfExists\n    {\n        get => GetValue(RemoveIfExistsProperty);\n        set => SetValue(RemoveIfExistsProperty, value);\n    }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>True if the class is successfully added; else false.</returns>\n    public object Execute(object? sender, object? parameter)\n    {\n        var target = GetValue(StyledElementProperty) is not null ? StyledElement : sender as StyledElement;\n        if (target is null || string.IsNullOrEmpty(ClassName))\n        {\n            return false;\n        }\n\n        if (RemoveIfExists && target.Classes.Contains(ClassName))\n        {\n            target.Classes.Remove(ClassName);\n        }\n\n        target.Classes.Add(ClassName);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/AttachedToVisualTreeBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A base class for behaviors using attached to visual tree event.\n/// </summary>\n/// <typeparam name=\"T\"></typeparam>\npublic abstract class AttachedToVisualTreeBehavior<T> : DisposingBehavior<T> where T : Visual\n{\n\tprivate CompositeDisposable? _disposables;\n\n    /// <inheritdoc />\n\tprotected override void OnAttached(CompositeDisposable disposables)\n\t{\n\t\t_disposables = disposables;\n\t}\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n\t\tOnAttachedToVisualTree(_disposables!);\n    }\n\n    /// <summary>\n    /// Called after the behavior is attached to the <see cref=\"Behavior{T}.AssociatedObject\"/> visual tree.\n    /// </summary>\n    /// <param name=\"disposable\">The group of disposable resources that are disposed together</param>\n\tprotected abstract void OnAttachedToVisualTree(CompositeDisposable disposable);\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/Avalonia.Xaml.Interactions.Custom.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <OutputType>Library</OutputType>\n    <DocumentationFile>bin\\$(Configuration)\\$(TargetFramework)\\$(AssemblyName).xml</DocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Interactions.Custom</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n    <PackageReference Include=\"System.Reactive\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/BindPointerOverBehavior.cs",
    "content": "using System.Reactive;\nusing System.Reactive.Disposables;\nusing System.Reactive.Linq;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Input;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class BindPointerOverBehavior : DisposingBehavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n\tpublic static readonly StyledProperty<bool> IsPointerOverProperty =\n\t\tAvaloniaProperty.Register<BindPointerOverBehavior, bool>(nameof(IsPointerOver), defaultBindingMode: BindingMode.TwoWay);\n\n    /// <summary>\n    /// \n    /// </summary>\n\tpublic bool IsPointerOver\n\t{\n\t\tget => GetValue(IsPointerOverProperty);\n\t\tset => SetValue(IsPointerOverProperty, value);\n\t}\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposables\"></param>\n\tprotected override void OnAttached(CompositeDisposable disposables)\n\t{\n\t\tif (AssociatedObject is null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar dispose = Observable\n\t\t\t.FromEventPattern<AvaloniaPropertyChangedEventArgs>(AssociatedObject, nameof(PropertyChanged))\n\t\t\t.Select(x => x.EventArgs)\n\t\t\t.Subscribe(new AnonymousObserver<AvaloniaPropertyChangedEventArgs>(e =>\n            {\n                if (e.Property == InputElement.IsPointerOverProperty)\n                {\n                    IsPointerOver = e.NewValue is true;\n                }\n            }));\n        disposables.Add(dispose);\n\n\t\tdisposables.Add(Disposable.Create(() => IsPointerOver = false));\n\t}\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/BindTagToVisualRootDataContextBehavior.cs",
    "content": "﻿using System;\nusing Avalonia.Controls;\nusing Avalonia.VisualTree;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Binds AssociatedObject object Tag property to root visual DataContext.\n/// </summary>\npublic class BindTagToVisualRootDataContextBehavior : Behavior<Control>\n{\n    private IDisposable? _disposable;\n\n    /// <inheritdoc/>\n    protected override void OnAttachedToVisualTree()\n    {\n        var visualRoot = (Control?)AssociatedObject?.GetVisualRoot();\n        if (visualRoot is not null)\n        {\n            _disposable = BindDataContextToTag(visualRoot, AssociatedObject);\n        }\n    }\n\n    /// <inheritdoc/>\n    protected override void OnDetachedFromVisualTree()\n    {\n        _disposable?.Dispose();\n    }\n\n    private static IDisposable? BindDataContextToTag(Control source, Control? target)\n    {\n        if (source is null)\n            throw new ArgumentNullException(nameof(source));\n\n        if (target is null)\n            throw new ArgumentNullException(nameof(target));\n\n        var data = source.GetObservable(StyledElement.DataContextProperty);\n        return data is not null ? target.Bind(Control.TagProperty, data) : null;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/BindingBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Controls;\nusing Avalonia.Data;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class BindingBehavior : AttachedToVisualTreeBehavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<AvaloniaProperty?> TargetPropertyProperty =\n        AvaloniaProperty.Register<BindingBehavior, AvaloniaProperty?>(nameof(TargetProperty));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<AvaloniaObject?> TargetObjectProperty =\n        AvaloniaProperty.Register<BindingBehavior, AvaloniaObject?>(nameof(TargetObject));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<IBinding?> BindingProperty =\n        AvaloniaProperty.Register<BindingBehavior, IBinding?>(nameof(Binding));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public AvaloniaProperty? TargetProperty\n    {\n        get => GetValue(TargetPropertyProperty);\n        set => SetValue(TargetPropertyProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    [ResolveByName]\n    public AvaloniaObject? TargetObject\n    {\n        get => GetValue(TargetObjectProperty);\n        set => SetValue(TargetObjectProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    [AssignBinding]\n    public IBinding? Binding\n    {\n        get => GetValue(BindingProperty);\n        set => SetValue(BindingProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        if (TargetObject is not null && TargetProperty is not null && Binding is not null)\n        {\n            var dispose = TargetObject.Bind(TargetProperty, Binding);\n            disposable.Add(dispose);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/BoundsObserverBehavior.cs",
    "content": "using System.Reactive;\nusing System.Reactive.Disposables;\nusing Avalonia.Controls;\nusing Avalonia.Data;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Observes the bounds of an associated <see cref=\"Control\"/> and updates its Width and Height properties.\n/// </summary>\npublic class BoundsObserverBehavior : DisposingBehavior<Control>\n{\n    /// <summary>\n    /// Defines the <see cref=\"Bounds\"/> property.\n    /// </summary>\n    public static readonly StyledProperty<Rect> BoundsProperty =\n        AvaloniaProperty.Register<BoundsObserverBehavior, Rect>(nameof(Bounds), defaultBindingMode: BindingMode.OneWay);\n\n    /// <summary>\n    /// Defines the <see cref=\"Width\"/> property.\n    /// </summary>\n    public static readonly StyledProperty<double> WidthProperty =\n        AvaloniaProperty.Register<BoundsObserverBehavior, double>(nameof(Width),\n            defaultBindingMode: BindingMode.TwoWay);\n\n    /// <summary>\n    /// Defines the <see cref=\"Height\"/> property.\n    /// </summary>\n    public static readonly StyledProperty<double> HeightProperty =\n        AvaloniaProperty.Register<BoundsObserverBehavior, double>(nameof(Height),\n            defaultBindingMode: BindingMode.TwoWay);\n\n    /// <summary>\n    /// Gets or sets the bounds of the associated control. This is a styled Avalonia property.\n    /// </summary>\n    public Rect Bounds\n    {\n        get => GetValue(BoundsProperty);\n        set => SetValue(BoundsProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the width of the associated control. This is a two-way bound Avalonia property.\n    /// </summary>\n    public double Width\n    {\n        get => GetValue(WidthProperty);\n        set => SetValue(WidthProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the height of the associated control. This is a two-way bound Avalonia property.\n    /// </summary>\n    public double Height\n    {\n        get => GetValue(HeightProperty);\n        set => SetValue(HeightProperty, value);\n    }\n\n    /// <summary>\n    /// Attaches the behavior to the associated control and starts observing its bounds to update the Width and Height properties accordingly.\n    /// </summary>\n    /// <param name=\"disposables\">A composite disposable used to manage the lifecycle of subscriptions and other disposables.</param>\n    protected override void OnAttached(CompositeDisposable disposables)\n    {\n        if (AssociatedObject is not null)\n        {\n            disposables.Add(this.GetObservable(BoundsProperty)\n                .Subscribe(new AnonymousObserver<Rect>(bounds =>\n                {\n                    Width = bounds.Width;\n                    Height = bounds.Height;\n                })));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ButtonClickEventTriggerBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that listens for a <see cref=\"Button.ClickEvent\"/> event on its source and executes its actions when that event is fired.\n/// </summary>\npublic class ButtonClickEventTriggerBehavior : Trigger<Button>\n{\n    private KeyModifiers _savedKeyModifiers = KeyModifiers.None;\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"KeyModifiers\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<KeyModifiers> KeyModifiersProperty =\n        AvaloniaProperty.Register<ButtonClickEventTriggerBehavior, KeyModifiers>(nameof(KeyModifiers));\n\n    /// <summary>\n    /// Gets or sets the required key modifiers to execute <see cref=\"Button.ClickEvent\"/> event handler. This is a avalonia property.\n    /// </summary>\n    public KeyModifiers KeyModifiers\n    {\n        get => GetValue(KeyModifiersProperty);\n        set => SetValue(KeyModifiersProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.Click += AssociatedObject_OnClick;\n            AssociatedObject.AddHandler(InputElement.KeyDownEvent, Button_OnKeyDown, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.KeyUpEvent, Button_OnKeyUp, RoutingStrategies.Tunnel);\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.Click -= AssociatedObject_OnClick;\n            AssociatedObject.RemoveHandler(InputElement.KeyDownEvent, Button_OnKeyDown);\n            AssociatedObject.RemoveHandler(InputElement.KeyUpEvent, Button_OnKeyUp);\n        }\n    }\n\n    private void AssociatedObject_OnClick(object? sender, RoutedEventArgs e)\n    {\n        if (AssociatedObject is not null && KeyModifiers == _savedKeyModifiers)\n        {\n            Interaction.ExecuteActions(AssociatedObject, Actions, e);\n        }\n    }\n\n    private void Button_OnKeyDown(object? sender, KeyEventArgs e)\n    {\n        _savedKeyModifiers = e.KeyModifiers;\n    }\n\n    private void Button_OnKeyUp(object? sender, KeyEventArgs e)\n    {\n        _savedKeyModifiers = KeyModifiers.None;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ButtonExecuteCommandOnKeyDownBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Threading;\nusing Avalonia.VisualTree;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ButtonExecuteCommandOnKeyDownBehavior : ExecuteCommandOnKeyBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposables\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposables)\n    {\n        if (AssociatedObject?.GetVisualRoot() is InputElement inputRoot)\n        {\n            var disposable = inputRoot.AddDisposableHandler(InputElement.KeyDownEvent, RootDefaultKeyDown);\n            disposables.Add(disposable);\n        }\n    }\n\n    private void RootDefaultKeyDown(object? sender, KeyEventArgs e)\n    {\n        var haveKey = Key is not null && e.Key == Key;\n        var haveGesture = Gesture is not null && Gesture.Matches(e);\n\n        if (!haveKey && !haveGesture)\n        {\n            return;\n        }\n\n        if (AssociatedObject is Button button)\n        {\n            ExecuteCommand(button);\n        }\n    }\n\n    private bool ExecuteCommand(Button button)\n    {\n        if (!IsEnabled)\n        {\n            return false;\n        }\n\n        if (button is not { IsVisible: true, IsEnabled: true })\n        {\n            return false;\n        }\n\n        if (button.Command?.CanExecute(button.CommandParameter) != true)\n        {\n            return false;\n        }\n\n        if (FocusTopLevel)\n        {\n            Dispatcher.UIThread.Post(() => (AssociatedObject?.GetVisualRoot() as TopLevel)?.Focus());\n        }\n\n        if (FocusControl is { } focusControl)\n        {\n            Dispatcher.UIThread.Post(() => focusControl.Focus());\n        }\n        \n        button.Command.Execute(button.CommandParameter);\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ChangeAvaloniaPropertyAction.cs",
    "content": "﻿using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Reflection;\nusing Avalonia.Controls;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// An action that will change a specified Avalonia property to a specified value when invoked.\n/// </summary>\npublic class ChangeAvaloniaPropertyAction : AvaloniaObject, IAction\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetProperty\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<AvaloniaProperty?> TargetPropertyProperty =\n        AvaloniaProperty.Register<ChangeAvaloniaPropertyAction, AvaloniaProperty?>(nameof(TargetProperty));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetObject\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<AvaloniaObject?> TargetObjectProperty =\n        AvaloniaProperty.Register<ChangeAvaloniaPropertyAction, AvaloniaObject?>(nameof(TargetObject));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"Value\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> ValueProperty =\n        AvaloniaProperty.Register<ChangeAvaloniaPropertyAction, object?>(nameof(Value));\n\n    /// <summary>\n    /// Gets or sets the name of the Avalonia property to change. This is a avalonia property.\n    /// </summary>\n    public AvaloniaProperty? TargetProperty\n    {\n        get => GetValue(TargetPropertyProperty);\n        set => SetValue(TargetPropertyProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the value to set. This is a avalonia property.\n    /// </summary>\n    public object? Value\n    {\n        get => GetValue(ValueProperty);\n        set => SetValue(ValueProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the Avalonia object whose property will be changed.\n    /// If <seealso cref=\"TargetObject\"/> is not set or cannot be resolved, the sender of <seealso cref=\"Execute\"/> will be used. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public AvaloniaObject? TargetObject\n    {\n        get => GetValue(TargetObjectProperty);\n        set => SetValue(TargetObjectProperty, value);\n    }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>True if updating the property value succeeds; else false.</returns>\n    public virtual object Execute(object? sender, object? parameter)\n    {\n        var targetObject = GetValue(TargetObjectProperty) is not null ? TargetObject : sender;\n        if (targetObject is AvaloniaObject avaloniaObject && TargetProperty is not null)\n        {\n            UpdateAvaloniaPropertyValue(avaloniaObject, TargetProperty);\n            return true;\n        }\n\n        return false;\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private void UpdateAvaloniaPropertyValue(AvaloniaObject targetObject, AvaloniaProperty targetProperty)\n    {\n        ValidateTargetProperty(targetProperty);\n\n        Exception? innerException = null;\n        try\n        {\n            object? result = null;\n            var propertyType = targetProperty.PropertyType;\n            var propertyTypeInfo = propertyType.GetTypeInfo();\n            if (Value is null)\n            {\n                // The result can be null if the type is generic (nullable), or the default value of the type in question\n                result = propertyTypeInfo.IsValueType ? Activator.CreateInstance(propertyType) : null;\n            }\n            else if (propertyTypeInfo.IsAssignableFrom(Value.GetType().GetTypeInfo()))\n            {\n                result = Value;\n            }\n            else\n            {\n                var valueAsString = Value.ToString();\n                if (valueAsString is not null)\n                {\n                    result = propertyTypeInfo.IsEnum\n                        ? Enum.Parse(propertyType, valueAsString, false)\n                        : TypeConverterHelper.Convert(valueAsString, propertyType);\n                }\n            }\n\n            targetObject.SetValue(targetProperty, result);\n        }\n        catch (FormatException e)\n        {\n            innerException = e;\n        }\n        catch (ArgumentException e)\n        {\n            innerException = e;\n        }\n\n        if (innerException is not null)\n        {\n            throw new ArgumentException(string.Format(\n                    CultureInfo.CurrentCulture,\n                    \"Cannot assign value of type {0} to property {1} of type {2}. The {1} property can be assigned only values of type {2}.\",\n                    Value?.GetType().Name ?? \"null\",\n                    targetProperty.Name,\n                    targetObject.GetType().Name),\n                innerException);\n        }\n    }\n\n    /// <summary>\n    /// Ensures the property is not null and can be written to.\n    /// </summary>\n    private void ValidateTargetProperty(AvaloniaProperty? targetProperty)\n    {\n        if (targetProperty is null)\n        {\n            throw new ArgumentException(nameof(TargetProperty));\n        }\n        else if (targetProperty.IsReadOnly)\n        {\n            throw new ArgumentException(string.Format(\n                CultureInfo.CurrentCulture,\n                \"Property {0} is read-only.\",\n                targetProperty.Name));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/DisposingBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A base class for behaviors with disposable resources.\n/// </summary>\n/// <typeparam name=\"T\">The object type to attach to</typeparam>\npublic abstract class DisposingBehavior<T> : Behavior<T> where T : AvaloniaObject\n{\n    private CompositeDisposable? _disposables;\n\n    /// <inheritdoc />\n    protected override void OnAttached()\n    {\n        base.OnAttached();\n\n        _disposables?.Dispose();\n\n        _disposables = new CompositeDisposable();\n\n        OnAttached(_disposables);\n    }\n\n    /// <summary>\n    /// Called after the behavior is attached to the <see cref=\"Behavior.AssociatedObject\"/>.\n    /// </summary>\n    /// <param name=\"disposables\">The group of disposable resources that are disposed together.</param>\n    protected abstract void OnAttached(CompositeDisposable disposables);\n\n    /// <inheritdoc />\n    protected override void OnDetaching()\n    {\n        base.OnDetaching();\n\n        _disposables?.Dispose();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/DisposingTrigger.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class DisposingTrigger : Trigger\n{\n    private readonly CompositeDisposable _disposables = new();\n\n    /// <summary>\n    /// \n    /// </summary>\n    protected override void OnAttached()\n    {\n        base.OnAttached();\n\n        OnAttached(_disposables);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposables\"></param>\n    protected abstract void OnAttached(CompositeDisposable disposables);\n\n    /// <summary>\n    /// \n    /// </summary>\n    protected override void OnDetaching()\n    {\n        base.OnDetaching();\n\n        _disposables.Dispose();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/DragControlBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Media;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that allows controls to be moved around the canvas using RenderTransform of <see cref=\"Behavior.AssociatedObject\"/>.\n/// </summary>\npublic sealed class DragControlBehavior : Behavior<Control>\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> TargetControlProperty =\n        AvaloniaProperty.Register<DragControlBehavior, Control?>(nameof(TargetControl));\n\n    private Control? _parent;\n    private Point _previous;\n\n    /// <summary>\n    /// Gets or sets the target control to be moved around instead of <see cref=\"IBehavior.AssociatedObject\"/>. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? TargetControl\n    {\n        get => GetValue(TargetControlProperty);\n        set => SetValue(TargetControlProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        var source = AssociatedObject;\n        if (source is not null)\n        {\n            source.PointerPressed += Source_PointerPressed;\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        var source = AssociatedObject;\n        if (source is not null)\n        {\n            source.PointerPressed -= Source_PointerPressed;\n        }\n\n        _parent = null;\n    }\n\n    private void Source_PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        var target = TargetControl ?? AssociatedObject;\n        if (target is not null)\n        {\n            _parent = target.Parent as Control;\n\n            if (!(target.RenderTransform is TranslateTransform))\n            {\n                target.RenderTransform = new TranslateTransform();\n            }\n\n            _previous = e.GetPosition(_parent);\n            if (_parent != null)\n            {\n                _parent.PointerMoved += Parent_PointerMoved;\n                _parent.PointerReleased += Parent_PointerReleased;\n            }\n        }\n    }\n\n    private void Parent_PointerMoved(object? sender, PointerEventArgs args)\n    {\n        var target = TargetControl ?? AssociatedObject;\n        if (target is not null)\n        {\n            var pos = args.GetPosition(_parent);\n            if (target.RenderTransform is TranslateTransform tr)\n            {\n                tr.X += pos.X - _previous.X;\n                tr.Y += pos.Y - _previous.Y;\n            }\n\n            _previous = pos;\n        }\n    }\n\n    private void Parent_PointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n        if (_parent is not null)\n        {\n            _parent.PointerMoved -= Parent_PointerMoved;\n            _parent.PointerReleased -= Parent_PointerReleased;\n            _parent = null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandBehaviorBase.cs",
    "content": "using System.Windows.Input;\nusing Avalonia.Controls;\nusing Avalonia.Threading;\nusing Avalonia.VisualTree;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class ExecuteCommandBehaviorBase : AttachedToVisualTreeBehavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> IsEnabledProperty =\n        AvaloniaProperty.Register<ExecuteCommandBehaviorBase, bool>(nameof(IsEnabled), true);\n    \n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<ICommand?> CommandProperty =\n        AvaloniaProperty.Register<ExecuteCommandBehaviorBase, ICommand?>(nameof(Command));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<object?> CommandParameterProperty =\n        AvaloniaProperty.Register<ExecuteCommandBehaviorBase, object?>(nameof(CommandParameter));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> FocusTopLevelProperty =\n        AvaloniaProperty.Register<ExecuteCommandBehaviorBase, bool>(nameof(FocusTopLevel));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<Control?> FocusControlProperty =\n        AvaloniaProperty.Register<ExecuteCommandBehaviorBase, Control?>(nameof(CommandParameter));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool IsEnabled\n    {\n        get => GetValue(IsEnabledProperty);\n        set => SetValue(IsEnabledProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public ICommand? Command\n    {\n        get => GetValue(CommandProperty);\n        set => SetValue(CommandProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public object? CommandParameter\n    {\n        get => GetValue(CommandParameterProperty);\n        set => SetValue(CommandParameterProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool FocusTopLevel\n    {\n        get => GetValue(FocusTopLevelProperty);\n        set => SetValue(FocusTopLevelProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    [ResolveByName]\n    public Control? FocusControl\n    {\n        get => GetValue(FocusControlProperty);\n        set => SetValue(FocusControlProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <returns></returns>\n    protected virtual bool ExecuteCommand()\n    {\n        if (!IsEnabled)\n        {\n            return false;\n        }\n\n        if (AssociatedObject is not { IsVisible: true, IsEnabled: true })\n        {\n            return false;\n        }\n\n        if (Command?.CanExecute(CommandParameter) != true)\n        {\n            return false;\n        }\n\n        if (FocusTopLevel)\n        {\n            Dispatcher.UIThread.Post(() => (AssociatedObject?.GetVisualRoot() as TopLevel)?.Focus());\n        }\n\n        if (FocusControl is { } focusControl)\n        {\n            Dispatcher.UIThread.Post(() => focusControl.Focus());\n        }\n\n        Command.Execute(CommandParameter);\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnActivatedBehavior.cs",
    "content": "using System.Reactive;\nusing System.Reactive.Disposables;\nusing System.Reactive.Linq;\nusing Avalonia.Controls.ApplicationLifetimes;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnActivatedBehavior : ExecuteCommandBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime)\n        {\n            var mainWindow = lifetime.MainWindow;\n\n            if (mainWindow is not null)\n            {\n                var dispose = Observable\n                    .FromEventPattern(mainWindow, nameof(mainWindow.Activated))\n                    .Subscribe(new AnonymousObserver<EventPattern<object>>(e =>\n                    {\n                        ExecuteCommand();\n                    }));\n                disposable.Add(dispose);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnDoubleTappedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnDoubleTappedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.DoubleTappedEvent,\n                OnDoubleTapped,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnDoubleTapped(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnGotFocusBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnGotFocusBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.GotFocusEvent,\n                OnGotFocus,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnGotFocus(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnHoldingBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnHoldingBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.HoldingEvent,\n                OnHolding,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnHolding(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnKeyBehaviorBase.cs",
    "content": "using Avalonia.Input;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class ExecuteCommandOnKeyBehaviorBase : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<Key?> KeyProperty =\n        AvaloniaProperty.Register<ExecuteCommandOnKeyBehaviorBase, Key?>(nameof(Key));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<KeyGesture?> GestureProperty =\n        AvaloniaProperty.Register<ExecuteCommandOnKeyBehaviorBase, KeyGesture?>(nameof(Gesture));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public Key? Key\n    {\n        get => GetValue(KeyProperty);\n        set => SetValue(KeyProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public KeyGesture? Gesture\n    {\n        get => GetValue(GestureProperty);\n        set => SetValue(GestureProperty, value);\n    }\n\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnKeyDownBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnKeyDownBehavior : ExecuteCommandOnKeyBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.KeyDownEvent,\n                OnKeyDown,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnKeyDown(object? sender, KeyEventArgs e)\n    {\n        var haveKey = Key is not null && e.Key == Key;\n        var haveGesture = Gesture is not null && Gesture.Matches(e);\n\n        if (!haveKey && !haveGesture)\n        {\n            return;\n        }\n\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnKeyUpBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnKeyUpBehavior : ExecuteCommandOnKeyBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.KeyUpEvent,\n                OnKeyUp,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnKeyUp(object? sender, KeyEventArgs e)\n    {\n        var haveKey = Key is not null && e.Key == Key;\n        var haveGesture = Gesture is not null && Gesture.Matches(e);\n\n        if (!haveKey && !haveGesture)\n        {\n            return;\n        }\n\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnLostFocusBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnLostFocusBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.LostFocusEvent,\n                OnLostFocus,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnLostFocus(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPinchBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPinchBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.PinchEvent,\n                OnPinch,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPinch(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPinchEndedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPinchEndedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.PinchEndedEvent,\n                OnPinchEnded,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPinchEnded(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerCaptureLostBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerCaptureLostBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.PointerCaptureLostEvent,\n                OnPointerCaptureLost,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerCaptureLost(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerEnteredBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerEnteredBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.PointerEnteredEvent,\n                OnPointerEntered,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerEntered(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerExitedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerExitedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.PointerExitedEvent,\n                OnPointerExited,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerExited(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerMovedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerMovedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.PointerMovedEvent,\n                OnPointerMoved,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerMoved(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerPressedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerPressedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.PointerPressedEvent,\n                OnPointerPressed,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerPressed(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerReleasedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerReleasedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.PointerReleasedEvent,\n                OnPointerReleased,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerReleased(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerTouchPadGestureMagnifyBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerTouchPadGestureMagnifyBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.PointerTouchPadGestureMagnifyEvent,\n                OnPointerTouchPadGestureMagnify,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerTouchPadGestureMagnify(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerTouchPadGestureRotateBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerTouchPadGestureRotateBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.PointerTouchPadGestureRotateEvent,\n                OnPointerTouchPadGestureRotate,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerTouchPadGestureRotate(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerTouchPadGestureSwipeBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerTouchPadGestureSwipeBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.PointerTouchPadGestureSwipeEvent,\n                OnPointerTouchPadGestureSwipe,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerTouchPadGestureSwipe(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPointerWheelChangedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPointerWheelChangedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.PointerWheelChangedEvent,\n                OnPointerWheelChanged,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPointerWheelChanged(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPullGestureBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPullGestureBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.PullGestureEvent,\n                OnPullGesture,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPullGesture(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnPullGestureEndedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnPullGestureEndedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.PullGestureEndedEvent,\n                OnPullGestureEnded,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnPullGestureEnded(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnRightTappedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnRightTappedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.RightTappedEvent,\n                OnRightTapped,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnRightTapped(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnScrollGestureBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnScrollGestureBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.ScrollGestureEvent,\n                OnScrollGesture,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnScrollGesture(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnScrollGestureEndedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnScrollGestureEndedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.ScrollGestureEndedEvent,\n                OnScrollGestureEnded,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnScrollGestureEnded(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnScrollGestureInertiaStartingBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnScrollGestureInertiaStartingBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.ScrollGestureInertiaStartingEvent,\n                OnScrollGestureInertiaStarting,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnScrollGestureInertiaStarting(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnTappedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnTappedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.TappedEvent,\n                OnTapped,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnTapped(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnTextInputBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnTextInputBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.TextInputEvent,\n                OnTextInput,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnTextInput(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandOnTextInputMethodClientRequestedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class ExecuteCommandOnTextInputMethodClientRequestedBehavior : ExecuteCommandRoutedEventBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.TextInputMethodClientRequestedEvent,\n                OnTextInputMethodClientRequested,\n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void OnTextInputMethodClientRequested(object? sender, RoutedEventArgs e)\n    {\n        if (e.Handled)\n        {\n            return;\n        }\n\n        if (ExecuteCommand())\n        {\n            e.Handled = MarkAsHandled;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ExecuteCommandRoutedEventBehaviorBase.cs",
    "content": "using Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class ExecuteCommandRoutedEventBehaviorBase : ExecuteCommandBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> EventRoutingStrategyProperty =\n        AvaloniaProperty.Register<ExecuteCommandRoutedEventBehaviorBase, RoutingStrategies>(nameof(EventRoutingStrategy), RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies EventRoutingStrategy\n    {\n        get => GetValue(EventRoutingStrategyProperty);\n        set => SetValue(EventRoutingStrategyProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool MarkAsHandled { get; set; } = true;\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FadeInBehavior.cs",
    "content": "using System;\nusing Avalonia.Animation;\nusing Avalonia.Styling;\nusing System.Reactive.Disposables;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class FadeInBehavior : AttachedToVisualTreeBehavior<Visual>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<TimeSpan> InitialDelayProperty =\n        AvaloniaProperty.Register<FadeInBehavior, TimeSpan>(nameof(InitialDelay), TimeSpan.FromMilliseconds(500));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<TimeSpan> DurationProperty =\n        AvaloniaProperty.Register<FadeInBehavior, TimeSpan>(nameof(Duration), TimeSpan.FromMilliseconds(250));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public TimeSpan InitialDelay\n    {\n        get => GetValue(InitialDelayProperty);\n        set => SetValue(InitialDelayProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public TimeSpan Duration\n    {\n        get => GetValue(DurationProperty);\n        set => SetValue(DurationProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        if (AssociatedObject is null)\n        {\n            return;\n        }\n\n        var totalDuration = InitialDelay + Duration;\n\n        var animation = new Animation.Animation\n        {\n            Duration = totalDuration,\n            Children =\n            {\n                new KeyFrame {KeyTime = TimeSpan.Zero, Setters = {new Setter(Visual.OpacityProperty, 0d),}},\n                new KeyFrame {KeyTime = InitialDelay, Setters = {new Setter(Visual.OpacityProperty, 0d),}},\n                new KeyFrame {KeyTime = Duration, Setters = {new Setter(Visual.OpacityProperty, 1d),}}\n            }\n        };\n        animation.RunAsync(AssociatedObject);\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusBehavior.cs",
    "content": "using System.Reactive;\nusing System.Reactive.Disposables;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Threading;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class FocusBehavior : DisposingBehavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> IsFocusedProperty =\n        AvaloniaProperty.Register<FocusBehavior, bool>(nameof(IsFocused), defaultBindingMode: BindingMode.TwoWay);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool IsFocused\n    {\n        get => GetValue(IsFocusedProperty);\n        set => SetValue(IsFocusedProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposables\"></param>\n    protected override void OnAttached(CompositeDisposable disposables)\n    {\n\t\tif (AssociatedObject is not null)\n\t\t{\n\t\t\tdisposables.Add(AssociatedObject.GetObservable(Avalonia.Input.InputElement.IsFocusedProperty)\n\t\t\t\t.Subscribe(new AnonymousObserver<bool>(\n\t\t\t\t\tfocused =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!focused)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSetCurrentValue(IsFocusedProperty, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t})));\n\n\t\t\tdisposables.Add(this.GetObservable(IsFocusedProperty)\n\t\t\t\t.Subscribe(new AnonymousObserver<bool>(\n\t\t\t\t\tfocused =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (focused)\n\t\t\t\t\t\t{\n                            Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());\n\t\t\t\t\t\t}\n\t\t\t\t\t})));\n\t\t}\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusBehaviorBase.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Threading;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class FocusBehaviorBase : AttachedToVisualTreeBehavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> IsEnabledProperty =\n        AvaloniaProperty.Register<FocusBehaviorBase, bool>(nameof(IsEnabled), true);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<NavigationMethod> NavigationMethodProperty =\n        AvaloniaProperty.Register<FocusBehaviorBase, NavigationMethod>(nameof(NavigationMethod));\n    \n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<KeyModifiers> KeyModifiersProperty =\n        AvaloniaProperty.Register<FocusBehaviorBase, KeyModifiers>(nameof(KeyModifiers));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool IsEnabled\n    {\n        get => GetValue(IsEnabledProperty);\n        set => SetValue(IsEnabledProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public NavigationMethod NavigationMethod\n    {\n        get => GetValue(NavigationMethodProperty);\n        set => SetValue(NavigationMethodProperty, value);\n    }\n    \n    /// <summary>\n    /// \n    /// </summary>\n    public KeyModifiers KeyModifiers\n    {\n        get => GetValue(KeyModifiersProperty);\n        set => SetValue(KeyModifiersProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <returns></returns>\n    protected virtual bool Focus()\n    {\n        if (!IsEnabled)\n        {\n            return false;\n        }\n\n        Dispatcher.UIThread.Post(() => AssociatedObject?.Focus(NavigationMethod, KeyModifiers));\n\n        return true;\n\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusControlAction.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Threading;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Focuses the associated or target control when executed.\n/// </summary>\npublic class FocusControlAction : AvaloniaObject, IAction\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> TargetControlProperty =\n        AvaloniaProperty.Register<FocusControlAction, Control?>(nameof(TargetControl));\n\n    /// <summary>\n    /// Gets or sets the target control. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? TargetControl\n    {\n        get => GetValue(TargetControlProperty);\n        set => SetValue(TargetControlProperty, value);\n    }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>Returns null after executed.</returns>\n    public virtual object? Execute(object? sender, object? parameter)\n    {\n        var control = TargetControl ?? sender as Control;\n        Dispatcher.UIThread.Post(() => control?.Focus());\n        return null;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusOnAttachedBehavior.cs",
    "content": "using System.Reactive.Disposables;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class FocusOnAttachedBehavior : FocusBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposables\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposables)\n    {\n        Focus();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusOnAttachedToVisualTreeBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Threading;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Focuses the <see cref=\"Behavior.AssociatedObject\"/> when attached to visual tree.\n/// </summary>\npublic class FocusOnAttachedToVisualTreeBehavior : Behavior<Control>\n{\n    /// <inheritdoc/>\n    protected override void OnAttachedToVisualTree()\n    {\n        Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusOnPointerMovedBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Threading;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Focuses the <see cref=\"Behavior.AssociatedObject\"/> on <see cref=\"InputElement.PointerMoved\"/> event.\n/// </summary>\npublic class FocusOnPointerMovedBehavior : Behavior<Control>\n{\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerMoved += PointerMoved;\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerMoved -= PointerMoved;\n        }\n    }\n\n    private void PointerMoved(object? sender, PointerEventArgs args)\n    {\n        Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusOnPointerPressedBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Threading;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Focuses the <see cref=\"Behavior{T}.AssociatedObject\"/> on <see cref=\"InputElement.PointerPressed\"/> event.\n/// </summary>\npublic class FocusOnPointerPressedBehavior : Behavior<Control>\n{\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerPressed += PointerPressed;\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerPressed -= PointerPressed;\n        }\n    }\n\n    private void PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/FocusSelectedItemBehavior.cs",
    "content": "using System;\nusing System.Reactive.Disposables;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Threading;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class FocusSelectedItemBehavior : AttachedToVisualTreeBehavior<ItemsControl>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .GetObservable(SelectingItemsControl.SelectedItemProperty)\n            .Subscribe(selectedItem =>\n            {\n                var item = selectedItem;\n                if (item is not null)\n                {\n                    Dispatcher.UIThread.Post(() =>\n                    {\n                        var container = AssociatedObject.ContainerFromItem(item);\n                        if (container is not null)\n                        {\n                            container.Focus();\n                        }\n                    });\n                }\n            });\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/HideFlyoutOnClickBehavior.cs",
    "content": "using System;\nusing System.Reactive.Linq;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Interactivity;\nusing Avalonia.VisualTree;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class HideFlyoutOnClickBehavior : Behavior<RadioButton>\n{\n\tprivate IDisposable? _subscription;\n\n    /// <summary>\n    /// \n    /// </summary>\n\tprotected override void OnAttachedToVisualTree()\n\t{\n\t\tbase.OnAttachedToVisualTree();\n\n\t\tif (AssociatedObject == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n        \n\t\tvar fp = AssociatedObject.FindAncestorOfType<FlyoutPresenter>();\n\n\t\tif (fp?.Parent is not Popup popup)\n\t\t{\n\t\t\treturn;\n\t\t}\n        \n\t\t_subscription = Observable\n\t\t\t.FromEventPattern<RoutedEventArgs>(handler => AssociatedObject.Click += handler, handler => AssociatedObject.Click -= handler)\n\t\t\t.Do(_ =>\n\t\t\t{\n\t\t\t\t// Execute Command if any before closing. Otherwise, it won't execute because Close will destroy the associated object before Click can execute it.\n\t\t\t\tif (AssociatedObject.Command != null && AssociatedObject.IsEnabled)\n\t\t\t\t{\n\t\t\t\t\tAssociatedObject.Command.Execute(AssociatedObject.CommandParameter);\n\t\t\t\t}\n\t\t\t\tpopup.Close();\n\t\t\t})\n\t\t\t.Subscribe();\n\t}\n\n    /// <summary>\n    /// \n    /// </summary>\n\tprotected override void OnDetachedFromVisualTree()\n\t{\n\t\tbase.OnDetachedFromVisualTree();\n\t\t_subscription?.Dispose();\n\t}\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/HideOnKeyPressedBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that allows to hide control on key down event.\n/// </summary>\npublic class HideOnKeyPressedBehavior : Behavior<Control>\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> TargetControlProperty =\n        AvaloniaProperty.Register<HideOnKeyPressedBehavior, Control?>(nameof(TargetControl));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"Key\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Key> KeyProperty =\n        AvaloniaProperty.Register<HideOnKeyPressedBehavior, Key>(nameof(Key), Key.Escape);\n\n    /// <summary>\n    /// Gets or sets the target control. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? TargetControl\n    {\n        get => GetValue(TargetControlProperty);\n        set => SetValue(TargetControlProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the key. This is a avalonia property.\n    /// </summary>\n    public Key Key\n    {\n        get => GetValue(KeyProperty);\n        set => SetValue(KeyProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.KeyDownEvent, AssociatedObject_KeyDown,\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.KeyDownEvent, AssociatedObject_KeyDown);\n    }\n\n    private void AssociatedObject_KeyDown(object? sender, KeyEventArgs e)\n    {\n        if (e.Key == Key && TargetControl is not null)\n        {\n            TargetControl.IsVisible = false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/HideOnLostFocusBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that allows to hide control on lost focus event.\n/// </summary>\npublic class HideOnLostFocusBehavior : Behavior<Control>\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> TargetControlProperty =\n        AvaloniaProperty.Register<HideOnLostFocusBehavior, Control?>(nameof(TargetControl));\n\n    /// <summary>\n    /// Gets or sets the target control. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? TargetControl\n    {\n        get => GetValue(TargetControlProperty);\n        set => SetValue(TargetControlProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.LostFocusEvent, AssociatedObject_LostFocus,\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.LostFocusEvent, AssociatedObject_LostFocus);\n    }\n\n    private void AssociatedObject_LostFocus(object? sender, RoutedEventArgs e)\n    {\n        if (TargetControl is not null)\n        {\n            TargetControl.IsVisible = false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/HorizontalScrollViewerBehavior.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class HorizontalScrollViewerBehavior : Behavior<ScrollViewer>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public enum ChangeSize\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        Line,\n\n        /// <summary>\n        /// \n        /// </summary>\n        Page\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> IsEnabledProperty =\n        AvaloniaProperty.Register<HorizontalScrollViewerBehavior, bool>(nameof(IsEnabled), true);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> RequireShiftKeyProperty =\n        AvaloniaProperty.Register<HorizontalScrollViewerBehavior, bool>(nameof(RequireShiftKey));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<ChangeSize> ScrollChangeSizeProperty =\n        AvaloniaProperty.Register<HorizontalScrollViewerBehavior, ChangeSize>(nameof(ScrollChangeSize));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool IsEnabled\n    {\n        get => GetValue(IsEnabledProperty);\n        set => SetValue(IsEnabledProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool RequireShiftKey\n    {\n        get => GetValue(RequireShiftKeyProperty);\n        set => SetValue(RequireShiftKeyProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public ChangeSize ScrollChangeSize\n    {\n        get => GetValue(ScrollChangeSizeProperty);\n        set => SetValue(ScrollChangeSizeProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    protected override void OnAttached()\n    {\n        base.OnAttached();\n\n        AssociatedObject!.AddHandler(InputElement.PointerWheelChangedEvent, OnPointerWheelChanged,\n            RoutingStrategies.Tunnel);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    protected override void OnDetaching()\n    {\n        base.OnDetaching();\n\n        AssociatedObject!.RemoveHandler(InputElement.PointerWheelChangedEvent, OnPointerWheelChanged);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    private void OnPointerWheelChanged(object? sender, PointerWheelEventArgs e)\n    {\n        if (!IsEnabled)\n        {\n            e.Handled = true;\n            return;\n        }\n\n        if (RequireShiftKey && e.KeyModifiers == KeyModifiers.Shift || !RequireShiftKey)\n        {\n            if (e.Delta.Y < 0)\n            {\n                if (ScrollChangeSize == ChangeSize.Line)\n                {\n                    AssociatedObject!.LineRight();\n                }\n                else\n                {\n                    AssociatedObject!.PageRight();\n                }\n            }\n            else\n            {\n                if (ScrollChangeSize == ChangeSize.Line)\n                {\n                    AssociatedObject!.LineLeft();\n                }\n                else\n                {\n                    AssociatedObject!.PageLeft();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/KeyDownTrigger.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class KeyDownTrigger : RoutedEventTriggerBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<Key> KeyProperty =\n        AvaloniaProperty.Register<KeyDownTrigger, Key>(nameof(Key));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public Key Key\n    {\n        get => GetValue(KeyProperty);\n        set => SetValue(KeyProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool MarkAsHandled { get; set; }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposables\"></param>\n    protected override void OnAttached(CompositeDisposable disposables)\n    {\n        if (AssociatedObject is InputElement element)\n        {\n            var disposable = element.AddDisposableHandler(InputElement.KeyDownEvent, OnKeyDown, EventRoutingStrategy);\n            disposables.Add(disposable);\n        }\n    }\n\n    private void OnKeyDown(object? sender, KeyEventArgs e)\n    {\n        if (e.Key == Key)\n        {\n            e.Handled = MarkAsHandled;\n            Interaction.ExecuteActions(AssociatedObject, Actions, null);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/PopupAction.cs",
    "content": "﻿using System;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Metadata;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// An action that displays a <see cref=\"Popup\"/> for the associated control when executed.\n/// </summary>\n/// <remarks>If the associated control is of type <see cref=\"Control\"/> than popup inherits control <see cref=\"StyledElement.DataContext\"/>.</remarks>\npublic class PopupAction : AvaloniaObject, IAction\n{\n    private Popup? _popup;\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"ChildProperty\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> ChildProperty =\n        AvaloniaProperty.Register<PopupAction, Control?>(nameof(Child));\n\n    /// <summary>\n    /// Gets or sets the popup Child control. This is a avalonia property.\n    /// </summary>\n    [Content]\n    public Control? Child\n    {\n        get => GetValue(ChildProperty);\n        set => SetValue(ChildProperty, value);\n    }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>Returns null after executed.</returns>\n    public virtual object? Execute(object? sender, object? parameter)\n    {\n        if (_popup is null)\n        {\n            var parent = sender as Control;\n\n            _popup = new Popup()\n            {\n                Placement = PlacementMode.Pointer, PlacementTarget = parent, IsLightDismissEnabled = true\n            };\n\n            if (sender is Control control)\n            {\n                BindToDataContext(control, _popup);\n            }\n\n            ((ISetLogicalParent)_popup).SetParent(parent);\n        }\n\n        _popup.Child = Child;\n        _popup.Open();\n        return null;\n    }\n\n    private static void BindToDataContext(Control source, Control target)\n    {\n        if (source is null)\n        {\n            throw new ArgumentNullException(nameof(source));\n        }\n\n        if (target is null)\n        {\n            throw new ArgumentNullException(nameof(target));\n        }\n\n        var data = source.GetObservable(StyledElement.DataContextProperty);\n        if (data is not null)\n        {\n            target.Bind(StyledElement.DataContextProperty, data);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/Properties/AssemblyInfo.cs",
    "content": "using System.Runtime.CompilerServices;\nusing Avalonia.Metadata;\n\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactions.Custom\")]\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/RemoveClassAction.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Removes a specified <see cref=\"RemoveClassAction.ClassName\"/> from <see cref=\"StyledElement.Classes\"/> collection when invoked. \n/// </summary>\npublic class RemoveClassAction : AvaloniaObject, IAction\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"ClassName\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<string> ClassNameProperty =\n        AvaloniaProperty.Register<RemoveClassAction, string>(nameof(ClassName));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"StyledElement\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<StyledElement?> StyledElementProperty =\n        AvaloniaProperty.Register<RemoveClassAction, StyledElement?>(nameof(StyledElement));\n\n    /// <summary>\n    /// Gets or sets the class name that should be removed. This is a avalonia property.\n    /// </summary>\n    public string ClassName\n    {\n        get => GetValue(ClassNameProperty);\n        set => SetValue(ClassNameProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the target styled element that class name that should be removed from. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public StyledElement? StyledElement\n    {\n        get => GetValue(StyledElementProperty);\n        set => SetValue(StyledElementProperty, value);\n    }\n\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <returns>True if the class is successfully added; else false.</returns>\n    public object Execute(object? sender, object? parameter)\n    {\n        var target = GetValue(StyledElementProperty) is not null ? StyledElement : sender as StyledElement;\n        if (target is null || string.IsNullOrEmpty(ClassName))\n        {\n            return false;\n        }\n\n        if (target.Classes.Contains(ClassName))\n        {\n            target.Classes.Remove(ClassName);\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/RoutedEventTriggerBase.cs",
    "content": "using Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class RoutedEventTriggerBase : DisposingTrigger\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> EventRoutingStrategyProperty =\n        AvaloniaProperty.Register<RoutedEventTriggerBase, RoutingStrategies>(nameof(EventRoutingStrategy));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies EventRoutingStrategy\n    {\n        get => GetValue(EventRoutingStrategyProperty);\n        set => SetValue(EventRoutingStrategyProperty, value);\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/RoutedEventTriggerBehavior.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing Avalonia.Reactive;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that listens for a <see cref=\"RoutedEvent\"/> event on its source and executes its actions when that event is fired.\n/// </summary>\npublic class RoutedEventTriggerBehavior : Trigger<Interactive>\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"RoutedEvent\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<RoutedEvent?> RoutedEventProperty =\n        AvaloniaProperty.Register<RoutedEventTriggerBehavior, RoutedEvent?>(nameof(RoutedEvent));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"RoutingStrategies\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty =\n        AvaloniaProperty.Register<RoutedEventTriggerBehavior, RoutingStrategies>(nameof(RoutingStrategies),\n            RoutingStrategies.Direct | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"SourceInteractive\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Interactive?> SourceInteractiveProperty =\n        AvaloniaProperty.Register<RoutedEventTriggerBehavior, Interactive?>(nameof(SourceInteractive));\n\n    private bool _isInitialized;\n    private bool _isAttached;\n\n    /// <summary>\n    /// Gets or sets routing event to listen for. This is a avalonia property.\n    /// </summary>\n    public RoutedEvent? RoutedEvent\n    {\n        get => GetValue(RoutedEventProperty);\n        set => SetValue(RoutedEventProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the routing event <see cref=\"RoutingStrategies\"/>. This is a avalonia property.\n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the source object from which this behavior listens for events.\n    /// If <seealso cref=\"SourceInteractive\"/> is not set, the source will default to <seealso cref=\"Behavior.AssociatedObject\"/>. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Interactive? SourceInteractive\n    {\n        get => GetValue(SourceInteractiveProperty);\n        set => SetValue(SourceInteractiveProperty, value);\n    }\n\n    static RoutedEventTriggerBehavior()\n    {\n        RoutedEventProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<RoutedEvent?>>(OnValueChanged));\n\n        RoutingStrategiesProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<RoutingStrategies>>(OnValueChanged));\n\n        SourceInteractiveProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<Interactive?>>(OnValueChanged));\n    }\n\n    private static void OnValueChanged(AvaloniaPropertyChangedEventArgs args)\n    {\n        if (args.Sender is not RoutedEventTriggerBehavior behavior || behavior.AssociatedObject is null)\n        {\n            return;\n        }\n\n        if (behavior._isInitialized && behavior._isAttached)\n        {\n            behavior.RemoveHandler();\n            behavior.AddHandler();\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        _isAttached = true;\n        AddHandler();\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        _isAttached = false;\n        RemoveHandler();\n    }\n\n    private void AddHandler()\n    {\n        var interactive = ComputeResolvedSourceInteractive();\n        if (interactive is not null && RoutedEvent is not null)\n        {\n            interactive.AddHandler(RoutedEvent, Handler, RoutingStrategies);\n            _isInitialized = true;\n        }\n    }\n\n    private void RemoveHandler()\n    {\n        var interactive = ComputeResolvedSourceInteractive();\n        if (interactive is not null && RoutedEvent is not null && _isInitialized)\n        {\n            interactive.RemoveHandler(RoutedEvent, Handler);\n            _isInitialized = false;\n        }\n    }\n\n    private Interactive? ComputeResolvedSourceInteractive()\n    {\n        return GetValue(SourceInteractiveProperty) is not null ? SourceInteractive : AssociatedObject;\n    }\n\n    private void Handler(object? sender, RoutedEventArgs e)\n    {\n        var interactive = ComputeResolvedSourceInteractive();\n        if (interactive is not null)\n        {\n            Interaction.ExecuteActions(interactive, Actions, e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/SelectAllOnGotFocusBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that allows to select all <see cref=\"TextBox\"/> text on got focus event.\n/// </summary>\npublic class SelectAllOnGotFocusBehavior : Behavior<TextBox>\n{\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.GotFocusEvent, AssociatedObject_GotFocus, RoutingStrategies.Bubble);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.GotFocusEvent, AssociatedObject_GotFocus);\n    }\n\n    private void AssociatedObject_GotFocus(object? sender, GotFocusEventArgs e)\n    {\n        AssociatedObject?.SelectAll();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/SelectListBoxItemOnPointerMovedBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Threading;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Sets <see cref=\"ListBoxItem.IsSelected\"/> property to true of the associated <see cref=\"ListBoxItem\"/> control on <see cref=\"InputElement.PointerMoved\"/> event.\n/// </summary>\npublic class SelectListBoxItemOnPointerMovedBehavior : Behavior<Control>\n{\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerMoved += PointerMoved;\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerMoved -= PointerMoved;\n        }\n    }\n\n    private void PointerMoved(object? sender, PointerEventArgs args)\n    {\n        if (AssociatedObject is {Parent: ListBoxItem item})\n        {\n            item.SetCurrentValue(ListBoxItem.IsSelectedProperty, true);\n            Dispatcher.UIThread.Post(() => item.Focus());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/SelectingItemsControlBehavior.cs",
    "content": "﻿// Based on code: https://github.com/adirh3/Avalonia.ListBoxAnimation.Samples\n\nusing System;\nusing System.Linq;\nusing System.Numerics;\nusing Avalonia.Animation.Easings;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Rendering.Composition;\nusing Avalonia.VisualTree;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class SelectingItemsControlBehavior\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly AttachedProperty<bool> EnableSelectionAnimationProperty =\n        AvaloniaProperty.RegisterAttached<SelectingItemsControl, bool>(\"EnableSelectionAnimation\",\n            typeof(SelectingItemsControlBehavior));\n\n    /// <summary>\n    /// \n    /// </summary>\n    static SelectingItemsControlBehavior()\n    {\n        EnableSelectionAnimationProperty.Changed.AddClassHandler<Control>(OnEnableSelectionAnimation);\n    }\n\n    private static void OnEnableSelectionAnimation(Control control, AvaloniaPropertyChangedEventArgs args)\n    {\n        if (control is SelectingItemsControl selectingItemsControl)\n        {\n            if (args.NewValue is true)\n            {\n                selectingItemsControl.PropertyChanged += SelectingItemsControlPropertyChanged;\n            }\n            else\n            {\n                selectingItemsControl.PropertyChanged -= SelectingItemsControlPropertyChanged;\n            }\n        }\n    }\n\n    private static void SelectingItemsControlPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs args)\n    {\n        if (sender is not SelectingItemsControl selectingItemsControl ||\n            args.Property != SelectingItemsControl.SelectedIndexProperty ||\n            args.OldValue is not int oldIndex || args.NewValue is not int newIndex)\n        {\n            return;\n        }\n\n        if (selectingItemsControl.ContainerFromIndex(newIndex) is not TemplatedControl newSelection\n            || selectingItemsControl.ContainerFromIndex(oldIndex) is not TemplatedControl oldSelection)\n        {\n            return;\n        }\n\n        StartOffsetAnimation(newSelection, oldSelection);\n    }\n\n    private static void StartOffsetAnimation(TemplatedControl newSelection, TemplatedControl oldSelection)\n    {\n        // Find the indicator border\n        // NOTE:\n        // The original required putting PART_SelectedPipe in template (e.g. ListBox > ListBoxItem)\n        // and used GetTemplateChildren() instead of GetVisualDescendants()\n        if (newSelection.GetVisualDescendants().FirstOrDefault(s => s.Name == \"PART_SelectedPipe\") is not { } borderPipe\n            || oldSelection.GetVisualDescendants().FirstOrDefault(s => s.Name == \"PART_SelectedPipe\") is not\n                { } oldPipe)\n        {\n            return;\n        }\n\n        // Clear old implicit animations if any\n        ElementComposition.GetElementVisual(oldPipe)?.ImplicitAnimations?.Clear();\n\n        // Get the composition visuals for all controls\n        var pipeVisual = ElementComposition.GetElementVisual(borderPipe);\n        var newSelectionVisual = ElementComposition.GetElementVisual(newSelection);\n        var oldSelectionVisual = ElementComposition.GetElementVisual(oldSelection);\n        if (pipeVisual == null || newSelectionVisual == null || oldSelectionVisual == null)\n        {\n            return;\n        }\n\n        // Calculate the offset between old and new selections\n        var selectionOffset = oldSelectionVisual.Offset - newSelectionVisual.Offset;\n\n        // Check whether the offset is vertical (e.g. ListBox) or horizontal (e.g. TabControl)\n        // Note this code assumes the items are aligned in the SelectingItemsControl\n        var isVerticalOffset = selectionOffset.Y != 0;\n        var offset = isVerticalOffset ? selectionOffset.Y : selectionOffset.X;\n        var compositor = pipeVisual.Compositor;\n\n        // This is required\n        var quadraticEaseIn = new SpringEasing();\n\n        // Create new offset animation between old selection position to the current position\n        var offsetAnimation = compositor.CreateVector3KeyFrameAnimation();\n        offsetAnimation.Target = \"Offset\";\n        var expression = (offset > 0 ? \"+\" : \"-\") + Math.Abs(offset);\n        offsetAnimation.InsertExpressionKeyFrame(\n            0f,\n            isVerticalOffset\n                ? $\"Vector3(this.FinalValue.X, this.FinalValue.Y{expression}, 0)\"\n                : $\"Vector3(this.FinalValue.X{expression}, this.FinalValue.Y, 0)\");\n        offsetAnimation.InsertExpressionKeyFrame(1f, \"this.FinalValue\");\n        offsetAnimation.Duration = TimeSpan.FromMilliseconds(250);\n\n        // Create small scale animation so the pipe will \"stretch\" while it's moving\n        var scaleAnimation = compositor.CreateVector3KeyFrameAnimation();\n        scaleAnimation.Target = \"Scale\";\n        scaleAnimation.InsertKeyFrame(0f, Vector3.One, quadraticEaseIn);\n        scaleAnimation.InsertKeyFrame(0.5f,\n            new Vector3(1f + (!isVerticalOffset ? 0.75f : 0f), 1f + (isVerticalOffset ? 0.75f : 0f), 1f),\n            quadraticEaseIn);\n        scaleAnimation.InsertKeyFrame(1f, Vector3.One, quadraticEaseIn);\n        scaleAnimation.Duration = TimeSpan.FromMilliseconds(250);\n\n        var compositionAnimationGroup = compositor.CreateAnimationGroup();\n        compositionAnimationGroup.Add(offsetAnimation);\n        compositionAnimationGroup.Add(scaleAnimation);\n        var pipeVisualImplicitAnimations = compositor.CreateImplicitAnimationCollection();\n        var currentOffset = isVerticalOffset ? pipeVisual.Offset.Y : pipeVisual.Offset.X;\n        if (currentOffset == 0)\n        {\n            // Visual first shown, offset not calculated, lets trigger using Offset\n            pipeVisualImplicitAnimations[\"Offset\"] = compositionAnimationGroup;\n        }\n        else\n        {\n            // Visual already shown, we can't trigger on Offset as it won't change\n            pipeVisualImplicitAnimations[\"Visible\"] = compositionAnimationGroup;\n        }\n\n        pipeVisual.ImplicitAnimations = pipeVisualImplicitAnimations;\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <returns></returns>\n    public static bool GetEnableSelectionAnimation(SelectingItemsControl element)\n    {\n        return element.GetValue(EnableSelectionAnimationProperty);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <param name=\"value\"></param>\n    public static void SetEnableSelectionAnimation(SelectingItemsControl element, bool value)\n    {\n        element.SetValue(EnableSelectionAnimationProperty, value);\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ShowBehaviorBase.cs",
    "content": "using Avalonia.Controls;\nusing Avalonia.Interactivity;\nusing Avalonia.Threading;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class ShowBehaviorBase : AttachedToVisualTreeBehavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> IsEnabledProperty =\n        AvaloniaProperty.Register<ShowBehaviorBase, bool>(nameof(IsEnabled), true);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> TargetControlProperty =\n        AvaloniaProperty.Register<ShowBehaviorBase, Control?>(nameof(TargetControl));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> EventRoutingStrategyProperty =\n        AvaloniaProperty.Register<ShowBehaviorBase, RoutingStrategies>(nameof(EventRoutingStrategy), RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool IsEnabled\n    {\n        get => GetValue(IsEnabledProperty);\n        set => SetValue(IsEnabledProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the target control. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? TargetControl\n    {\n        get => GetValue(TargetControlProperty);\n        set => SetValue(TargetControlProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies EventRoutingStrategy\n    {\n        get => GetValue(EventRoutingStrategyProperty);\n        set => SetValue(EventRoutingStrategyProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <returns></returns>\n    protected bool Show()\n    {\n        if (IsEnabled && TargetControl is { IsVisible: false })\n        {\n            TargetControl.SetCurrentValue(Visual.IsVisibleProperty, true);\n\n            Dispatcher.UIThread.Post(() => TargetControl.Focus());\n\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ShowOnDoubleTappedBehavior.cs",
    "content": "﻿using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that allows to show control on double tapped event.\n/// </summary>\npublic class ShowOnDoubleTappedBehavior : ShowBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.DoubleTappedEvent, \n                AssociatedObject_DoubleTapped, \n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void AssociatedObject_DoubleTapped(object? sender, RoutedEventArgs e)\n    {\n        Show();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ShowOnKeyDownBehavior.cs",
    "content": "﻿using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that allows to show control on key down event.\n/// </summary>\npublic class ShowOnKeyDownBehavior : ShowBehaviorBase\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"Key\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Key?> KeyProperty =\n        AvaloniaProperty.Register<ShowOnKeyDownBehavior, Key?>(nameof(Key));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<KeyGesture?> GestureProperty =\n        AvaloniaProperty.Register<ShowOnKeyDownBehavior, KeyGesture?>(nameof(Gesture));\n\n    /// <summary>\n    /// Gets or sets the key. This is a avalonia property.\n    /// </summary>\n    public Key? Key\n    {\n        get => GetValue(KeyProperty);\n        set => SetValue(KeyProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public KeyGesture? Gesture\n    {\n        get => GetValue(GestureProperty);\n        set => SetValue(GestureProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                InputElement.KeyDownEvent, \n                AssociatedObject_KeyDown, \n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void AssociatedObject_KeyDown(object? sender, KeyEventArgs e)\n    {\n        var haveKey = Key is not null && e.Key == Key;\n        var haveGesture = Gesture is not null && Gesture.Matches(e);\n\n        if (!haveKey && !haveGesture)\n        {\n            return;\n        }\n        \n        Show();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ShowOnTappedBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that allows to show control on tapped event.\n/// </summary>\npublic class ShowOnTappedBehavior : ShowBehaviorBase\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        var dispose = AssociatedObject?\n            .AddDisposableHandler(\n                Gestures.TappedEvent, \n                AssociatedObject_Tapped, \n                EventRoutingStrategy);\n\n        if (dispose is not null)\n        {\n            disposable.Add(dispose);\n        }\n    }\n\n    private void AssociatedObject_Tapped(object? sender, RoutedEventArgs e)\n    {\n        Show();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ShowPointerPositionBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that displays cursor position on <see cref=\"InputElement.PointerMoved\"/> event for the <see cref=\"Behavior{T}.AssociatedObject\"/> using <see cref=\"TextBlock.Text\"/> property.\n/// </summary>\npublic class ShowPointerPositionBehavior : Behavior<Control>\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetTextBlockProperty\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<TextBlock?> TargetTextBlockProperty =\n        AvaloniaProperty.Register<ShowPointerPositionBehavior, TextBlock?>(nameof(TargetTextBlock));\n\n    /// <summary>\n    /// Gets or sets the target TextBlock object in which this behavior displays cursor position on PointerMoved event.\n    /// </summary>\n    [ResolveByName]\n    public TextBlock? TargetTextBlock\n    {\n        get => GetValue(TargetTextBlockProperty);\n        set => SetValue(TargetTextBlockProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerMoved += AssociatedObject_PointerMoved;\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.PointerMoved -= AssociatedObject_PointerMoved;\n        }\n    }\n\n    private void AssociatedObject_PointerMoved(object? sender, PointerEventArgs e)\n    {\n        if (TargetTextBlock is not null)\n        {\n            TargetTextBlock.Text = e.GetPosition(AssociatedObject).ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/TextBoxSelectAllTextBehavior.cs",
    "content": "using System.Reactive.Disposables;\nusing Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// \n/// </summary>\npublic class TextBoxSelectAllTextBehavior : AttachedToVisualTreeBehavior<TextBox>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"disposable\"></param>\n    protected override void OnAttachedToVisualTree(CompositeDisposable disposable)\n    {\n        AssociatedObject?.SelectAll();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ToggleIsExpandedOnDoubleTappedBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// Toggles <see cref=\"TreeViewItem.IsExpanded\"/> property of the associated <see cref=\"TreeViewItem\"/> control on <see cref=\"InputElement.DoubleTapped\"/> event.\n/// </summary>\npublic class ToggleIsExpandedOnDoubleTappedBehavior : Behavior<Control>\n{\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.DoubleTapped += DoubleTapped;\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.DoubleTapped -= DoubleTapped;\n        }\n    }\n\n    private void DoubleTapped(object? sender, RoutedEventArgs args)\n    {\n        if (AssociatedObject is {Parent: TreeViewItem item})\n        {\n            item.IsExpanded = !item.IsExpanded;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Custom/ValueChangedTriggerBehavior.cs",
    "content": "﻿using Avalonia.Reactive;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Custom;\n\n/// <summary>\n/// A behavior that performs actions when the bound data produces new value.\n/// </summary>\npublic class ValueChangedTriggerBehavior : Trigger\n{\n    static ValueChangedTriggerBehavior()\n    {\n        BindingProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<object?>>(OnValueChanged));\n    }\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"Binding\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<object?> BindingProperty =\n        AvaloniaProperty.Register<ValueChangedTriggerBehavior, object?>(nameof(Binding));\n\n    /// <summary>\n    /// Gets or sets the bound object that the <see cref=\"ValueChangedTriggerBehavior\"/> will listen to. This is a avalonia property.\n    /// </summary>\n    public object? Binding\n    {\n        get => GetValue(BindingProperty);\n        set => SetValue(BindingProperty, value);\n    }\n\n    private static void OnValueChanged(AvaloniaPropertyChangedEventArgs args)\n    {\n        if (args.Sender is not ValueChangedTriggerBehavior behavior || behavior.AssociatedObject is null)\n        {\n            return;\n        }\n\n        var binding = behavior.Binding;\n        if (binding is not null)\n        {\n            Interaction.ExecuteActions(behavior.AssociatedObject, behavior.Actions, args);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/Avalonia.Xaml.Interactions.DragAndDrop.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <OutputType>Library</OutputType>\n    <DocumentationFile>bin\\$(Configuration)\\$(TargetFramework)\\$(AssemblyName).xml</DocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Interactions.DragAndDrop</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/ContextDragBehavior.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.LogicalTree;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.DragAndDrop;\n\n/// <summary>\n/// \n/// </summary>\npublic class ContextDragBehavior : Behavior<Control>\n{\n    private Point _dragStartPoint;\n    private PointerEventArgs? _triggerEvent;\n    private bool _lock;\n    private bool _captured;\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<object?> ContextProperty =\n        AvaloniaProperty.Register<ContextDragBehavior, object?>(nameof(Context));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<IDragHandler?> HandlerProperty =\n        AvaloniaProperty.Register<ContextDragBehavior, IDragHandler?>(nameof(Handler));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<double> HorizontalDragThresholdProperty = \n        AvaloniaProperty.Register<ContextDragBehavior, double>(nameof(HorizontalDragThreshold), 3);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<double> VerticalDragThresholdProperty =\n        AvaloniaProperty.Register<ContextDragBehavior, double>(nameof(VerticalDragThreshold), 3);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public object? Context\n    {\n        get => GetValue(ContextProperty);\n        set => SetValue(ContextProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public IDragHandler? Handler\n    {\n        get => GetValue(HandlerProperty);\n        set => SetValue(HandlerProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public double HorizontalDragThreshold\n    {\n        get => GetValue(HorizontalDragThresholdProperty);\n        set => SetValue(HorizontalDragThresholdProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public double VerticalDragThreshold\n    {\n        get => GetValue(VerticalDragThresholdProperty);\n        set => SetValue(VerticalDragThresholdProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerPressedEvent, AssociatedObject_PointerPressed, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerReleasedEvent, AssociatedObject_PointerReleased, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerMovedEvent, AssociatedObject_PointerMoved, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerCaptureLostEvent, AssociatedObject_CaptureLost, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerPressedEvent, AssociatedObject_PointerPressed);\n        AssociatedObject?.RemoveHandler(InputElement.PointerReleasedEvent, AssociatedObject_PointerReleased);\n        AssociatedObject?.RemoveHandler(InputElement.PointerMovedEvent, AssociatedObject_PointerMoved);\n        AssociatedObject?.RemoveHandler(InputElement.PointerCaptureLostEvent, AssociatedObject_CaptureLost);\n    }\n\n    private async Task DoDragDrop(PointerEventArgs triggerEvent, object? value)\n    {\n        var data = new DataObject();\n        data.Set(ContextDropBehavior.DataFormat, value!);\n\n        var effect = DragDropEffects.None;\n\n        if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Alt))\n        {\n            effect |= DragDropEffects.Link;\n        }\n        else if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Shift))\n        {\n            effect |= DragDropEffects.Move;\n        }\n        else if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Control))\n        {\n            effect |= DragDropEffects.Copy;\n        }\n        else\n        {\n            effect |= DragDropEffects.Move;\n        }\n\n        await DragDrop.DoDragDrop(triggerEvent, data, effect);\n    }\n\n    private void Released()\n    {\n        _triggerEvent = null;\n        _lock = false;\n    }\n\n    private void AssociatedObject_PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.IsLeftButtonPressed)\n        {\n            if (e.Source is Control control\n                && AssociatedObject?.DataContext == control.DataContext)\n            {\n                if ((control as ISelectable ?? control.Parent as ISelectable ?? control.FindLogicalAncestorOfType<ISelectable>())?.IsSelected ?? false) e.Handled = true; //avoid deselection on drag\n                _dragStartPoint = e.GetPosition(null);\n                _triggerEvent = e;\n                _lock = true;\n                _captured = true;\n            }\n        }\n    }\n\n    private void AssociatedObject_PointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n        if (_captured)\n        {\n            if (e.InitialPressMouseButton == MouseButton.Left && _triggerEvent is not null)\n            {\n                Released();\n            }\n\n            _captured = false;\n        }\n    }\n\n    private async void AssociatedObject_PointerMoved(object? sender, PointerEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (_captured\n            && properties.IsLeftButtonPressed &&\n            _triggerEvent is not null)\n        {\n            var point = e.GetPosition(null);\n            var diff = _dragStartPoint - point;\n            var horizontalDragThreshold = HorizontalDragThreshold;\n            var verticalDragThreshold = VerticalDragThreshold;\n\n            if (Math.Abs(diff.X) > horizontalDragThreshold || Math.Abs(diff.Y) > verticalDragThreshold)\n            {\n                if (_lock)\n                {\n                    _lock = false;\n                }\n                else\n                {\n                    return;\n                }\n\n                var context = Context ?? AssociatedObject?.DataContext;\n                    \n                Handler?.BeforeDragDrop(sender, _triggerEvent, context);\n\n                await DoDragDrop(_triggerEvent, context);\n\n                Handler?.AfterDragDrop(sender, _triggerEvent, context);\n\n                _triggerEvent = null;\n            }\n        }\n    }\n\n    private void AssociatedObject_CaptureLost(object? sender, PointerCaptureLostEventArgs e)\n    {\n        Released();\n        _captured = false;\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/ContextDropBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.DragAndDrop;\n\n/// <summary>\n/// \n/// </summary>\npublic class ContextDropBehavior : Behavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static string DataFormat = nameof(Context);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<object?> ContextProperty =\n        AvaloniaProperty.Register<ContextDropBehavior, object?>(nameof(Context));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<IDropHandler?> HandlerProperty =\n        AvaloniaProperty.Register<ContextDropBehavior, IDropHandler?>(nameof(Handler));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public object? Context\n    {\n        get => GetValue(ContextProperty);\n        set => SetValue(ContextProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public IDropHandler? Handler\n    {\n        get => GetValue(HandlerProperty);\n        set => SetValue(HandlerProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            DragDrop.SetAllowDrop(AssociatedObject, true);\n        }\n        AssociatedObject?.AddHandler(DragDrop.DragEnterEvent, DragEnter);\n        AssociatedObject?.AddHandler(DragDrop.DragLeaveEvent, DragLeave);\n        AssociatedObject?.AddHandler(DragDrop.DragOverEvent, DragOver);\n        AssociatedObject?.AddHandler(DragDrop.DropEvent, Drop);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            DragDrop.SetAllowDrop(AssociatedObject, false);\n        }\n        AssociatedObject?.RemoveHandler(DragDrop.DragEnterEvent, DragEnter);\n        AssociatedObject?.RemoveHandler(DragDrop.DragLeaveEvent, DragLeave);\n        AssociatedObject?.RemoveHandler(DragDrop.DragOverEvent, DragOver);\n        AssociatedObject?.RemoveHandler(DragDrop.DropEvent, Drop);\n    }\n\n    private void DragEnter(object? sender, DragEventArgs e)\n    {\n        var sourceContext = e.Data.Get(ContextDropBehavior.DataFormat);\n        var targetContext = Context ?? AssociatedObject?.DataContext;\n        Handler?.Enter(sender, e, sourceContext, targetContext);\n    }\n\n    private void DragLeave(object? sender, RoutedEventArgs e)\n    {\n        Handler?.Leave(sender, e);\n    }\n\n    private void DragOver(object? sender, DragEventArgs e)\n    {\n        var sourceContext = e.Data.Get(ContextDropBehavior.DataFormat);\n        var targetContext = Context ?? AssociatedObject?.DataContext;\n        Handler?.Over(sender, e, sourceContext, targetContext);\n    }\n\n    private void Drop(object? sender, DragEventArgs e)\n    {\n        var sourceContext = e.Data.Get(ContextDropBehavior.DataFormat);\n        var targetContext = Context ?? AssociatedObject?.DataContext;\n        Handler?.Drop(sender, e, sourceContext, targetContext);\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/DropHandlerBase.cs",
    "content": "﻿using System.Collections.Generic;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.DragAndDrop;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class DropHandlerBase : IDropHandler\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"items\"></param>\n    /// <param name=\"sourceIndex\"></param>\n    /// <param name=\"targetIndex\"></param>\n    /// <typeparam name=\"T\"></typeparam>\n    protected void MoveItem<T>(IList<T> items, int sourceIndex, int targetIndex)\n    {\n        if (sourceIndex < targetIndex)\n        {\n            var item = items[sourceIndex];\n            items.RemoveAt(sourceIndex);\n            items.Insert(targetIndex, item);\n        }\n        else\n        {\n            var removeIndex = sourceIndex + 1;\n            if (items.Count + 1 > removeIndex)\n            {\n                var item = items[sourceIndex];\n                items.RemoveAt(removeIndex - 1);\n                items.Insert(targetIndex, item);\n            }\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sourceItems\"></param>\n    /// <param name=\"targetItems\"></param>\n    /// <param name=\"sourceIndex\"></param>\n    /// <param name=\"targetIndex\"></param>\n    /// <typeparam name=\"T\"></typeparam>\n    protected void MoveItem<T>(IList<T> sourceItems, IList<T> targetItems, int sourceIndex, int targetIndex)\n    {\n        var item = sourceItems[sourceIndex];\n        sourceItems.RemoveAt(sourceIndex);\n        targetItems.Insert(targetIndex, item);\n    }\n        \n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"items\"></param>\n    /// <param name=\"sourceIndex\"></param>\n    /// <param name=\"targetIndex\"></param>\n    /// <typeparam name=\"T\"></typeparam>\n    protected void SwapItem<T>(IList<T> items, int sourceIndex, int targetIndex)\n    {\n        var item1 = items[sourceIndex];\n        var item2 = items[targetIndex];\n        items[targetIndex] = item1;\n        items[sourceIndex] = item2;\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sourceItems\"></param>\n    /// <param name=\"targetItems\"></param>\n    /// <param name=\"sourceIndex\"></param>\n    /// <param name=\"targetIndex\"></param>\n    /// <typeparam name=\"T\"></typeparam>\n    protected void SwapItem<T>(IList<T> sourceItems, IList<T> targetItems, int sourceIndex, int targetIndex)\n    {\n        var item1 = sourceItems[sourceIndex];\n        var item2 = targetItems[targetIndex];\n        targetItems[targetIndex] = item1;\n        sourceItems[sourceIndex] = item2;\n    }\n        \n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"items\"></param>\n    /// <param name=\"item\"></param>\n    /// <param name=\"index\"></param>\n    /// <typeparam name=\"T\"></typeparam>\n    protected void InsertItem<T>(IList<T> items, T item, int index)\n    {\n        items.Insert(index, item);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    public virtual void Enter(object? sender, DragEventArgs e, object? sourceContext, object? targetContext)\n    {\n        if (Validate(sender, e, sourceContext, targetContext, null) == false)\n        {\n            e.DragEffects = DragDropEffects.None;\n            e.Handled = true;\n        }\n        else\n        {\n            e.DragEffects |= DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link;\n            e.Handled = true;\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    public virtual void Over(object? sender, DragEventArgs e, object? sourceContext, object? targetContext)\n    {\n        if (Validate(sender, e, sourceContext, targetContext, null) == false)\n        {\n            e.DragEffects = DragDropEffects.None;\n            e.Handled = true;\n        }\n        else\n        {\n            e.DragEffects |= DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link;\n            e.Handled = true;\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    public virtual void Drop(object? sender, DragEventArgs e, object? sourceContext, object? targetContext)\n    {\n        if (Execute(sender, e, sourceContext, targetContext, null) == false)\n        {\n            e.DragEffects = DragDropEffects.None;\n            e.Handled = true;\n        }\n        else\n        {\n            e.DragEffects |= DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link;\n            e.Handled = true;\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    public virtual void Leave(object? sender, RoutedEventArgs e)\n    {\n        Cancel(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    /// <param name=\"state\"></param>\n    /// <returns></returns>\n    public virtual bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        return false;\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    /// <param name=\"state\"></param>\n    /// <returns></returns>\n    public virtual bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state)\n    {\n        return false;\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    public virtual void Cancel(object? sender, RoutedEventArgs e)\n    {\n    }\n}"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/IDragHandler.cs",
    "content": "﻿using Avalonia.Input;\n\nnamespace Avalonia.Xaml.Interactions.DragAndDrop;\n\n/// <summary>\n/// \n/// </summary>\npublic interface IDragHandler\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"context\"></param>\n    void BeforeDragDrop(object? sender, PointerEventArgs e, object? context);\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"context\"></param>\n    void AfterDragDrop(object? sender, PointerEventArgs e, object? context);\n}"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/IDropHandler.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.DragAndDrop;\n\n/// <summary>\n/// \n/// </summary>\npublic interface IDropHandler\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    void Enter(object? sender, DragEventArgs e, object? sourceContext, object? targetContext);\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    void Over(object? sender, DragEventArgs e, object? sourceContext, object? targetContext);\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    void Drop(object? sender, DragEventArgs e, object? sourceContext, object? targetContext);\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    void Leave(object? sender, RoutedEventArgs e);\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    /// <param name=\"state\"></param>\n    /// <returns></returns>\n    bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state);\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// <param name=\"sourceContext\"></param>\n    /// <param name=\"targetContext\"></param>\n    /// <param name=\"state\"></param>\n    /// <returns></returns>\n    bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state);\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    void Cancel(object? sender, RoutedEventArgs e);\n}"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing Avalonia.Metadata;\n\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactions.DragAndDrop\")]\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.DragAndDrop/TypedDragBehavior.cs",
    "content": "﻿using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Threading.Tasks;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.DragAndDrop;\n\n/// <summary>\n/// \n/// </summary>\npublic class TypedDragBehavior : Behavior<Control>\n{\n    private Point _dragStartPoint;\n    private PointerEventArgs? _triggerEvent;\n    private object? _value;\n    private bool _lock;\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<Type?> DataTypeProperty =\n        AvaloniaProperty.Register<TypedDragBehavior, Type?>(nameof(DataType));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<IDragHandler?> HandlerProperty =\n        AvaloniaProperty.Register<TypedDragBehavior, IDragHandler?>(nameof(Handler));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public Type? DataType\n    {\n        get => GetValue(DataTypeProperty);\n        set => SetValue(DataTypeProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public IDragHandler? Handler\n    {\n        get => GetValue(HandlerProperty);\n        set => SetValue(HandlerProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerPressedEvent, AssociatedObject_PointerPressed, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerReleasedEvent, AssociatedObject_PointerReleased, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n        AssociatedObject?.AddHandler(InputElement.PointerMovedEvent, AssociatedObject_PointerMoved, RoutingStrategies.Direct | RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerPressedEvent, AssociatedObject_PointerPressed);\n        AssociatedObject?.RemoveHandler(InputElement.PointerReleasedEvent, AssociatedObject_PointerReleased);\n        AssociatedObject?.RemoveHandler(InputElement.PointerMovedEvent, AssociatedObject_PointerMoved);\n    }\n\n    private async Task DoDragDrop(PointerEventArgs triggerEvent, object? value)\n    {\n        var data = new DataObject();\n        data.Set(ContextDropBehavior.DataFormat, value!);\n\n        var effect = DragDropEffects.None;\n\n        if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Alt))\n        {\n            effect |= DragDropEffects.Link;\n        }\n        else if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Shift))\n        {\n            effect |= DragDropEffects.Move;\n        }\n        else if (triggerEvent.KeyModifiers.HasFlag(KeyModifiers.Control))\n        {\n            effect |= DragDropEffects.Copy;\n        }\n        else\n        {\n            effect |= DragDropEffects.Move;\n        }\n\n        await DragDrop.DoDragDrop(triggerEvent, data, effect);\n    }\n\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    private void AssociatedObject_PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.IsLeftButtonPressed)\n        {\n            if (e.Source is Control control \n                && AssociatedObject?.DataContext == control.DataContext\n                && DataType is not null\n                && DataType.IsAssignableFrom(control.DataContext?.GetType()))\n            {\n                _dragStartPoint = e.GetPosition(null);\n                _triggerEvent = e;\n                _value = control.DataContext;\n                _lock = true;\n            }\n        }\n    }\n\n    private void AssociatedObject_PointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.PointerUpdateKind == PointerUpdateKind.LeftButtonReleased && _triggerEvent is not null)\n        {\n            _triggerEvent = null;\n            _value = null;\n            _lock = false;\n        }\n    }\n\n    private async void AssociatedObject_PointerMoved(object? sender, PointerEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.IsLeftButtonPressed && _triggerEvent is not null)\n        {\n            var point = e.GetPosition(null);\n            var diff = _dragStartPoint - point;\n            if (Math.Abs(diff.X) > 3 || Math.Abs(diff.Y) > 3)\n            {\n                if (_lock)\n                {\n                    _lock = false;\n                }\n                else\n                {\n                    return;\n                }\n\n                Handler?.BeforeDragDrop(sender, _triggerEvent, _value);\n\n                await DoDragDrop(_triggerEvent, _value);\n\n                Handler?.AfterDragDrop(sender, _triggerEvent, _value);\n\n                _triggerEvent = null;\n                _value = null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Draggable/Avalonia.Xaml.Interactions.Draggable.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <OutputType>Library</OutputType>\n    <DocumentationFile>bin\\$(Configuration)\\$(TargetFramework)\\$(AssemblyName).xml</DocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Interactions.Draggable</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Draggable/CanvasDragBehavior.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Draggable;\n\n/// <summary>\n/// \n/// </summary>\npublic class CanvasDragBehavior : Behavior<Control>\n{\n    private bool _enableDrag;\n    private Point _start;\n    private Control? _parent;\n    private Control? _draggedContainer;\n    private Control? _adorner;\n    private bool _captured;\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.AddHandler(InputElement.PointerReleasedEvent, Released, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerPressedEvent, Pressed, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerMovedEvent, Moved, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerCaptureLostEvent, CaptureLost, RoutingStrategies.Tunnel);\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.RemoveHandler(InputElement.PointerReleasedEvent, Released);\n            AssociatedObject.RemoveHandler(InputElement.PointerPressedEvent, Pressed);\n            AssociatedObject.RemoveHandler(InputElement.PointerMovedEvent, Moved);\n            AssociatedObject.RemoveHandler(InputElement.PointerCaptureLostEvent, CaptureLost);\n        }\n    }\n\n    private void AddAdorner(Control control)\n    {\n        var layer = AdornerLayer.GetAdornerLayer(control);\n        if (layer is null)\n        {\n            return;\n        }\n\n        _adorner = new SelectionAdorner()\n        {\n            [AdornerLayer.AdornedElementProperty] = control\n        };\n\n        ((ISetLogicalParent) _adorner).SetParent(control);\n        layer.Children.Add(_adorner);\n    }\n\n    private void RemoveAdorner(Control control)\n    {\n        var layer = AdornerLayer.GetAdornerLayer(control);\n        if (layer is null || _adorner is null)\n        {\n            return;\n        }\n\n        layer.Children.Remove(_adorner);\n        ((ISetLogicalParent) _adorner).SetParent(null);\n        _adorner = null;\n    }\n\n    private void Pressed(object? sender, PointerPressedEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.IsLeftButtonPressed \n            && AssociatedObject?.Parent is Control parent)\n        {\n            _enableDrag = true;\n            _start = e.GetPosition(parent);\n            _parent = parent;\n            _draggedContainer = AssociatedObject;\n\n            SetDraggingPseudoClasses(_draggedContainer, true);\n\n            // AddAdorner(_draggedContainer);\n\n            _captured = true;\n        }\n    }\n\n    private void Released(object? sender, PointerReleasedEventArgs e)\n    {\n        if (_captured)\n        {\n            if (e.InitialPressMouseButton == MouseButton.Left)\n            {\n                Released();\n            }\n\n            _captured = false;\n        }\n    }\n\n    private void CaptureLost(object? sender, PointerCaptureLostEventArgs e)\n    {\n        Released();\n        _captured = false;\n    }\n\n    private void Moved(object? sender, PointerEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (_captured\n            && properties.IsLeftButtonPressed)\n        {\n            if (_parent is null || _draggedContainer is null || !_enableDrag)\n            {\n                return;\n            }\n\n            var position = e.GetPosition(_parent);\n            var deltaX = position.X - _start.X;\n            var deltaY = position.Y - _start.Y;\n            _start = position;\n            var left = Canvas.GetLeft(_draggedContainer);\n            var top = Canvas.GetTop(_draggedContainer);\n            Canvas.SetLeft(_draggedContainer, left + deltaX);\n            Canvas.SetTop(_draggedContainer, top + deltaY);\n        }\n    }\n\n    private void Released()\n    {\n        if (_enableDrag)\n        {\n            if (_parent is not null && _draggedContainer is not null)\n            {\n                // RemoveAdorner(_draggedContainer);\n            }\n\n            if (_draggedContainer is not null)\n            {\n                SetDraggingPseudoClasses(_draggedContainer, false);\n            }\n\n            _enableDrag = false;\n            _parent = null;\n            _draggedContainer = null;\n        }\n    }\n\n    private void SetDraggingPseudoClasses(Control control, bool isDragging)\n    {\n        if (isDragging)\n        {\n            ((IPseudoClasses)control.Classes).Add(\":dragging\");\n        }\n        else\n        {\n            ((IPseudoClasses)control.Classes).Remove(\":dragging\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Draggable/GridDragBehavior.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Draggable;\n\n/// <summary>\n/// \n/// </summary>\npublic class GridDragBehavior : Behavior<Control>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> CopyColumnProperty = \n        AvaloniaProperty.Register<GridDragBehavior, bool>(nameof(CopyColumn), true);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> CopyRowProperty = \n        AvaloniaProperty.Register<GridDragBehavior, bool>(nameof(CopyRow), true);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> CopyColumnSpanProperty =\n        AvaloniaProperty.Register<GridDragBehavior, bool>(nameof(CopyColumnSpan));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<bool> CopyRowSpanProperty = \n        AvaloniaProperty.Register<GridDragBehavior, bool>(nameof(CopyRowSpan));\n\n    private bool _enableDrag;\n    private Control? _parent;\n    private Control? _draggedContainer;\n    private Control? _adorner;\n    private bool _captured;\n        \n    /// <summary>\n    /// \n    /// </summary>\n    public bool CopyColumn\n    {\n        get => GetValue(CopyColumnProperty);\n        set => SetValue(CopyColumnProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool CopyRow\n    {\n        get => GetValue(CopyRowProperty);\n        set => SetValue(CopyRowProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool CopyColumnSpan\n    {\n        get => GetValue(CopyColumnSpanProperty);\n        set => SetValue(CopyColumnSpanProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public bool CopyRowSpan\n    {\n        get => GetValue(CopyRowSpanProperty);\n        set => SetValue(CopyRowSpanProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.AddHandler(InputElement.PointerReleasedEvent, Released, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerPressedEvent, Pressed, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerMovedEvent, Moved, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerCaptureLostEvent, CaptureLost, RoutingStrategies.Tunnel);\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.RemoveHandler(InputElement.PointerReleasedEvent, Released);\n            AssociatedObject.RemoveHandler(InputElement.PointerPressedEvent, Pressed);\n            AssociatedObject.RemoveHandler(InputElement.PointerMovedEvent, Moved);\n            AssociatedObject.RemoveHandler(InputElement.PointerCaptureLostEvent, CaptureLost);\n        }\n    }\n\n    private void AddAdorner(Control control)\n    {\n        var layer = AdornerLayer.GetAdornerLayer(control);\n        if (layer is null)\n        {\n            return;\n        }\n\n        _adorner = new SelectionAdorner()\n        {\n            [AdornerLayer.AdornedElementProperty] = control\n        };\n\n        ((ISetLogicalParent) _adorner).SetParent(control);\n        layer.Children.Add(_adorner);\n    }\n\n    private void RemoveAdorner(Control control)\n    {\n        var layer = AdornerLayer.GetAdornerLayer(control);\n        if (layer is null || _adorner is null)\n        {\n            return;\n        }\n\n        layer.Children.Remove(_adorner);\n        ((ISetLogicalParent) _adorner).SetParent(null);\n        _adorner = null;\n    }\n\n    private void Pressed(object? sender, PointerPressedEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.IsLeftButtonPressed\n            && AssociatedObject?.Parent is Control parent)\n        {\n\n            _enableDrag = true;\n            _parent = parent;\n            _draggedContainer = AssociatedObject;\n\n            SetDraggingPseudoClasses(_draggedContainer, true);\n\n            // AddAdorner(_draggedContainer);\n\n            _captured = true;\n        }\n    }\n\n    private void Released(object? sender, PointerReleasedEventArgs e)\n    {\n        if (_captured)\n        {\n            if (e.InitialPressMouseButton == MouseButton.Left)\n            {\n                Released();\n            }\n\n            _captured = false;\n        }\n    }\n\n    private void CaptureLost(object? sender, PointerCaptureLostEventArgs e)\n    {\n        Released();\n        _captured = false;\n    }\n\n    private void Moved(object? sender, PointerEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (_captured\n            && properties.IsLeftButtonPressed)\n        {\n            if (_parent is null || _draggedContainer is null || !_enableDrag)\n            {\n                return;\n            }\n\n            var position = e.GetPosition(_parent);\n\n            Control? target = null;\n\n\n            if (_parent is Grid grid)\n            {\n                foreach (var child in grid.Children)\n                {\n                    if (Equals(child, _draggedContainer))\n                    {\n                        continue;\n                    }\n\n                    if (child.Bounds.Contains(position) && child is Control control)\n                    {\n                        target = control;\n                    }\n                }\n            }\n            else if (_parent is ItemsControl itemsControl)\n            {\n                foreach (var control in itemsControl.GetRealizedContainers())\n                {\n                    if (control is  null)\n                    {\n                        continue;\n                    }\n\n                    if (Equals(control, _draggedContainer))\n                    {\n                        continue;\n                    }\n\n                    if (control.Bounds.Contains(position))\n                    {\n                        target = control;\n                    }\n                }\n            }\n            else\n            {\n                return;\n            }\n\n            if (target is null)\n            {\n                return;\n            }\n\n            var copyColumn = CopyColumn;\n            var copyRow = CopyRow;\n            var copyColumnSpan = CopyColumnSpan;\n            var copyRowSpan = CopyRowSpan;\n\n            var sourceColumn = Grid.GetColumn(_draggedContainer);\n            var sourceRow = Grid.GetRow(_draggedContainer);\n            var sourceColumnSpan = Grid.GetColumnSpan(_draggedContainer);\n            var sourceRowSpan = Grid.GetRowSpan(_draggedContainer);\n\n            var targetColumn = Grid.GetColumn(target);\n            var targetRow = Grid.GetRow(target);\n            var targetColumnSpan = Grid.GetColumnSpan(target);\n            var targetRowSpan = Grid.GetRowSpan(target);\n\n            if (copyColumn)\n            {\n                Grid.SetColumn(_draggedContainer, targetColumn);\n            }\n\n            if (copyRow)\n            {\n                Grid.SetRow(_draggedContainer, targetRow);\n            }\n\n            if (copyColumnSpan)\n            {\n                Grid.SetColumnSpan(_draggedContainer, targetColumnSpan);\n            }\n\n            if (copyRowSpan)\n            {\n                Grid.SetRowSpan(_draggedContainer, targetRowSpan);\n            }\n\n            if (copyColumn)\n            {\n                Grid.SetColumn(target, sourceColumn);\n            }\n\n            if (copyRow)\n            {\n                Grid.SetRow(target, sourceRow);\n            }\n\n            if (copyColumnSpan)\n            {\n                Grid.SetColumnSpan(target, sourceColumnSpan);\n            }\n\n            if (copyRowSpan)\n            {\n                Grid.SetRowSpan(target, sourceRowSpan);\n            }\n        }\n    }\n\n    private void Released()\n    {\n        if (_enableDrag)\n        {\n            if (_parent is not null && _draggedContainer is not null)\n            {\n                // RemoveAdorner(_draggedContainer);\n            }\n\n            if (_draggedContainer is not null)\n            {\n                SetDraggingPseudoClasses(_draggedContainer, false);\n            }\n\n            _enableDrag = false;\n            _parent = null;\n            _draggedContainer = null;\n        }\n    }\n\n    private void SetDraggingPseudoClasses(Control control, bool isDragging)\n    {\n        if (isDragging)\n        {\n            ((IPseudoClasses)control.Classes).Add(\":dragging\");\n        }\n        else\n        {\n            ((IPseudoClasses)control.Classes).Remove(\":dragging\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Draggable/ItemDragBehavior.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Layout;\nusing Avalonia.Media.Transformation;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Draggable;\n\n/// <summary>\n/// \n/// </summary>\npublic class ItemDragBehavior : Behavior<Control>\n{\n    private bool _enableDrag;\n    private bool _dragStarted;\n    private Point _start;\n    private int _draggedIndex;\n    private int _targetIndex;\n    private ItemsControl? _itemsControl;\n    private Control? _draggedContainer;\n    private bool _captured;\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<Orientation> OrientationProperty = \n        AvaloniaProperty.Register<ItemDragBehavior, Orientation>(nameof(Orientation));\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<double> HorizontalDragThresholdProperty = \n        AvaloniaProperty.Register<ItemDragBehavior, double>(nameof(HorizontalDragThreshold), 3);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<double> VerticalDragThresholdProperty =\n        AvaloniaProperty.Register<ItemDragBehavior, double>(nameof(VerticalDragThreshold), 3);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public Orientation Orientation\n    {\n        get => GetValue(OrientationProperty);\n        set => SetValue(OrientationProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public double HorizontalDragThreshold\n    {\n        get => GetValue(HorizontalDragThresholdProperty);\n        set => SetValue(HorizontalDragThresholdProperty, value);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public double VerticalDragThreshold\n    {\n        get => GetValue(VerticalDragThresholdProperty);\n        set => SetValue(VerticalDragThresholdProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.AddHandler(InputElement.PointerReleasedEvent, PointerReleased, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerPressedEvent, PointerPressed, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerMovedEvent, PointerMoved, RoutingStrategies.Tunnel);\n            AssociatedObject.AddHandler(InputElement.PointerCaptureLostEvent, PointerCaptureLost, RoutingStrategies.Tunnel);\n        }\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.RemoveHandler(InputElement.PointerReleasedEvent, PointerReleased);\n            AssociatedObject.RemoveHandler(InputElement.PointerPressedEvent, PointerPressed);\n            AssociatedObject.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved);\n            AssociatedObject.RemoveHandler(InputElement.PointerCaptureLostEvent, PointerCaptureLost);\n        }\n    }\n\n    private void PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (properties.IsLeftButtonPressed \n            && AssociatedObject?.Parent is ItemsControl itemsControl)\n        {\n            _enableDrag = true;\n            _dragStarted = false;\n            _start = e.GetPosition(itemsControl);\n            _draggedIndex = -1;\n            _targetIndex = -1;\n            _itemsControl = itemsControl;\n            _draggedContainer = AssociatedObject;\n\n            if (_draggedContainer is not null)\n            {\n                SetDraggingPseudoClasses(_draggedContainer, true);\n            }\n\n            AddTransforms(_itemsControl);\n\n            _captured = true;\n        }\n    }\n\n    private void PointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n        if (_captured)\n        {\n            if (e.InitialPressMouseButton == MouseButton.Left)\n            {\n                Released();\n            }\n\n            _captured = false;\n        }\n    }\n\n    private void PointerCaptureLost(object? sender, PointerCaptureLostEventArgs e)\n    {\n        Released();\n        _captured = false;\n    }\n\n    private void Released()\n    {\n        if (!_enableDrag)\n        {\n            return;\n        }\n\n        RemoveTransforms(_itemsControl);\n\n        if (_itemsControl is not null)\n        {\n            foreach (var control in _itemsControl.GetRealizedContainers())\n            {\n                SetDraggingPseudoClasses(control, true);\n            }\n        }\n\n        if (_dragStarted)\n        {\n            if (_draggedIndex >= 0 && _targetIndex >= 0 && _draggedIndex != _targetIndex)\n            {\n                MoveDraggedItem(_itemsControl, _draggedIndex, _targetIndex);\n            }\n        }\n\n        if (_itemsControl is not null)\n        {\n            foreach (var control in _itemsControl.GetRealizedContainers())\n            {\n                SetDraggingPseudoClasses(control, false);\n            }\n        }\n\n        if (_draggedContainer is not null)\n        {\n            SetDraggingPseudoClasses(_draggedContainer, false);\n        }\n\n        _draggedIndex = -1;\n        _targetIndex = -1;\n        _enableDrag = false;\n        _dragStarted = false;\n        _itemsControl = null;\n\n        _draggedContainer = null;\n    }\n\n    private void AddTransforms(ItemsControl? itemsControl)\n    {\n        if (itemsControl?.Items is null)\n        {\n            return;\n        }\n\n        var i = 0;\n\n        foreach (var _ in itemsControl.Items)\n        {\n            var container = itemsControl.ContainerFromIndex(i);\n            if (container is not null)\n            {\n                SetTranslateTransform(container, 0, 0);\n            }\n  \n            i++;\n        }  \n    }\n\n    private void RemoveTransforms(ItemsControl? itemsControl)\n    {\n        if (itemsControl?.Items is null)\n        {\n            return;\n        }\n\n        var i = 0;\n\n        foreach (var _ in itemsControl.Items)\n        {\n            var container = itemsControl.ContainerFromIndex(i);\n            if (container is not null)\n            {\n                SetTranslateTransform(container, 0, 0);\n            }\n  \n            i++;\n        }  \n    }\n\n    private void MoveDraggedItem(ItemsControl? itemsControl, int draggedIndex, int targetIndex)\n    {\n        if (itemsControl?.ItemsSource is IList itemsSource)\n        {\n            var draggedItem = itemsSource[draggedIndex];\n            itemsSource.RemoveAt(draggedIndex);\n            itemsSource.Insert(targetIndex, draggedItem);\n\n            if (itemsControl is SelectingItemsControl selectingItemsControl)\n            {\n                selectingItemsControl.SelectedIndex = targetIndex;\n            }\n        }\n        else\n        {\n            if (itemsControl?.Items is {IsReadOnly: false} itemCollection)\n            {\n                var draggedItem = itemCollection[draggedIndex];\n                itemCollection.RemoveAt(draggedIndex);\n                itemCollection.Insert(targetIndex, draggedItem);\n\n                if (itemsControl is SelectingItemsControl selectingItemsControl)\n                {\n                    selectingItemsControl.SelectedIndex = targetIndex;\n                } \n            }\n        }\n    }\n\n    private void PointerMoved(object? sender, PointerEventArgs e)\n    {\n        var properties = e.GetCurrentPoint(AssociatedObject).Properties;\n        if (_captured\n            && properties.IsLeftButtonPressed)\n        {\n            if (_itemsControl?.Items is null || _draggedContainer?.RenderTransform is null || !_enableDrag)\n            {\n                return;\n            }\n\n            var orientation = Orientation;\n            var position = e.GetPosition(_itemsControl);\n            var delta = orientation == Orientation.Horizontal ? position.X - _start.X : position.Y - _start.Y;\n\n            if (!_dragStarted)\n            {\n                var diff = _start - position;\n                var horizontalDragThreshold = HorizontalDragThreshold;\n                var verticalDragThreshold = VerticalDragThreshold;\n\n                if (orientation == Orientation.Horizontal)\n                {\n                    if (Math.Abs(diff.X) > horizontalDragThreshold)\n                    {\n                        _dragStarted = true;\n                    }\n                    else\n                    {\n                        return;\n                    }\n                }\n                else\n                {\n                    if (Math.Abs(diff.Y) > verticalDragThreshold)\n                    {\n                        _dragStarted = true;\n                    }\n                    else\n                    {\n                        return;\n                    }\n                }\n            }\n\n            if (orientation == Orientation.Horizontal)\n            {\n                SetTranslateTransform(_draggedContainer, delta, 0);\n            }\n            else\n            {\n                SetTranslateTransform(_draggedContainer, 0, delta);\n            }\n\n            _draggedIndex = _itemsControl.IndexFromContainer(_draggedContainer);\n            _targetIndex = -1;\n\n            var draggedBounds = _draggedContainer.Bounds;\n\n            var draggedStart = orientation == Orientation.Horizontal ? draggedBounds.X : draggedBounds.Y;\n\n            var draggedDeltaStart = orientation == Orientation.Horizontal\n                ? draggedBounds.X + delta\n                : draggedBounds.Y + delta;\n\n            var draggedDeltaEnd = orientation == Orientation.Horizontal\n                ? draggedBounds.X + delta + draggedBounds.Width\n                : draggedBounds.Y + delta + draggedBounds.Height;\n\n            var i = 0;\n\n            foreach (var _ in _itemsControl.Items)\n            {\n                var targetContainer = _itemsControl.ContainerFromIndex(i);\n                if (targetContainer?.RenderTransform is null || ReferenceEquals(targetContainer, _draggedContainer))\n                {\n                    i++;\n                    continue;\n                }\n\n                var targetBounds = targetContainer.Bounds;\n\n                var targetStart = orientation == Orientation.Horizontal ? targetBounds.X : targetBounds.Y;\n\n                var targetMid = orientation == Orientation.Horizontal\n                    ? targetBounds.X + targetBounds.Width / 2\n                    : targetBounds.Y + targetBounds.Height / 2;\n\n                var targetIndex = _itemsControl.IndexFromContainer(targetContainer);\n\n                if (targetStart > draggedStart && draggedDeltaEnd >= targetMid)\n                {\n                    if (orientation == Orientation.Horizontal)\n                    {\n                        SetTranslateTransform(targetContainer, -draggedBounds.Width, 0);\n                    }\n                    else\n                    {\n                        SetTranslateTransform(targetContainer, 0, -draggedBounds.Height);\n                    }\n\n                    _targetIndex = _targetIndex == -1 ? targetIndex :\n                        targetIndex > _targetIndex ? targetIndex : _targetIndex;\n                }\n                else if (targetStart < draggedStart && draggedDeltaStart <= targetMid)\n                {\n                    if (orientation == Orientation.Horizontal)\n                    {\n                        SetTranslateTransform(targetContainer, draggedBounds.Width, 0);\n                    }\n                    else\n                    {\n                        SetTranslateTransform(targetContainer, 0, draggedBounds.Height);\n                    }\n\n                    _targetIndex = _targetIndex == -1 ? targetIndex :\n                        targetIndex < _targetIndex ? targetIndex : _targetIndex;\n                }\n                else\n                {\n                    if (orientation == Orientation.Horizontal)\n                    {\n                        SetTranslateTransform(targetContainer, 0, 0);\n                    }\n                    else\n                    {\n                        SetTranslateTransform(targetContainer, 0, 0);\n                    }\n                }\n\n                i++;\n            }\n        }\n    }\n\n    private void SetDraggingPseudoClasses(Control control, bool isDragging)\n    {\n        if (isDragging)\n        {\n            ((IPseudoClasses)control.Classes).Add(\":dragging\");\n        }\n        else\n        {\n            ((IPseudoClasses)control.Classes).Remove(\":dragging\");\n        }\n    }\n\n    private void SetTranslateTransform(Control control, double x, double y)\n    {\n        var transformBuilder = new TransformOperations.Builder(1);\n        transformBuilder.AppendTranslate(x, y);\n        control.RenderTransform = transformBuilder.Build();\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Draggable/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing Avalonia.Metadata;\n\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactions.Draggable\")]\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Draggable/SelectionAdorner.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Media;\n\nnamespace Avalonia.Xaml.Interactions.Draggable;\n\n/// <summary>\n/// \n/// </summary>\npublic class SelectionAdorner : Control\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"context\"></param>\n    public override void Render(DrawingContext context)\n    {\n        var adornedElement = GetValue(AdornerLayer.AdornedElementProperty);\n        if (adornedElement is null)\n        {\n            return;\n        }\n \n        var bounds = adornedElement.Bounds;\n        var brush = new SolidColorBrush(Colors.White) { Opacity = 0.5 };\n        var pen = new Pen(new SolidColorBrush(Colors.Black), 1.5);\n        var r = 5.0;\n        var topLeft = new RectangleGeometry(new Rect(-r, -r, r + r, r + r));\n        var topRight = new RectangleGeometry(new Rect(-r, bounds.Height - r, r + r, r + r));\n        var bottomLeft = new RectangleGeometry(new Rect(bounds.Width - r, -r, r + r, r + r));\n        var bottomRight = new RectangleGeometry(new Rect(bounds.Width - r, bounds.Height - r, r + r, r + r));\n\n        context.DrawGeometry(brush, pen, topLeft);\n        context.DrawGeometry(brush, pen, topRight);\n        context.DrawGeometry(brush, pen, bottomLeft);\n        context.DrawGeometry(brush, pen, bottomRight);\n    }\n}"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Draggable/Styles.axaml",
    "content": "<Styles xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n        xmlns:id=\"clr-namespace:Avalonia.Xaml.Interactions.Draggable;assembly=Avalonia.Xaml.Interactions.Draggable\">\n\n  <!-- TabControl Drag Styles - Non Virtualizing -->\n\n  <Style Selector=\":is(TabControl).draggable\">\n    <Setter Property=\"ItemsPanel\">\n      <ItemsPanelTemplate>\n        <StackPanel Orientation=\"Horizontal\" />\n      </ItemsPanelTemplate>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(TabControl).draggable > :is(TabItem)\">\n    <Setter Property=\"ZIndex\" Value=\"0\" />\n    <Setter Property=\"(i:Interaction.Behaviors)\">\n      <i:BehaviorCollectionTemplate>\n        <i:BehaviorCollection>\n          <id:ItemDragBehavior HorizontalDragThreshold=\"3\" VerticalDragThreshold=\"3\" />\n        </i:BehaviorCollection>\n      </i:BehaviorCollectionTemplate>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(TabControl).draggable > :is(TabItem):pressed\">\n    <Setter Property=\"ZIndex\" Value=\"1\" />\n  </Style>\n\n  <!-- TabControl Drag Styles - Virtualizing -->\n\n  <Style Selector=\":is(TabControl).draggableVirtualizing\">\n    <Setter Property=\"ItemsPanel\">\n      <ItemsPanelTemplate>\n        <VirtualizingStackPanel Orientation=\"Horizontal\" />\n      </ItemsPanelTemplate>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(TabControl).draggableVirtualizing > :is(TabItem)\">\n    <Setter Property=\"ZIndex\" Value=\"0\" />\n    <Setter Property=\"(i:Interaction.Behaviors)\">\n      <i:BehaviorCollectionTemplate>\n        <i:BehaviorCollection>\n          <id:ItemDragBehavior HorizontalDragThreshold=\"3\" VerticalDragThreshold=\"3\" />\n        </i:BehaviorCollection>\n      </i:BehaviorCollectionTemplate>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(TabControl).draggableVirtualizing > :is(TabItem):pressed\">\n    <Setter Property=\"ZIndex\" Value=\"1\" />\n  </Style>\n\n  <!-- ItemsPanel Drag Styles - Non Virtualizing -->\n\n  <Style Selector=\":is(ListBox).draggable\">\n    <Setter Property=\"ItemsPanel\">\n      <Setter.Value>\n        <ItemsPanelTemplate>\n          <StackPanel Orientation=\"Vertical\" />\n        </ItemsPanelTemplate>\n      </Setter.Value>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(ListBox).draggable > :is(ListBoxItem)\">\n    <Setter Property=\"ZIndex\" Value=\"0\" />\n    <Setter Property=\"(i:Interaction.Behaviors)\">\n      <i:BehaviorCollectionTemplate>\n        <i:BehaviorCollection>\n          <id:ItemDragBehavior HorizontalDragThreshold=\"3\" VerticalDragThreshold=\"3\" Orientation=\"Vertical\" />\n        </i:BehaviorCollection>\n      </i:BehaviorCollectionTemplate>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(ListBox).draggable > :is(ListBoxItem):pressed\">\n    <Setter Property=\"ZIndex\" Value=\"1\" />\n  </Style>\n  \n  <!-- ListBox Drag Styles - Virtualizing -->\n\n  <Style Selector=\":is(ListBox).draggableVirtualizing\">\n    <Setter Property=\"ItemsPanel\">\n      <Setter.Value>\n        <ItemsPanelTemplate>\n          <VirtualizingStackPanel Orientation=\"Vertical\" />\n        </ItemsPanelTemplate>\n      </Setter.Value>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(ListBox).draggableVirtualizing > :is(ListBoxItem)\">\n    <Setter Property=\"ZIndex\" Value=\"0\" />\n    <Setter Property=\"(i:Interaction.Behaviors)\">\n      <i:BehaviorCollectionTemplate>\n        <i:BehaviorCollection>\n          <id:ItemDragBehavior HorizontalDragThreshold=\"3\" VerticalDragThreshold=\"3\" Orientation=\"Vertical\" />\n        </i:BehaviorCollection>\n      </i:BehaviorCollectionTemplate>\n    </Setter>\n  </Style>\n\n  <Style Selector=\":is(ListBox).draggableVirtualizing > :is(ListBoxItem):pressed\">\n    <Setter Property=\"ZIndex\" Value=\"1\" />\n  </Style>\n\n  <!-- Canvas Drag Styles -->\n\n  <Style Selector=\":is(Canvas).draggable > :is(Control)\">\n    <Setter Property=\"(i:Interaction.Behaviors)\">\n      <i:BehaviorCollectionTemplate>\n        <i:BehaviorCollection>\n          <id:CanvasDragBehavior />\n        </i:BehaviorCollection>\n      </i:BehaviorCollectionTemplate>\n    </Setter>\n  </Style>\n\n  <!-- ItemsControl Canvas Drag Styles -->\n\n  <Style Selector=\":is(ItemsControl).draggable > :is(ContentPresenter)\">\n    <Setter Property=\"(i:Interaction.Behaviors)\">\n      <i:BehaviorCollectionTemplate>\n        <i:BehaviorCollection>\n          <id:CanvasDragBehavior />\n        </i:BehaviorCollection>\n      </i:BehaviorCollectionTemplate>\n    </Setter>\n  </Style>\n\n  <!-- Grid Drag Styles -->\n\n  <Style Selector=\":is(Grid).draggable > :is(Control)\">\n    <Setter Property=\"(i:Interaction.Behaviors)\">\n      <i:BehaviorCollectionTemplate>\n        <i:BehaviorCollection>\n          <id:GridDragBehavior CopyColumn=\"True\" CopyRow=\"True\" CopyColumnSpan=\"True\" CopyRowSpan=\"True\" />\n        </i:BehaviorCollection>\n      </i:BehaviorCollectionTemplate>\n    </Setter>\n  </Style>\n\n</Styles>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/Avalonia.Xaml.Interactions.Events.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <OutputType>Library</OutputType>\n    <DocumentationFile>bin\\$(Configuration)\\$(TargetFramework)\\$(AssemblyName).xml</DocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Interactions.Events</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/DoubleTappedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class DoubleTappedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<DoubleTappedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(Gestures.DoubleTappedEvent, DoubleTapped, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(Gestures.DoubleTappedEvent, DoubleTapped);\n    }\n\n    private void DoubleTapped(object? sender, RoutedEventArgs e)\n    {\n        OnDoubleTapped(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnDoubleTapped(object? sender, RoutedEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/GotFocusEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class GotFocusEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<GotFocusEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Bubble);\n\n    \n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.GotFocusEvent, GotFocus, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.GotFocusEvent, GotFocus);\n    }\n\n    private void GotFocus(object? sender, GotFocusEventArgs e)\n    {\n        OnGotFocus(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnGotFocus(object? sender, GotFocusEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/KeyDownEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class KeyDownEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<KeyDownEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.KeyDownEvent, KeyDown, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.KeyDownEvent, KeyDown);\n    }\n\n    private void KeyDown(object? sender, KeyEventArgs e)\n    {\n        OnKeyDown(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnKeyDown(object? sender, KeyEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/KeyUpEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class KeyUpEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<KeyUpEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.KeyUpEvent, KeyUp, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.KeyUpEvent, KeyUp);\n    }\n\n    private void KeyUp(object? sender, KeyEventArgs e)\n    {\n        OnKeyUp(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnKeyUp(object? sender, KeyEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/LostFocusEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class LostFocusEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<LostFocusEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.LostFocusEvent, LostFocus, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.LostFocusEvent, LostFocus);\n    }\n\n    private void LostFocus(object? sender, RoutedEventArgs e)\n    {\n        OnLostFocus(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnLostFocus(object? sender, RoutedEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerCaptureLostEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerCaptureLostEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerCaptureLostEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Direct);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerCaptureLostEvent, PointerCaptureLost, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerCaptureLostEvent, PointerCaptureLost);\n    }\n\n    private void PointerCaptureLost(object? sender, PointerCaptureLostEventArgs e)\n    {\n        OnPointerCaptureLost(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerCaptureLost(object? sender, PointerCaptureLostEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerEnteredEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerEnteredEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerEnteredEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Direct);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerEnteredEvent, PointerEnter, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerEnteredEvent, PointerEnter);\n    }\n\n    private void PointerEnter(object? sender, PointerEventArgs e)\n    {\n        OnPointerEnter(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerEnter(object? sender, PointerEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerEventsBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerEventsBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerEventsBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies), \n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.AddHandler(InputElement.PointerPressedEvent, PointerPressed, RoutingStrategies);\n            AssociatedObject.AddHandler(InputElement.PointerReleasedEvent, PointerReleased, RoutingStrategies);\n            AssociatedObject.AddHandler(InputElement.PointerMovedEvent, PointerMoved, RoutingStrategies);\n        } \n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        if (AssociatedObject is not null)\n        {\n            AssociatedObject.RemoveHandler(InputElement.PointerPressedEvent, PointerPressed);\n            AssociatedObject.RemoveHandler(InputElement.PointerReleasedEvent, PointerReleased);\n            AssociatedObject.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved);\n        }\n    }\n\n    private void PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        OnPointerPressed(sender, e);\n    }\n\n    private void PointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n        OnPointerReleased(sender, e);\n    }\n\n    private void PointerMoved(object? sender, PointerEventArgs e)\n    {\n        OnPointerMoved(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void  OnPointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerMoved(object? sender, PointerEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerExitedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerExitedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerExitedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Direct);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerExitedEvent, PointerLeave, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerExitedEvent, PointerLeave);\n    }\n\n    private void PointerLeave(object? sender, PointerEventArgs e)\n    {\n        OnPointerLeave(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerLeave(object? sender, PointerEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerMovedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerMovedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerMovedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerMovedEvent, PointerMoved, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved);\n    }\n\n    private void PointerMoved(object? sender, PointerEventArgs e)\n    {\n        OnPointerMoved(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerMoved(object? sender, PointerEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerPressedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerPressedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerPressedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerPressedEvent, PointerPressed, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerPressedEvent, PointerPressed);\n    }\n\n    private void PointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n        OnPointerPressed(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerPressed(object? sender, PointerPressedEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerReleasedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerReleasedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerReleasedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerReleasedEvent, PointerReleased, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerReleasedEvent, PointerReleased);\n    }\n\n    private void PointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n        OnPointerReleased(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerReleased(object? sender, PointerReleasedEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/PointerWheelChangedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class PointerWheelChangedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<PointerWheelChangedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.PointerWheelChangedEvent, PointerWheelChanged, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.PointerWheelChangedEvent, PointerWheelChanged);\n    }\n\n    private void PointerWheelChanged(object? sender, PointerWheelEventArgs e)\n    {\n        OnPointerWheelChanged(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnPointerWheelChanged(object? sender, PointerWheelEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing Avalonia.Metadata;\n\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactions.Events\")]\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/RightTappedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class RightTappedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<RightTappedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(Gestures.RightTappedEvent, RightTapped, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(Gestures.RightTappedEvent, RightTapped);\n    }\n\n    private void RightTapped(object? sender, RoutedEventArgs e)\n    {\n        OnRightTapped(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnRightTapped(object? sender, RoutedEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/ScrollGestureEndedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class ScrollGestureEndedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<ScrollGestureEndedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(Gestures.ScrollGestureEndedEvent, ScrollGestureEnded, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(Gestures.ScrollGestureEndedEvent, ScrollGestureEnded);\n    }\n\n    private void ScrollGestureEnded(object? sender, ScrollGestureEventArgs e)\n    {\n        OnScrollGestureEnded(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnScrollGestureEnded(object? sender, ScrollGestureEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/ScrollGestureEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class ScrollGestureEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<ScrollGestureEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(Gestures.ScrollGestureEvent, ScrollGesture, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(Gestures.ScrollGestureEvent, ScrollGesture);\n    }\n\n    private void ScrollGesture(object? sender, ScrollGestureEventArgs e)\n    {\n        OnScrollGesture(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnScrollGesture(object? sender, ScrollGestureEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/TappedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class TappedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<TappedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(Gestures.TappedEvent, Tapped, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(Gestures.TappedEvent, Tapped);\n    }\n\n    private void Tapped(object? sender, RoutedEventArgs e)\n    {\n        OnTapped(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnTapped(object? sender, RoutedEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/TextInputEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class TextInputEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<TextInputEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.TextInputEvent, TextInput, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.TextInputEvent, TextInput);\n    }\n\n    private void TextInput(object? sender, TextInputEventArgs e)\n    {\n        OnTextInput(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnTextInput(object? sender, TextInputEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Events/TextInputMethodClientRequestedEventBehavior.cs",
    "content": "﻿using Avalonia.Input;\nusing Avalonia.Input.TextInput;\nusing Avalonia.Interactivity;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Events;\n\n/// <summary>\n/// \n/// </summary>\npublic abstract class TextInputMethodClientRequestedEventBehavior : Behavior<Interactive>\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public static readonly StyledProperty<RoutingStrategies> RoutingStrategiesProperty = \n        AvaloniaProperty.Register<TextInputMethodClientRequestedEventBehavior, RoutingStrategies>(\n            nameof(RoutingStrategies),\n            RoutingStrategies.Tunnel | RoutingStrategies.Bubble);\n\n    /// <summary>\n    /// \n    /// </summary>\n    public RoutingStrategies RoutingStrategies\n    {\n        get => GetValue(RoutingStrategiesProperty);\n        set => SetValue(RoutingStrategiesProperty, value);\n    }\n\n    /// <inheritdoc />\n    protected override void OnAttachedToVisualTree()\n    {\n        AssociatedObject?.AddHandler(InputElement.TextInputMethodClientRequestedEvent, TextInputMethodClientRequested, RoutingStrategies);\n    }\n\n    /// <inheritdoc />\n    protected override void OnDetachedFromVisualTree()\n    {\n        AssociatedObject?.RemoveHandler(InputElement.TextInputMethodClientRequestedEvent, TextInputMethodClientRequested);\n    }\n\n    private void TextInputMethodClientRequested(object? sender, TextInputMethodClientRequestedEventArgs e)\n    {\n        OnTextInputMethodClientRequested(sender, e);\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    protected virtual void OnTextInputMethodClientRequested(object? sender, TextInputMethodClientRequestedEventArgs e)\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Responsive/AdaptiveBehavior.cs",
    "content": "﻿using System;\nusing Avalonia.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Metadata;\nusing Avalonia.Reactive;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Responsive;\n\n/// <summary>\n/// Observes <see cref=\"Behavior{T}.AssociatedObject\"/> control or <see cref=\"SourceControl\"/> control <see cref=\"Visual.Bounds\"/> property changes and if triggered sets or removes style classes when conditions from <see cref=\"AdaptiveClassSetter\"/> are met.\n/// </summary>\npublic class AdaptiveBehavior : Behavior<Control>\n{\n    private IDisposable? _disposable;\n    private AvaloniaList<AdaptiveClassSetter>? _setters;\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"SourceControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> SourceControlProperty =\n        AvaloniaProperty.Register<AdaptiveBehavior, Control?>(nameof(SourceControl));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> TargetControlProperty =\n        AvaloniaProperty.Register<AdaptiveBehavior, Control?>(nameof(TargetControl));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"Setters\"/> avalonia property.\n    /// </summary>\n    public static readonly DirectProperty<AdaptiveBehavior, AvaloniaList<AdaptiveClassSetter>> SettersProperty = \n        AvaloniaProperty.RegisterDirect<AdaptiveBehavior, AvaloniaList<AdaptiveClassSetter>>(nameof(Setters), t => t.Setters);\n\n    /// <summary>\n    /// Gets or sets the the source control that <see cref=\"Visual.BoundsProperty\"/> property are observed from, if not set <see cref=\"Behavior{T}.AssociatedObject\"/> is used. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? SourceControl\n    {\n        get => GetValue(SourceControlProperty);\n        set => SetValue(SourceControlProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the target control that class name that should be added or removed when triggered, if not set <see cref=\"Behavior{T}.AssociatedObject\"/> is used or <see cref=\"AdaptiveClassSetter.TargetControl\"/> from <see cref=\"AdaptiveClassSetter\"/>. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? TargetControl\n    {\n        get => GetValue(TargetControlProperty);\n        set => SetValue(TargetControlProperty, value);\n    }\n\n    /// <summary>\n    /// Gets adaptive class setters collection. This is a avalonia property.\n    /// </summary>\n    [Content]\n    public AvaloniaList<AdaptiveClassSetter> Setters => _setters ??= new AvaloniaList<AdaptiveClassSetter>();\n\n    /// <inheritdoc/>\n    protected override void OnAttachedToVisualTree()\n    {\n        base.OnAttachedToVisualTree();\n\n        StopObserving();\n        StartObserving();\n    }\n\n    /// <inheritdoc/>\n    protected override void OnDetachedFromVisualTree()\n    {\n        base.OnDetachedFromVisualTree();\n\n        StopObserving();\n    }\n\n    private void StartObserving()\n    {\n        var sourceControl = GetValue(SourceControlProperty) is not null\n            ? SourceControl \n            : AssociatedObject;\n\n        if (sourceControl is not null)\n        {\n            _disposable = ObserveBounds(sourceControl);\n        }\n    }\n\n    private void StopObserving()\n    {\n        _disposable?.Dispose();\n    }\n\n    private IDisposable ObserveBounds(Control sourceControl)\n    {\n        if (sourceControl is null)\n        {\n            throw new ArgumentNullException(nameof(sourceControl));\n        }\n\n        return sourceControl.GetObservable(Visual.BoundsProperty)\n            .Subscribe(new AnonymousObserver<Rect>(bounds => ValueChanged(sourceControl, Setters, bounds)));\n    }\n\n    private void ValueChanged(Control? sourceControl, AvaloniaList<AdaptiveClassSetter>? setters, Rect bounds)\n    {\n        if (sourceControl is null || setters is null)\n        {\n            return;\n        }\n\n        foreach (var setter in setters)\n        {\n            var isMinOrMaxWidthSet = setter.IsSet(AdaptiveClassSetter.MinWidthProperty)\n                                     || setter.IsSet(AdaptiveClassSetter.MaxWidthProperty);\n            var widthConditionTriggered = GetResult(setter.MinWidthOperator, bounds.Width, setter.MinWidth)\n                                          && GetResult(setter.MaxWidthOperator, bounds.Width, setter.MaxWidth);\n\n            var isMinOrMaxHeightSet = setter.IsSet(AdaptiveClassSetter.MinHeightProperty)\n                                      || setter.IsSet(AdaptiveClassSetter.MaxHeightProperty);\n            var heightConditionTriggered = GetResult(setter.MinHeightOperator, bounds.Height, setter.MinHeight)\n                                           && GetResult(setter.MaxHeightOperator, bounds.Height, setter.MaxHeight);\n\n            var isAddClassTriggered = isMinOrMaxWidthSet switch\n            {\n                true when !isMinOrMaxHeightSet => widthConditionTriggered,\n                false when isMinOrMaxHeightSet => heightConditionTriggered,\n                true when isMinOrMaxHeightSet => widthConditionTriggered && heightConditionTriggered,\n                _ => false\n            };\n\n            var targetControl = setter.GetValue(AdaptiveClassSetter.TargetControlProperty) is not null\n                ? setter.TargetControl \n                : GetValue(TargetControlProperty) is not null\n                    ? TargetControl \n                    : AssociatedObject;\n\n            if (targetControl is not null)\n            {\n                var className = setter.ClassName;\n                var isPseudoClass = setter.IsPseudoClass;\n\n                if (isAddClassTriggered)\n                {\n                    Add(targetControl, className, isPseudoClass);\n                }\n                else\n                {\n                    Remove(targetControl, className, isPseudoClass);\n                }\n            }\n            else\n            {\n                throw new ArgumentNullException(nameof(targetControl));\n            }\n        }\n    }\n\n    private bool GetResult(ComparisonConditionType comparisonConditionType, double property, double value)\n    {\n        return comparisonConditionType switch\n        {\n            // ReSharper disable once CompareOfFloatsByEqualityOperator\n            ComparisonConditionType.Equal => property == value,\n            // ReSharper disable once CompareOfFloatsByEqualityOperator\n            ComparisonConditionType.NotEqual => property != value,\n            ComparisonConditionType.LessThan => property < value,\n            ComparisonConditionType.LessThanOrEqual => property <= value,\n            ComparisonConditionType.GreaterThan => property > value,\n            ComparisonConditionType.GreaterThanOrEqual => property >= value,\n            _ => throw new ArgumentOutOfRangeException()\n        };\n    }\n\n    private static void Add(Control targetControl, string? className, bool isPseudoClass)\n    {\n        if (className is null || string.IsNullOrEmpty(className) || targetControl.Classes.Contains(className))\n        {\n            return;\n        }\n\n        if (isPseudoClass)\n        {\n            ((IPseudoClasses) targetControl.Classes).Add(className);\n        }\n        else\n        {\n            targetControl.Classes.Add(className);\n        }\n    }\n\n    private static void Remove(Control targetControl, string? className, bool isPseudoClass)\n    {\n        if (className is null || string.IsNullOrEmpty(className) || !targetControl.Classes.Contains(className))\n        {\n            return;\n        }\n\n        if (isPseudoClass)\n        {\n            ((IPseudoClasses) targetControl.Classes).Remove(className);\n        }\n        else\n        {\n            targetControl.Classes.Remove(className);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Responsive/AdaptiveClassSetter.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Metadata;\nusing Avalonia.Xaml.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.Responsive;\n\n/// <summary>\n/// Conditional class setter used in <see cref=\"AdaptiveBehavior\"/> behavior.\n/// </summary>\npublic class AdaptiveClassSetter : AvaloniaObject\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"MinWidth\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<double> MinWidthProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, double>(nameof(MinWidth));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MinWidthOperator\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<ComparisonConditionType> MinWidthOperatorProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, ComparisonConditionType>(nameof(MinWidthOperator), ComparisonConditionType.GreaterThanOrEqual);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MaxWidth\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<double> MaxWidthProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, double>(nameof(MaxWidth), double.PositiveInfinity);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MaxWidthOperator\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<ComparisonConditionType> MaxWidthOperatorProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, ComparisonConditionType>(nameof(MaxWidthOperator), ComparisonConditionType.LessThan);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MinHeight\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<double> MinHeightProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, double>(nameof(MinHeight));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MinHeightOperator\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<ComparisonConditionType> MinHeightOperatorProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, ComparisonConditionType>(nameof(MinHeightOperator), ComparisonConditionType.GreaterThanOrEqual);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MaxHeight\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<double> MaxHeightProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, double>(nameof(MaxHeight), double.PositiveInfinity);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"MaxHeightOperator\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<ComparisonConditionType> MaxHeightOperatorProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, ComparisonConditionType>(nameof(MaxHeightOperator), ComparisonConditionType.LessThan);\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"ClassName\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<string?> ClassNameProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, string?>(nameof(ClassName));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"IsPseudoClass\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<bool> IsPseudoClassProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, bool>(nameof(IsPseudoClass));\n\n    /// <summary>\n    /// Identifies the <seealso cref=\"TargetControl\"/> avalonia property.\n    /// </summary>\n    public static readonly StyledProperty<Control?> TargetControlProperty =\n        AvaloniaProperty.Register<AdaptiveClassSetter, Control?>(nameof(TargetControl));\n        \n    /// <summary>\n    /// Gets or sets minimum bounds width value used for property comparison. This is a avalonia property.\n    /// </summary>\n    public double MinWidth\n    {\n        get => GetValue(MinWidthProperty);\n        set => SetValue(MinWidthProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets minimum bounds width value comparison operator. This is a avalonia property.\n    /// </summary>\n    public ComparisonConditionType MinWidthOperator\n    {\n        get => GetValue(MinWidthOperatorProperty);\n        set => SetValue(MinWidthOperatorProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets maximum width value used for property comparison. This is a avalonia property.\n    /// </summary>\n    public double MaxWidth\n    {\n        get => GetValue(MaxWidthProperty);\n        set => SetValue(MaxWidthProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets maximum bounds width value comparison operator. This is a avalonia property.\n    /// </summary>\n    public ComparisonConditionType MaxWidthOperator\n    {\n        get => GetValue(MaxWidthOperatorProperty);\n        set => SetValue(MaxWidthOperatorProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets minimum bounds height value used for property comparison. This is a avalonia property.\n    /// </summary>\n    public double MinHeight\n    {\n        get => GetValue(MinHeightProperty);\n        set => SetValue(MinHeightProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets minimum bounds height value comparison operator. This is a avalonia property.\n    /// </summary>\n    public ComparisonConditionType MinHeightOperator\n    {\n        get => GetValue(MinHeightOperatorProperty);\n        set => SetValue(MinHeightOperatorProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets maximum height value used for property comparison. This is a avalonia property.\n    /// </summary>\n    public double MaxHeight\n    {\n        get => GetValue(MaxHeightProperty);\n        set => SetValue(MaxHeightProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets maximum bounds height value comparison operator. This is a avalonia property.\n    /// </summary>\n    public ComparisonConditionType MaxHeightOperator\n    {\n        get => GetValue(MaxHeightOperatorProperty);\n        set => SetValue(MaxHeightOperatorProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the class name that should be added or removed. This is a avalonia property.\n    /// </summary>\n    [Content]\n    public string? ClassName\n    {\n        get => GetValue(ClassNameProperty);\n        set => SetValue(ClassNameProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the flag whether ClassName is a PseudoClass. This is a avalonia property.\n    /// </summary>\n    public bool IsPseudoClass\n    {\n        get => GetValue(IsPseudoClassProperty);\n        set => SetValue(IsPseudoClassProperty, value);\n    }\n\n    /// <summary>\n    /// Gets or sets the target control that class name that should be added or removed when triggered, if not set <see cref=\"Behavior{T}.AssociatedObject\"/> is used or <see cref=\"AdaptiveBehavior.TargetControl\"/> from <see cref=\"AdaptiveBehavior\"/>. This is a avalonia property.\n    /// </summary>\n    [ResolveByName]\n    public Control? TargetControl\n    {\n        get => GetValue(TargetControlProperty);\n        set => SetValue(TargetControlProperty, value);\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Responsive/Avalonia.Xaml.Interactions.Responsive.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <OutputType>Library</OutputType>\n    <DocumentationFile>bin\\$(Configuration)\\$(TargetFramework)\\$(AssemblyName).xml</DocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Interactions.Responsive</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactions.Responsive/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing Avalonia.Metadata;\n\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactions.Responsive\")]\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/ActionCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Specialized;\nusing Avalonia.Collections;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// Represents a collection of <see cref=\"IAction\"/>'s.\n/// </summary>\npublic class ActionCollection : AvaloniaList<AvaloniaObject>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ActionCollection\"/> class.\n    /// </summary>\n    public ActionCollection()\n    {\n        CollectionChanged += ActionCollection_CollectionChanged;\n    }\n\n    private void ActionCollection_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs eventArgs)\n    {\n        var collectionChangedAction = eventArgs.Action;\n\n        if (collectionChangedAction == NotifyCollectionChangedAction.Reset)\n        {\n            foreach (var item in this)\n            {\n                VerifyType(item);\n            }\n        }\n        else if (collectionChangedAction == NotifyCollectionChangedAction.Add \n                 || collectionChangedAction == NotifyCollectionChangedAction.Replace)\n        {\n            var changedItem = eventArgs.NewItems?[0] as AvaloniaObject;\n            VerifyType(changedItem);\n        }\n    }\n\n    private static void VerifyType(AvaloniaObject? item)\n    {\n        if (item is null)\n        {\n            return;\n        }\n        if (item is not IAction)\n        {\n            throw new InvalidOperationException(\n                $\"Only {nameof(IAction)} types are supported in an {nameof(ActionCollection)}.\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/Avalonia.Xaml.Interactivity.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>\n    <OutputType>Library</OutputType>\n    <DocumentationFile>bin\\$(Configuration)\\$(TargetFramework)\\$(AssemblyName).xml</DocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageId>Avalonia.Xaml.Interactivity</PackageId>\n    <Description>Easily add interactivity to your Avalonia apps using XAML Behaviors. Behaviors encapsulate reusable functionalities for elements that can be easily added to your XAML without the need for more imperative code.</Description>\n    <PackageTags>Avalonia;Behavior;Action;Behaviors;Actions;Managed;C#;Interaction;Interactivity;Interactions;Xaml</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\SignAssembly.props\" />\n  <Import Project=\"..\\..\\build\\SourceLink.props\" />\n\n</Project>\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/Behavior.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Globalization;\nusing Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// A base class for behaviors, implementing the basic plumbing of <see cref=\"IBehavior\"/>.\n/// </summary>\npublic abstract class Behavior : AvaloniaObject, IBehavior\n{\n    /// <summary>\n    /// Gets the <see cref=\"AvaloniaObject\"/> to which the behavior is attached.\n    /// </summary>\n    public AvaloniaObject? AssociatedObject { get; private set; }\n\n    /// <summary>\n    /// Attaches the behavior to the specified <see cref=\"AvaloniaObject\"/>.\n    /// </summary>\n    /// <param name=\"associatedObject\">The <see cref=\"AvaloniaObject\"/> to which to attach.</param>\n    /// <exception cref=\"ArgumentNullException\"><paramref name=\"associatedObject\"/> is null.</exception>\n    public void Attach(AvaloniaObject? associatedObject)\n    {\n        if (Equals(associatedObject, AssociatedObject))\n        {\n            return;\n        }\n\n        if (AssociatedObject is not null)\n        {\n            throw new InvalidOperationException(string.Format(\n                CultureInfo.CurrentCulture,\n                \"An instance of a behavior cannot be attached to more than one object at a time.\"));\n        }\n\n        Debug.Assert(associatedObject is not null, \"Cannot attach the behavior to a null object.\");\n        AssociatedObject = associatedObject ?? throw new ArgumentNullException(nameof(associatedObject));\n\n        OnAttached();\n    }\n\n    /// <summary>\n    /// Detaches the behaviors from the <see cref=\"AssociatedObject\"/>.\n    /// </summary>\n    public void Detach()\n    {\n        OnDetaching();\n        AssociatedObject = null;\n    }\n\n    /// <summary>\n    /// Called after the behavior is attached to the <see cref=\"AssociatedObject\"/>.\n    /// </summary>\n    /// <remarks>\n    /// Override this to hook up functionality to the <see cref=\"AssociatedObject\"/>\n    /// </remarks>\n    protected virtual void OnAttached()\n    {\n    }\n\n    /// <summary>\n    /// Called when the behavior is being detached from its <see cref=\"AssociatedObject\"/>.\n    /// </summary>\n    /// <remarks>\n    /// Override this to unhook functionality from the <see cref=\"AssociatedObject\"/>\n    /// </remarks>\n    protected virtual void OnDetaching()\n    {\n    }\n\n    internal void AttachedToVisualTree()\n    {\n        OnAttachedToVisualTree();\n    }\n\n    internal void DetachedFromVisualTree()\n    {\n        OnDetachedFromVisualTree();\n    }\n\n    /// <summary>\n    /// Called after the <see cref=\"AssociatedObject\"/> is attached to the visual tree.\n    /// </summary>\n    /// <remarks>\n    /// Invoked only when the <see cref=\"AssociatedObject\"/> is of type <see cref=\"Control\"/>.\n    /// </remarks>\n    protected virtual void OnAttachedToVisualTree()\n    {\n    }\n\n    /// <summary>\n    /// Called when the <see cref=\"AssociatedObject\"/> is being detached from the visual tree.\n    /// </summary>\n    /// <remarks>\n    /// Invoked only when the <see cref=\"AssociatedObject\"/> is of type <see cref=\"Control\"/>.\n    /// </remarks>\n    protected virtual void OnDetachedFromVisualTree()\n    {\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/BehaviorCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.Specialized;\nusing System.Diagnostics;\nusing Avalonia.Collections;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// Represents a collection of <see cref=\"IBehavior\"/>'s with a shared <see cref=\"AssociatedObject\"/>.\n/// </summary>\npublic class BehaviorCollection : AvaloniaList<AvaloniaObject>\n{\n    // After a VectorChanged event we need to compare the current state of the collection\n    // with the old collection so that we can call Detach on all removed items.\n    private readonly List<IBehavior> _oldCollection = new();\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"BehaviorCollection\"/> class.\n    /// </summary>\n    public BehaviorCollection()\n    {\n        CollectionChanged += BehaviorCollection_CollectionChanged;\n    }\n\n    /// <summary>\n    /// Gets the <see cref=\"AvaloniaObject\"/> to which the <see cref=\"BehaviorCollection\"/> is attached.\n    /// </summary>\n    public AvaloniaObject? AssociatedObject\n    {\n        get;\n        private set;\n    }\n\n    /// <summary>\n    /// Attaches the collection of behaviors to the specified <see cref=\"AvaloniaObject\"/>.\n    /// </summary>\n    /// <param name=\"associatedObject\">The <see cref=\"AvaloniaObject\"/> to which to attach.</param>\n    /// <exception cref=\"InvalidOperationException\">The <see cref=\"BehaviorCollection\"/> is already attached to a different <see cref=\"AvaloniaObject\"/>.</exception>\n    public void Attach(AvaloniaObject? associatedObject)\n    {\n        if (Equals(associatedObject, AssociatedObject))\n        {\n            return;\n        }\n\n        if (AssociatedObject is not null)\n        {\n            throw new InvalidOperationException(\n                \"An instance of a behavior cannot be attached to more than one object at a time.\");\n        }\n\n        Debug.Assert(associatedObject is not null, \"The previous checks should keep us from ever setting null here.\");\n        AssociatedObject = associatedObject;\n\n        foreach (var item in this)\n        {\n            var behavior = (IBehavior)item;\n            behavior.Attach(AssociatedObject);\n        }\n    }\n\n    /// <summary>\n    /// Detaches the collection of behaviors from the <see cref=\"BehaviorCollection.AssociatedObject\"/>.\n    /// </summary>\n    public void Detach()\n    {\n        foreach (var item in this)\n        {\n            if (item is IBehavior { AssociatedObject: not null} behaviorItem)\n            {\n                behaviorItem.Detach();\n            }\n        }\n\n        AssociatedObject = null;\n        _oldCollection.Clear();\n    }\n\n    internal void AttachedToVisualTree()\n    {\n        foreach (var item in this)\n        {\n            if (item is Behavior behavior)\n            {\n                behavior.AttachedToVisualTree();\n            }\n        }\n    }\n\n    internal void DetachedFromVisualTree()\n    {\n        foreach (var item in this)\n        {\n            if (item is Behavior { AssociatedObject: not null} behavior)\n            {\n                behavior.DetachedFromVisualTree();\n            }\n        }\n    }\n\n    private void BehaviorCollection_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs eventArgs)\n    {\n        if (eventArgs.Action == NotifyCollectionChangedAction.Reset)\n        {\n            foreach (var behavior in _oldCollection)\n            {\n                if (behavior.AssociatedObject is not null)\n                {\n                    behavior.Detach();\n                }\n            }\n\n            _oldCollection.Clear();\n\n            foreach (var newItem in this)\n            {\n                _oldCollection.Add(VerifiedAttach(newItem));\n            }\n#if DEBUG\n            VerifyOldCollectionIntegrity();\n#endif\n            return;\n        }\n\n        switch (eventArgs.Action)\n        {\n            case NotifyCollectionChangedAction.Add:\n            {\n                var eventIndex = eventArgs.NewStartingIndex;\n                var changedItem = eventArgs.NewItems?[0] as AvaloniaObject;\n                _oldCollection.Insert(eventIndex, VerifiedAttach(changedItem));\n            }\n                break;\n\n            case NotifyCollectionChangedAction.Replace:\n            {\n                var eventIndex = eventArgs.OldStartingIndex;\n                eventIndex = eventIndex == -1 ? 0 : eventIndex;\n\n                var changedItem = eventArgs.NewItems?[0] as AvaloniaObject;\n\n                var oldItem = _oldCollection[eventIndex];\n                if (oldItem.AssociatedObject is not null)\n                {\n                    oldItem.Detach();\n                }\n\n                _oldCollection[eventIndex] = VerifiedAttach(changedItem);\n            }\n                break;\n\n            case NotifyCollectionChangedAction.Remove:\n            {\n                var eventIndex = eventArgs.OldStartingIndex;\n\n                var oldItem = _oldCollection[eventIndex];\n                if (oldItem.AssociatedObject is not null)\n                {\n                    oldItem.Detach();\n                }\n\n                _oldCollection.RemoveAt(eventIndex);\n            }\n                break;\n\n            case NotifyCollectionChangedAction.Move:\n            case NotifyCollectionChangedAction.Reset:\n            default:\n                Debug.Assert(false, \"Unsupported collection operation attempted.\");\n                break;\n        }\n#if DEBUG\n        VerifyOldCollectionIntegrity();\n#endif\n    }\n\n    private IBehavior VerifiedAttach(AvaloniaObject? item)\n    {\n        if (!(item is IBehavior behavior))\n        {\n            throw new InvalidOperationException(\n                $\"Only {nameof(IBehavior)} types are supported in a {nameof(BehaviorCollection)}.\");\n        }\n\n        if (_oldCollection.Contains(behavior))\n        {\n            throw new InvalidOperationException(\n                $\"Cannot add an instance of a behavior to a {nameof(BehaviorCollection)} more than once.\");\n        }\n\n        if (AssociatedObject is not null)\n        {\n            behavior.Attach(AssociatedObject);\n        }\n\n        return behavior;\n    }\n\n    [Conditional(\"DEBUG\")]\n    private void VerifyOldCollectionIntegrity()\n    {\n        var isValid = Count == _oldCollection.Count;\n        if (isValid)\n        {\n            for (var i = 0; i < Count; i++)\n            {\n                if (!Equals(this[i], _oldCollection[i]))\n                {\n                    isValid = false;\n                    break;\n                }\n            }\n        }\n\n        Debug.Assert(isValid, \"Referential integrity of the collection has been compromised.\");\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/BehaviorCollectionTemplate.cs",
    "content": "﻿using Avalonia.Markup.Xaml.Templates;\nusing Avalonia.Metadata;\nusing Avalonia.Styling;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// A template for creating a collection of <see cref=\"Behavior\"/> objects.\n/// </summary>\npublic class BehaviorCollectionTemplate : ITemplate\n{\n    /// <summary>\n    /// Gets or sets the content of the template.\n    /// </summary>\n    [Content]\n    [TemplateContent(TemplateResultType = typeof(BehaviorCollection))]\n    public object? Content { get; set; }\n\n    /// <summary>\n    /// Builds the collection of behaviors from the template.\n    /// </summary>\n    /// <returns>The collection of behaviors created from the template.</returns>\n    object? ITemplate.Build() => TemplateContent.Load<BehaviorCollection>(Content)?.Result;\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/BehaviorOfT.cs",
    "content": "﻿using System;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// A base class for behaviors making them code compatible with older frameworks,\n/// and allow for typed associated objects.\n/// </summary>\n/// <typeparam name=\"T\">The object type to attach to</typeparam>\npublic abstract class Behavior<T> : Behavior where T : AvaloniaObject\n{\n    /// <summary>\n    /// Gets the object to which this behavior is attached.\n    /// </summary>\n    public new T? AssociatedObject => base.AssociatedObject as T;\n\n    /// <summary>\n    /// Called after the behavior is attached to the <see cref=\"Behavior.AssociatedObject\"/>.\n    /// </summary>\n    /// <remarks>\n    /// Override this to hook up functionality to the <see cref=\"Behavior.AssociatedObject\"/>\n    /// </remarks>\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    protected override void OnAttached()\n    {\n        base.OnAttached();\n\n        if (AssociatedObject is null && base.AssociatedObject is not null)\n        {\n            var actualType = base.AssociatedObject?.GetType().FullName;\n            var expectedType = typeof(T).FullName;\n            var message = $\"AssociatedObject is of type {actualType} but should be of type {expectedType}.\";\n            throw new InvalidOperationException(message);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/ComparisonConditionType.cs",
    "content": "﻿namespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// Represents one ternary condition.\n/// </summary>\npublic enum ComparisonConditionType\n{\n    /// <summary>\n    /// Specifies an equal condition.\n    /// </summary>\n    Equal,\n    /// <summary>\n    /// Specifies a not equal condition.\n    /// </summary>\n    NotEqual,\n    /// <summary>\n    /// Specifies a less than condition.\n    /// </summary>\n    LessThan,\n    /// <summary>\n    /// Specifies a less than or equal condition.\n    /// </summary>\n    LessThanOrEqual,\n    /// <summary>\n    /// Specifies a greater than condition.\n    /// </summary>\n    GreaterThan,\n    /// <summary>\n    /// Specifies a greater than or equal condition.\n    /// </summary>\n    GreaterThanOrEqual\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/IAction.cs",
    "content": "﻿namespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// Interface implemented by all custom actions.\n/// </summary>\npublic interface IAction\n{\n    /// <summary>\n    /// Executes the action.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> that is passed to the action by the behavior. Generally this is <seealso cref=\"IBehavior.AssociatedObject\"/> or a target object.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the caller.</param>\n    /// <remarks> An example of parameter usage is EventTriggerBehavior, which passes the EventArgs as a parameter to its actions.</remarks>\n    /// <returns>Returns the result of the action.</returns>\n    object? Execute(object? sender, object? parameter);\n}"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/IBehavior.cs",
    "content": "﻿namespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// Interface implemented by all custom behaviors.\n/// </summary>\npublic interface IBehavior\n{\n    /// <summary>\n    /// Gets the <see cref=\"AvaloniaObject\"/> to which the <seealso cref=\"IBehavior\"/> is attached.\n    /// </summary>\n    AvaloniaObject? AssociatedObject { get; }\n\n    /// <summary>\n    /// Attaches to the specified object.\n    /// </summary>\n    /// <param name=\"associatedObject\">The <see cref=\"AvaloniaObject\"/> to which the <seealso cref=\"IBehavior\"/> will be attached.</param>\n    void Attach(AvaloniaObject? associatedObject);\n\n    /// <summary>\n    /// Detaches this instance from its associated object.\n    /// </summary>\n    void Detach();\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/ITrigger.cs",
    "content": "﻿namespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// Interface implemented by all custom triggers.\n/// </summary>\npublic interface ITrigger : IBehavior\n{\n    /// <summary>\n    /// Gets the collection of actions associated with the behavior.\n    /// </summary>\n    ActionCollection Actions { get; }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/Interaction.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Avalonia.Controls;\nusing Avalonia.Reactive;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// Defines a <see cref=\"BehaviorCollection\"/> attached property and provides a method for executing an <seealso cref=\"ActionCollection\"/>.\n/// </summary>\npublic class Interaction\n{\n    static Interaction()\n    {\n        BehaviorsProperty.Changed.Subscribe(\n            new AnonymousObserver<AvaloniaPropertyChangedEventArgs<BehaviorCollection?>>(BehaviorsChanged));\n    }\n\n    /// <summary>\n    /// Gets or sets the <see cref=\"BehaviorCollection\"/> associated with a specified object.\n    /// </summary>\n    public static readonly AttachedProperty<BehaviorCollection?> BehaviorsProperty =\n        AvaloniaProperty.RegisterAttached<Interaction, AvaloniaObject, BehaviorCollection?>(\"Behaviors\");\n\n    /// <summary>\n    /// Gets the <see cref=\"BehaviorCollection\"/> associated with a specified object.\n    /// </summary>\n    /// <param name=\"obj\">The <see cref=\"AvaloniaObject\"/> from which to retrieve the <see cref=\"BehaviorCollection\"/>.</param>\n    /// <returns>A <see cref=\"BehaviorCollection\"/> containing the behaviors associated with the specified object.</returns>\n    public static BehaviorCollection GetBehaviors(AvaloniaObject obj)\n    {\n        if (obj is null)\n        {\n            throw new ArgumentNullException(nameof(obj));\n        }\n\n        var behaviorCollection = obj.GetValue(BehaviorsProperty);\n        if (behaviorCollection is null)\n        {\n            behaviorCollection = new BehaviorCollection();\n            obj.SetValue(BehaviorsProperty, behaviorCollection);\n            SetVisualTreeEventHandlersInitial(obj);\n        }\n\n        return behaviorCollection;\n    }\n\n    /// <summary>\n    /// Sets the <see cref=\"BehaviorCollection\"/> associated with a specified object.\n    /// </summary>\n    /// <param name=\"obj\">The <see cref=\"AvaloniaObject\"/> on which to set the <see cref=\"BehaviorCollection\"/>.</param>\n    /// <param name=\"value\">The <see cref=\"BehaviorCollection\"/> associated with the object.</param>\n    public static void SetBehaviors(AvaloniaObject obj, BehaviorCollection? value)\n    {\n        if (obj is null)\n        {\n            throw new ArgumentNullException(nameof(obj));\n        }\n        obj.SetValue(BehaviorsProperty, value);\n    }\n\n    /// <summary>\n    /// Executes all actions in the <see cref=\"ActionCollection\"/> and returns their results.\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"object\"/> which will be passed on to the action.</param>\n    /// <param name=\"actions\">The set of actions to execute.</param>\n    /// <param name=\"parameter\">The value of this parameter is determined by the calling behavior.</param>\n    /// <returns>Returns the results of the actions.</returns>\n    public static IEnumerable<object> ExecuteActions(object? sender, ActionCollection? actions, object? parameter)\n    {\n        if (actions is null)\n        {\n            return Enumerable.Empty<object>();\n        }\n\n        var results = new List<object>();\n\n        foreach (var avaloniaObject in actions)\n        {\n            if (avaloniaObject is not IAction action)\n            {\n                continue;\n            }\n\n            var result = action.Execute(sender, parameter);\n            if (result is not null)\n            {\n                results.Add(result);\n            }\n        }\n\n        return results;\n    }\n\n    private static void BehaviorsChanged(AvaloniaPropertyChangedEventArgs<BehaviorCollection?> e)\n    {\n        var oldCollection = e.OldValue.GetValueOrDefault();\n        var newCollection = e.NewValue.GetValueOrDefault();\n\n        if (oldCollection == newCollection)\n        {\n            return;\n        }\n\n        if (oldCollection is { AssociatedObject: not null})\n        {\n            oldCollection.Detach();\n        }\n\n        if (newCollection is not null)\n        {\n            newCollection.Attach(e.Sender);\n            SetVisualTreeEventHandlersRuntime(e.Sender);\n        }\n    }\n\n    private static void SetVisualTreeEventHandlersInitial(AvaloniaObject obj)\n    {\n        if (obj is not Control control)\n        {\n            return;\n        }\n\n        control.AttachedToVisualTree -= Control_AttachedToVisualTreeRuntime;\n        control.DetachedFromVisualTree -= Control_DetachedFromVisualTreeRuntime;\n\n        control.AttachedToVisualTree -= Control_AttachedToVisualTreeInitial;\n        control.AttachedToVisualTree += Control_AttachedToVisualTreeInitial;\n\n        control.DetachedFromVisualTree -= Control_DetachedFromVisualTreeInitial;\n        control.DetachedFromVisualTree += Control_DetachedFromVisualTreeInitial;\n    }\n\n    private static void SetVisualTreeEventHandlersRuntime(AvaloniaObject obj)\n    {\n        if (obj is not Control control)\n        {\n            return;\n        }\n\n        control.AttachedToVisualTree -= Control_AttachedToVisualTreeInitial;\n        control.DetachedFromVisualTree -= Control_DetachedFromVisualTreeInitial;\n\n        control.AttachedToVisualTree -= Control_AttachedToVisualTreeRuntime;\n        control.AttachedToVisualTree += Control_AttachedToVisualTreeRuntime;\n\n        control.DetachedFromVisualTree -= Control_DetachedFromVisualTreeRuntime;\n        control.DetachedFromVisualTree += Control_DetachedFromVisualTreeRuntime;\n    }\n\n    private static void Control_AttachedToVisualTreeInitial(object? sender, VisualTreeAttachmentEventArgs e)\n    {\n        if (sender is AvaloniaObject d)\n        {\n            GetBehaviors(d).Attach(d);\n            GetBehaviors(d).AttachedToVisualTree();\n        }\n    }\n\n    private static void Control_DetachedFromVisualTreeInitial(object? sender, VisualTreeAttachmentEventArgs e)\n    {\n        if (sender is AvaloniaObject d)\n        {\n            GetBehaviors(d).DetachedFromVisualTree();\n            GetBehaviors(d).Detach();\n        }\n    }\n \n    private static void Control_AttachedToVisualTreeRuntime(object? sender, VisualTreeAttachmentEventArgs e)\n    {\n        if (sender is AvaloniaObject d)\n        {\n            GetBehaviors(d).AttachedToVisualTree();\n        }\n    }\n\n    private static void Control_DetachedFromVisualTreeRuntime(object? sender, VisualTreeAttachmentEventArgs e)\n    {\n        if (sender is AvaloniaObject d)\n        {\n            GetBehaviors(d).DetachedFromVisualTree();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing Avalonia.Metadata;\n\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactivity.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.Custom, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.DragAndDrop, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.Draggable, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.Events, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.Custom, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n[assembly: InternalsVisibleTo(\"Avalonia.Xaml.Interactions.Responsive, PublicKey=00240000048000009400000006020000002400005253413100040000010001002940ed211918fcf63c506fad1d3f7f958b21ff8f06fd2089398296173f9ca93a69b9b380a828bf13fa80d1745beeb917ec3692f4d10e44b4c941619fc7bbd5052b26880697e6fa3f0ce322c4fa902d20b67a48b4144371218f6d39ad39145ea1fe5484052dd51a2ee62af3acd0759bcf92aaefec03978ded3cfaa84798e92de8\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/avaloniaui\", \"Avalonia.Xaml.Interactivity\")]\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/System/Diagnostics/CodeAnalysis/TrimmingAttributes.cs",
    "content": "#pragma warning disable MA0048 // File name must match type name\n// https://github.com/dotnet/runtime/tree/main/src/libraries/System.Private.CoreLib/src/System/Diagnostics/CodeAnalysis\n\n// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n// See the LICENSE file in the project root for more information.\n\nnamespace System.Diagnostics.CodeAnalysis\n{\n#nullable enable\n#if !NET6_0_OR_GREATER\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter |\n        AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method |\n        AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct,\n        Inherited = false)]\n    internal sealed class DynamicallyAccessedMembersAttribute : Attribute\n    {\n        public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberTypes)\n        {\n            MemberTypes = memberTypes;\n        }\n\n        public DynamicallyAccessedMemberTypes MemberTypes { get; }\n    }\n    \n    [Flags]\n    internal enum DynamicallyAccessedMemberTypes\n    {\n        None = 0,\n        PublicParameterlessConstructor = 0x0001,\n        PublicConstructors = 0x0002 | PublicParameterlessConstructor,\n        NonPublicConstructors = 0x0004,\n        PublicMethods = 0x0008,\n        NonPublicMethods = 0x0010,\n        PublicFields = 0x0020,\n        NonPublicFields = 0x0040,\n        PublicNestedTypes = 0x0080,\n        NonPublicNestedTypes = 0x0100,\n        PublicProperties = 0x0200,\n        NonPublicProperties = 0x0400,\n        PublicEvents = 0x0800,\n        NonPublicEvents = 0x1000,\n        Interfaces = 0x2000,\n        All = ~None\n    }\n    \n    [AttributeUsage(\n        AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method,\n        AllowMultiple = true, Inherited = false)]\n    internal sealed class DynamicDependencyAttribute : Attribute\n    {\n        public DynamicDependencyAttribute(string memberSignature)\n        {\n            MemberSignature = memberSignature;\n        }\n\n        public DynamicDependencyAttribute(string memberSignature, Type type)\n        {\n            MemberSignature = memberSignature;\n            Type = type;\n        }\n\n        public DynamicDependencyAttribute(string memberSignature, string typeName, string assemblyName)\n        {\n            MemberSignature = memberSignature;\n            TypeName = typeName;\n            AssemblyName = assemblyName;\n        }\n\n        public DynamicDependencyAttribute(DynamicallyAccessedMemberTypes memberTypes, Type type)\n        {\n            MemberTypes = memberTypes;\n            Type = type;\n        }\n\n        public DynamicDependencyAttribute(DynamicallyAccessedMemberTypes memberTypes, string typeName, string assemblyName)\n        {\n            MemberTypes = memberTypes;\n            TypeName = typeName;\n            AssemblyName = assemblyName;\n        }\n\n        public string? MemberSignature { get; }\n        public DynamicallyAccessedMemberTypes MemberTypes { get; }\n        public Type? Type { get; }\n        public string? TypeName { get; }\n        public string? AssemblyName { get; }\n        public string? Condition { get; set; }\n    }\n    \n    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Class, Inherited = false)]\n    internal sealed class RequiresUnreferencedCodeAttribute : Attribute\n    {\n        public RequiresUnreferencedCodeAttribute(string message)\n        {\n            Message = message;\n        }\n\n        public string Message { get; }\n        public string? Url { get; set; }\n    }\n\n    [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]\n    internal sealed class UnconditionalSuppressMessageAttribute : Attribute\n    {\n        public UnconditionalSuppressMessageAttribute(string category, string checkId)\n        {\n            Category = category;\n            CheckId = checkId;\n        }\n        public string Category { get; }\n        public string CheckId { get; }\n        public string? Scope { get; set; }\n        public string? Target { get; set; }\n        public string? MessageId { get; set; }\n        public string? Justification { get; set; }\n    }\n#endif\n}\n\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/Trigger.cs",
    "content": "﻿using Avalonia.Metadata;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// A base class for behaviors, implementing the basic plumbing of <seealso cref=\"ITrigger\"/>.\n/// </summary>\npublic abstract class Trigger : Behavior, ITrigger\n{\n    /// <summary>\n    /// Identifies the <seealso cref=\"Actions\"/> avalonia property.\n    /// </summary>\n    public static readonly DirectProperty<Trigger, ActionCollection> ActionsProperty =\n        AvaloniaProperty.RegisterDirect<Trigger, ActionCollection>(nameof(Actions), t => t.Actions);\n\n    private ActionCollection? _actions;\n\n    /// <summary>\n    /// Gets the collection of actions associated with the behavior. This is a avalonia property.\n    /// </summary>\n    [Content]\n    public ActionCollection Actions => _actions ??= new ActionCollection();\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/TriggerOfT.cs",
    "content": "﻿using System;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// A base class for behaviors, implementing the basic plumbing of <seealso cref=\"ITrigger\"/>.\n/// </summary>\n/// <typeparam name=\"T\">The object type to attach to</typeparam>\npublic abstract class Trigger<T> : Trigger where T : AvaloniaObject\n{\n    /// <summary>\n    /// Gets the object to which this behavior is attached.\n    /// </summary>\n    public new T? AssociatedObject => base.AssociatedObject as T;\n\n    /// <summary>\n    /// Called after the behavior is attached to the <see cref=\"Behavior.AssociatedObject\"/>.\n    /// </summary>\n    /// <remarks>\n    /// Override this to hook up functionality to the <see cref=\"Behavior.AssociatedObject\"/>\n    /// </remarks>\n    /// \n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    protected override void OnAttached()\n    {\n        base.OnAttached();\n\n        if (AssociatedObject is null && base.AssociatedObject is not null)\n        {\n            var actualType = base.AssociatedObject?.GetType().FullName;\n            var expectedType = typeof(T).FullName;\n            var message = $\"AssociatedObject is of type {actualType} but should be of type {expectedType}.\";\n            throw new InvalidOperationException(message);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Avalonia.Xaml.Interactivity/TypeConverterHelper.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Linq;\n\nnamespace Avalonia.Xaml.Interactivity;\n\n/// <summary>\n/// A helper class that enables converting values specified in markup (strings) to their object representation.\n/// </summary>\ninternal static class TypeConverterHelper\n{\n    /// <summary>\n    /// Converts string representation of a value to its object representation.\n    /// </summary>\n    /// <param name=\"value\">The value to convert.</param>\n    /// <param name=\"destinationType\">The destination type.</param>\n    /// <returns>Object representation of the string value.</returns>\n    /// <exception cref=\"ArgumentNullException\">destinationType cannot be null.</exception>\n    [RequiresUnreferencedCode(\"This functionality is not compatible with trimming.\")]\n    public static object? Convert(string value, Type destinationType)\n    {\n        if (destinationType is null)\n        {\n            throw new ArgumentNullException(nameof(destinationType));\n        }\n\n        var destinationTypeFullName = destinationType.FullName;\n        if (destinationTypeFullName is null)\n        {\n            return null;\n        }\n\n        var scope = GetScope(destinationTypeFullName);\n\n        // Value types in the \"System\" namespace must be special cased due to a bug in the xaml compiler\n        if (string.Equals(scope, \"System\", StringComparison.Ordinal))\n        {\n            if (string.Equals(destinationTypeFullName, typeof(string).FullName, StringComparison.Ordinal))\n            {\n                return value;\n            }\n\n            if (string.Equals(destinationTypeFullName, typeof(bool).FullName, StringComparison.Ordinal))\n            {\n                return bool.Parse(value);\n            }\n\n            if (string.Equals(destinationTypeFullName, typeof(int).FullName, StringComparison.Ordinal))\n            {\n                return int.Parse(value, CultureInfo.InvariantCulture);\n            }\n\n            if (string.Equals(destinationTypeFullName, typeof(double).FullName, StringComparison.Ordinal))\n            {\n                return double.Parse(value, CultureInfo.InvariantCulture);\n            }\n        }\n\n        try\n        {\n            if (destinationType.BaseType == typeof(Enum))\n                return Enum.Parse(destinationType, value);\n\n            if (destinationType.GetInterfaces().Any(t => t == typeof(IConvertible)))\n            {\n                return (value as IConvertible).ToType(destinationType, CultureInfo.InvariantCulture);\n            }\n\n            var converter = TypeDescriptor.GetConverter(destinationType);\n            return converter.ConvertFromInvariantString(value);\n        }\n        catch (ArgumentException)\n        {\n            // not an enum\n        }\n        catch (InvalidCastException)\n        {\n            // not able to convert to anything\n        }\n\n        return null;\n    }\n\n    private static string GetScope(string name)\n    {\n        var indexOfLastPeriod = name.LastIndexOf('.');\n#if !NET6_0_OR_GREATER\n        if (indexOfLastPeriod != name.Length - 1)\n        {\n            return name.Substring(0, indexOfLastPeriod);\n        }\n\n        return name;\n#else\n        return indexOfLastPeriod != name.Length - 1 ? name[..indexOfLastPeriod] : name;\n#endif\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             x:Class=\"Avalonia.Xaml.Interactions.UnitTests.App\">\n  <Application.Styles>\n    <FluentTheme />\n    <Style Selector=\"Window\">\n      <Setter Property=\"FontFamily\" Value=\"resm:Avalonia.Xaml.Interactions.UnitTests.Assets?assembly=Avalonia.Xaml.Interactions.UnitTests#Noto Mono\" />\n    </Style>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/App.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests;\n\nusing Avalonia;\n\npublic class App : Application\n{\n    public override void Initialize()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Avalonia.Xaml.Interactions.UnitTests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\" ToolsVersion=\"15.0\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <OutputType>Library</OutputType>\n    <GenerateAssemblyInfo>False</GenerateAssemblyInfo>\n    <GenerateRuntimeConfigurationFiles>True</GenerateRuntimeConfigurationFiles>\n    <IsPackable>False</IsPackable>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n    <PackageReference Include=\"Avalonia.Desktop\" />\n    <PackageReference Include=\"Avalonia.Themes.Fluent\" />\n    <PackageReference Include=\"Avalonia.Headless.XUnit\" />\n    <PackageReference Include=\"Verify.Avalonia\" />\n    <PackageReference Include=\"Verify.DiffPlex\" />\n    <PackageReference Include=\"Verify.ImageMagick\" />\n    <PackageReference Include=\"Verify.Xunit\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Include=\"*\\*.ttf\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\XUnit.props\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions\\Avalonia.Xaml.Interactions.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Custom\\Avalonia.Xaml.Interactions.Custom.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.DragAndDrop\\Avalonia.Xaml.Interactions.DragAndDrop.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Draggable\\Avalonia.Xaml.Interactions.Draggable.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Events\\Avalonia.Xaml.Interactions.Events.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions.Responsive\\Avalonia.Xaml.Interactions.Responsive.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodAction001.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.CallMethodAction001\"\n        Title=\"CallMethodAction001\">\n  <StackPanel>\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <CallMethodAction TargetObject=\"{Binding $parent[Window]}\"\n                            MethodName=\"TestMethod\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodAction001.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class CallMethodAction001 : Window\n{\n    public string? TestProperty { get; set; }\n    \n    public CallMethodAction001()\n    {\n        InitializeComponent();\n    }\n\n    public void TestMethod()\n    {\n        TestProperty = \"Test String\";\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodAction002.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.CallMethodAction002\"\n        Title=\"CallMethodAction002\">\n  <StackPanel>\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <CallMethodAction TargetObject=\"{Binding $parent[Window]}\"\n                            MethodName=\"TestMethod\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodAction002.axaml.cs",
    "content": "﻿using System;\nusing Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class CallMethodAction002 : Window\n{\n    public string? TestProperty { get; set; }\n    \n    public object? Sender { get; set; }\n\n    public EventArgs? Args { get; set; }\n\n    public CallMethodAction002()\n    {\n        InitializeComponent();\n    }\n\n    public void TestMethod(object? sender, EventArgs args)\n    {\n        TestProperty = \"Test String\";\n        Sender = sender;\n        Args = args;\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodActionTests.CallMethodAction_001.Linux.verified.txt",
    "content": "﻿{\n  Type: CallMethodAction001,\n  Title: CallMethodAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodActionTests.CallMethodAction_001.OSX.verified.txt",
    "content": "﻿{\n  Type: CallMethodAction001,\n  Title: CallMethodAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodActionTests.CallMethodAction_001.Windows.verified.txt",
    "content": "﻿{\n  Type: CallMethodAction001,\n  Title: CallMethodAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodActionTests.CallMethodAction_002.Linux.verified.txt",
    "content": "﻿{\n  Type: CallMethodAction002,\n  Title: CallMethodAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodActionTests.CallMethodAction_002.OSX.verified.txt",
    "content": "﻿{\n  Type: CallMethodAction002,\n  Title: CallMethodAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodActionTests.CallMethodAction_002.Windows.verified.txt",
    "content": "﻿{\n  Type: CallMethodAction002,\n  Title: CallMethodAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/CallMethodActionTests.cs",
    "content": "﻿using System.Threading.Tasks;\nusing Avalonia.Headless;\nusing Avalonia.Headless.XUnit;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing VerifyTests;\nusing VerifyXunit;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\n[UsesVerify]\npublic class CallMethodActionTests\n{\n    /// <summary>\n    /// Without parameters.\n    /// </summary>\n    [AvaloniaFact]\n    public Task CallMethodAction_001()\n    {\n        var window = new CallMethodAction001();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"CallMethodAction_001_0.png\");\n\n        Assert.Null(window.TestProperty);\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"CallMethodAction_001_1.png\");\n\n        Assert.Equal(\"Test String\", window.TestProperty);\n        return Verifier.Verify(window);\n    }\n\n    /// <summary>\n    /// With event handler parameters.\n    /// </summary>\n    [AvaloniaFact]\n    public Task CallMethodAction_002()\n    {\n        var window = new CallMethodAction002();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"CallMethodAction_002_0.png\");\n\n        Assert.Null(window.TestProperty);\n        Assert.Null(window.Sender);\n        Assert.Null(window.Args);\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"CallMethodAction_002_1.png\");\n\n        Assert.Equal(\"Test String\", window.TestProperty);\n        Assert.Equal(window, window.Sender);\n        Assert.IsType<RoutedEventArgs>(window.Args);\n        return Verifier.Verify(window);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyAction001.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.ChangePropertyAction001\"\n        Title=\"ChangePropertyAction001\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <ChangePropertyAction TargetObject=\"TargetTextBox\"\n                                PropertyName=\"Text\"\n                                Value=\"Updated Text\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyAction001.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class ChangePropertyAction001 : Window\n{\n    public ChangePropertyAction001()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyAction002.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.ChangePropertyAction002\"\n        Title=\"ChangePropertyAction002\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\"\n             FontSize=\"10\"/>\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <ChangePropertyAction TargetObject=\"TargetTextBox\"\n                                PropertyName=\"(TextBox.FontSize)\"\n                                Value=\"12\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyAction002.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class ChangePropertyAction002 : Window\n{\n    public ChangePropertyAction002()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyActionTests.ChangePropertyAction_001.Linux.verified.txt",
    "content": "﻿{\n  Type: ChangePropertyAction001,\n  Title: ChangePropertyAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Updated Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyActionTests.ChangePropertyAction_001.OSX.verified.txt",
    "content": "﻿{\n  Type: ChangePropertyAction001,\n  Title: ChangePropertyAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Updated Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyActionTests.ChangePropertyAction_001.Windows.verified.txt",
    "content": "﻿{\n  Type: ChangePropertyAction001,\n  Title: ChangePropertyAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Updated Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyActionTests.ChangePropertyAction_002.Linux.verified.txt",
    "content": "﻿{\n  Type: ChangePropertyAction002,\n  Title: ChangePropertyAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Initial Text,\n        FontSize: 12.0,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyActionTests.ChangePropertyAction_002.OSX.verified.txt",
    "content": "﻿{\n  Type: ChangePropertyAction002,\n  Title: ChangePropertyAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Initial Text,\n        FontSize: 12.0,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyActionTests.ChangePropertyAction_002.Windows.verified.txt",
    "content": "﻿{\n  Type: ChangePropertyAction002,\n  Title: ChangePropertyAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Initial Text,\n        FontSize: 12.0,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/ChangePropertyActionTests.cs",
    "content": "﻿using System.Threading.Tasks;\nusing Avalonia.Headless;\nusing Avalonia.Headless.XUnit;\nusing Avalonia.Input;\nusing VerifyXunit;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\n[UsesVerify]\npublic class ChangePropertyActionTests\n{\n    /// <summary>\n    /// Regular property.\n    /// </summary>\n    [AvaloniaFact]\n    public Task ChangePropertyAction_001()\n    {\n        var window = new ChangePropertyAction001();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"ChangePropertyAction_001_0.png\");\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"ChangePropertyAction_001_1.png\");\n\n        Assert.Equal(\"Updated Text\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n\n    /// <summary>\n    /// Attached property.\n    /// </summary>\n    [AvaloniaFact]\n    public Task ChangePropertyAction_002()\n    {\n        var window = new ChangePropertyAction002();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"ChangePropertyAction_002_0.png\");\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"ChangePropertyAction_002_1.png\");\n\n        Assert.Equal(12d, window.TargetTextBox.FontSize);\n        return Verifier.Verify(window);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/Command.cs",
    "content": "﻿using System;\nusing System.Windows.Input;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\ninternal class Command(Action<object?> execute, Func<object?, bool>? canExecute = null)\n    : ICommand\n{\n    public bool CanExecute(object? parameter)\n    {\n        return canExecute?.Invoke(parameter) ?? true;\n    }\n\n    public void Execute(object? parameter)\n    {\n        execute.Invoke(parameter);\n    }\n\n    #pragma warning disable CS0067\n    public event EventHandler? CanExecuteChanged;\n    #pragma warning restore CS0067\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/DataTriggerBehavior001.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.DataTriggerBehavior001\"\n        Title=\"DataTriggerBehavior001\">\n  <StackPanel>\n    <TextBlock Name=\"TargetTextBlock\" \n               Text=\"\">\n      <Interaction.Behaviors>\n        <DataTriggerBehavior Binding=\"{Binding #TargetSlider.Value}\" \n                             ComparisonCondition=\"GreaterThan\" \n                             Value=\"50\">\n          <ChangePropertyAction PropertyName=\"Text\"\n                                Value=\"More than 50\" />\n        </DataTriggerBehavior>\n        <DataTriggerBehavior Binding=\"{Binding #TargetSlider.Value}\" \n                             ComparisonCondition=\"LessThanOrEqual\" \n                             Value=\"50\">\n          <ChangePropertyAction PropertyName=\"Text\"\n                                Value=\"Less than or equal 50\" />\n        </DataTriggerBehavior>\n      </Interaction.Behaviors>\n    </TextBlock>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"{Binding #TargetSlider.Value, Mode=TwoWay}\" />\n    <Slider Name=\"TargetSlider\" \n            Minimum=\"0\"\n            Maximum=\"100\"\n            SmallChange=\"25\"\n            Value=\"0\" />\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/DataTriggerBehavior001.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class DataTriggerBehavior001 : Window\n{\n    public DataTriggerBehavior001()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/DataTriggerBehaviorTests.DataTriggerBehavior_001.Linux.verified.txt",
    "content": "﻿{\n  Type: DataTriggerBehavior001,\n  Title: DataTriggerBehavior001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBlock,\n        Text: More than 50,\n        Name: TargetTextBlock\n      },\n      {\n        Type: TextBox,\n        Text: 75,\n        Name: TargetTextBox\n      },\n      {\n        Type: Slider,\n        Minimum: 0.0,\n        Maximum: 100.0,\n        Value: 75.0,\n        SmallChange: 25.0,\n        Name: TargetSlider\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/DataTriggerBehaviorTests.DataTriggerBehavior_001.OSX.verified.txt",
    "content": "﻿{\n  Type: DataTriggerBehavior001,\n  Title: DataTriggerBehavior001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBlock,\n        Text: More than 50,\n        Name: TargetTextBlock\n      },\n      {\n        Type: TextBox,\n        Text: 75,\n        Name: TargetTextBox\n      },\n      {\n        Type: Slider,\n        Minimum: 0.0,\n        Maximum: 100.0,\n        Value: 75.0,\n        SmallChange: 25.0,\n        Name: TargetSlider\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/DataTriggerBehaviorTests.DataTriggerBehavior_001.Windows.verified.txt",
    "content": "﻿{\n  Type: DataTriggerBehavior001,\n  Title: DataTriggerBehavior001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBlock,\n        Text: More than 50,\n        Name: TargetTextBlock\n      },\n      {\n        Type: TextBox,\n        Text: 75,\n        Name: TargetTextBox\n      },\n      {\n        Type: Slider,\n        Minimum: 0.0,\n        Maximum: 100.0,\n        Value: 75.0,\n        SmallChange: 25.0,\n        Name: TargetSlider\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/DataTriggerBehaviorTests.cs",
    "content": "using System.Threading.Tasks;\nusing Avalonia.Headless;\nusing Avalonia.Headless.XUnit;\nusing Avalonia.Input;\nusing VerifyXunit;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\n[UsesVerify]\npublic class DataTriggerBehaviorTests\n{\n    [AvaloniaFact]\n    public Task DataTriggerBehavior_001()\n    {\n        var window = new DataTriggerBehavior001();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"DataTriggerBehavior_001_0.png\");\n\n        Assert.Equal(\"Less than or equal 50\", window.TargetTextBlock.Text);\n        Assert.Equal(\"0\", window.TargetTextBox.Text);\n        Assert.Equal(0d, window.TargetSlider.Value);\n\n        window.TargetSlider.Focus();\n        window.KeyPressQwerty(PhysicalKey.ArrowRight, RawInputModifiers.None);\n        window.KeyPressQwerty(PhysicalKey.ArrowRight, RawInputModifiers.None);\n        window.KeyPressQwerty(PhysicalKey.ArrowRight, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"DataTriggerBehavior_001_1.png\");\n\n        Assert.Equal(\"More than 50\", window.TargetTextBlock.Text);\n        Assert.Equal(\"75\", window.TargetTextBox.Text);\n        Assert.Equal(75d, window.TargetSlider.Value);\n        return Verifier.Verify(window);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior001.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.EventTriggerBehavior001\"\n        Title=\"EventTriggerBehavior001\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <ChangePropertyAction TargetObject=\"TargetTextBox\"\n                                PropertyName=\"Text\"\n                                Value=\"Click Text\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior001.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class EventTriggerBehavior001 : Window\n{\n    public EventTriggerBehavior001()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior002.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.EventTriggerBehavior002\"\n        Title=\"EventTriggerBehavior002\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Tapped\">\n          <ChangePropertyAction TargetObject=\"TargetTextBox\"\n                                PropertyName=\"Text\"\n                                Value=\"Tapped Text\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior002.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class EventTriggerBehavior002 : Window\n{\n    public EventTriggerBehavior002()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior003.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.EventTriggerBehavior003\"\n        Title=\"EventTriggerBehavior003\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"DoubleTapped\">\n          <ChangePropertyAction TargetObject=\"TargetTextBox\"\n                                PropertyName=\"Text\"\n                                Value=\"DoubleTapped Text\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior003.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class EventTriggerBehavior003 : Window\n{\n    public EventTriggerBehavior003()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior004.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.EventTriggerBehavior004\"\n        Title=\"EventTriggerBehavior004\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Loaded\">\n          <ChangePropertyAction TargetObject=\"TargetTextBox\"\n                                PropertyName=\"Text\"\n                                Value=\"Loaded Text\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehavior004.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class EventTriggerBehavior004 : Window\n{\n    public EventTriggerBehavior004()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_001.Linux.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior001,\n  Title: EventTriggerBehavior001,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Click Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_001.OSX.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior001,\n  Title: EventTriggerBehavior001,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Click Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_001.Windows.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior001,\n  Title: EventTriggerBehavior001,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Click Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_002.Linux.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior002,\n  Title: EventTriggerBehavior002,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Tapped Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_002.OSX.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior002,\n  Title: EventTriggerBehavior002,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Tapped Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_002.Windows.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior002,\n  Title: EventTriggerBehavior002,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Tapped Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_003.Linux.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior003,\n  Title: EventTriggerBehavior003,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: DoubleTapped Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_003.OSX.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior003,\n  Title: EventTriggerBehavior003,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: DoubleTapped Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_003.Windows.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior003,\n  Title: EventTriggerBehavior003,\n  PointerOverElement: {\n    Type: AccessText,\n    Text: Button\n  },\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: DoubleTapped Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_004.Linux.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior004,\n  Title: EventTriggerBehavior004,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Loaded Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_004.OSX.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior004,\n  Title: EventTriggerBehavior004,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Loaded Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.EventTriggerBehavior_004.Windows.verified.txt",
    "content": "﻿{\n  Type: EventTriggerBehavior004,\n  Title: EventTriggerBehavior004,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Loaded Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/EventTriggerBehaviorTests.cs",
    "content": "using System.Threading.Tasks;\nusing Avalonia.Headless;\nusing Avalonia.Headless.XUnit;\nusing VerifyXunit;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\n[UsesVerify]\npublic class EventTriggerBehaviorTests\n{\n    [AvaloniaFact]\n    public Task EventTriggerBehavior_001()\n    {\n        var window = new EventTriggerBehavior001();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"EventTriggerBehavior_001_0.png\");\n\n        window.Click(window.TargetButton);\n\n        window.CaptureRenderedFrame()?.Save(\"EventTriggerBehavior_001_1.png\");\n\n        Assert.Equal(\"Click Text\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n\n    [AvaloniaFact]\n    public Task EventTriggerBehavior_002()\n    {\n        var window = new EventTriggerBehavior002();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"EventTriggerBehavior_002_0.png\");\n\n        window.Click(window.TargetButton);\n\n        window.CaptureRenderedFrame()?.Save(\"EventTriggerBehavior_002_1.png\");\n\n        Assert.Equal(\"Tapped Text\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n\n    [AvaloniaFact]\n    public Task EventTriggerBehavior_003()\n    {\n        var window = new EventTriggerBehavior003();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"EventTriggerBehavior_003_0.png\");\n\n        window.Click(window.TargetButton);\n        window.Click(window.TargetButton);\n\n        window.CaptureRenderedFrame()?.Save(\"EventTriggerBehavior_003_1.png\");\n\n        Assert.Equal(\"DoubleTapped Text\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n\n    [AvaloniaFact]\n    public Task EventTriggerBehavior_004()\n    {\n        var window = new EventTriggerBehavior004();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"EventTriggerBehavior_004_0.png\");\n\n        Assert.Equal(\"Loaded Text\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction001.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.InvokeCommandAction001\"\n        Title=\"InvokeCommandAction001\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <InvokeCommandAction Command=\"{Binding TestCommand}\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction001.axaml.cs",
    "content": "﻿using System.Windows.Input;\nusing Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class InvokeCommandAction001 : Window\n{\n    public ICommand TestCommand { get; set; }\n\n    public InvokeCommandAction001()\n    {\n        InitializeComponent();\n\n        TestCommand = new Command(_ =>\n        {\n            TargetTextBox.Text = \"Command Text\";\n        });\n\n        DataContext = this;\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction002.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.InvokeCommandAction002\"\n        Title=\"InvokeCommandAction002\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <InvokeCommandAction Command=\"{Binding TestCommand}\"\n                               CommandParameter=\"Param\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction002.axaml.cs",
    "content": "﻿using System.Windows.Input;\nusing Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class InvokeCommandAction002 : Window\n{\n    public ICommand TestCommand { get; set; }\n\n    public InvokeCommandAction002()\n    {\n        InitializeComponent();\n\n        TestCommand = new Command(parameter =>\n        {\n            TargetTextBox.Text = $\"Command {parameter}\";\n        });\n\n        DataContext = this;\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction003.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.InvokeCommandAction003\"\n        xmlns:local=\"clr-namespace:Avalonia.Xaml.Interactions.UnitTests.Core\"\n        Title=\"InvokeCommandAction003\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <InvokeCommandAction Command=\"{Binding TestCommand}\"\n                               InputConverter=\"{x:Static local:TestValueConverter.Instance}\"\n                               InputConverterParameter=\"{x:Null}\"\n                               InputConverterLanguage=\"en-US\"/>\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction003.axaml.cs",
    "content": "﻿using System.Windows.Input;\nusing Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class InvokeCommandAction003 : Window\n{\n    public ICommand TestCommand { get; set; }\n\n    public InvokeCommandAction003()\n    {\n        InitializeComponent();\n\n        TestCommand = new Command(parameter =>\n        {\n            TargetTextBox.Text = $\"Command {parameter}\";\n        });\n\n        DataContext = this;\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction004.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        x:Class=\"Avalonia.Xaml.Interactions.UnitTests.Core.InvokeCommandAction004\"\n        Title=\"InvokeCommandAction004\">\n  <StackPanel>\n    <TextBox Name=\"TargetTextBox\" \n             Text=\"Initial Text\" />\n    <Button Name=\"TargetButton\" Content=\"Button\">\n      <Interaction.Behaviors>\n        <EventTriggerBehavior EventName=\"Click\">\n          <InvokeCommandAction Command=\"{Binding TestCommand}\"\n                               PassEventArgsToCommand=\"True\" />\n        </EventTriggerBehavior>\n      </Interaction.Behaviors>\n    </Button>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandAction004.axaml.cs",
    "content": "﻿using System.Windows.Input;\nusing Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\npublic partial class InvokeCommandAction004 : Window\n{\n    public ICommand TestCommand { get; set; }\n\n    public InvokeCommandAction004()\n    {\n        InitializeComponent();\n\n        TestCommand = new Command(parameter =>\n        {\n            TargetTextBox.Text = $\"{parameter?.GetType().Name}\";\n        });\n\n        DataContext = this;\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_001.Linux.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction001,\n  Title: InvokeCommandAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_001.OSX.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction001,\n  Title: InvokeCommandAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_001.Windows.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction001,\n  Title: InvokeCommandAction001,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Text,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_002.Linux.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction002,\n  Title: InvokeCommandAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Param,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_002.OSX.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction002,\n  Title: InvokeCommandAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Param,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_002.Windows.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction002,\n  Title: InvokeCommandAction002,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Param,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_003.Linux.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction003,\n  Title: InvokeCommandAction003,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Button,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_003.OSX.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction003,\n  Title: InvokeCommandAction003,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Button,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_003.Windows.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction003,\n  Title: InvokeCommandAction003,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: Command Button,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_004.Linux.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction004,\n  Title: InvokeCommandAction004,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: RoutedEventArgs,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_004.OSX.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction004,\n  Title: InvokeCommandAction004,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: RoutedEventArgs,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.InvokeCommandAction_004.Windows.verified.txt",
    "content": "﻿{\n  Type: InvokeCommandAction004,\n  Title: InvokeCommandAction004,\n  Content: {\n    Type: StackPanel,\n    Children: [\n      {\n        Type: TextBox,\n        Text: RoutedEventArgs,\n        Name: TargetTextBox\n      },\n      {\n        Type: Button,\n        Content: Button,\n        Name: TargetButton\n      }\n    ]\n  },\n  IsVisible: true\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/InvokeCommandActionTests.cs",
    "content": "using System.Threading.Tasks;\nusing Avalonia.Controls;\nusing Avalonia.Headless;\nusing Avalonia.Headless.XUnit;\nusing Avalonia.Input;\nusing Avalonia.Interactivity;\nusing VerifyXunit;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\n[UsesVerify]\npublic class InvokeCommandActionTests\n{\n    [AvaloniaFact]\n    public Task InvokeCommandAction_001()\n    {\n        var window = new InvokeCommandAction001();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_001_0.png\");\n\n        Assert.Equal(\"Initial Text\", window.TargetTextBox.Text);\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_001_1.png\");\n\n        Assert.Equal(\"Command Text\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n\n    [AvaloniaFact]\n    public Task InvokeCommandAction_002()\n    {\n        var window = new InvokeCommandAction002();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_002_0.png\");\n\n        Assert.Equal(\"Initial Text\", window.TargetTextBox.Text);\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_002_1.png\");\n\n        Assert.Equal(\"Command Param\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n\n    [AvaloniaFact]\n    public Task InvokeCommandAction_003()\n    {\n        var window = new InvokeCommandAction003();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_003_0.png\");\n\n        Assert.Equal(\"Initial Text\", window.TargetTextBox.Text);\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_003_1.png\");\n\n        Assert.Equal($\"Command {nameof(Button)}\", window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n\n    [AvaloniaFact]\n    public Task InvokeCommandAction_004()\n    {\n        var window = new InvokeCommandAction004();\n\n        window.Show();\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_004_0.png\");\n\n        Assert.Equal(\"Initial Text\", window.TargetTextBox.Text);\n\n        // Click\n        window.TargetButton.Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        window.CaptureRenderedFrame()?.Save(\"InvokeCommandAction_004_1.png\");\n\n        Assert.Equal(nameof(RoutedEventArgs), window.TargetTextBox.Text);\n        return Verifier.Verify(window);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Core/TestValueConverter.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing Avalonia.Data.Converters;\nusing Avalonia.Interactivity;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests.Core;\n\ninternal class TestValueConverter : IValueConverter\n{\n    public static readonly TestValueConverter Instance = new ();\n\n    public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)\n    {\n        if (value is RoutedEventArgs args)\n        {\n            return args.Source?.GetType().Name;\n        }\n\n        throw new ArgumentException(\"Invalid value type\");\n    }\n\n    public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)\n    {\n        throw new NotImplementedException();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/HeadlessWindowExtensions.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Headless;\nusing Avalonia.Input;\n\nnamespace Avalonia.Xaml.Interactions.UnitTests;\n\n/// <summary>\n/// Set of extension methods to simplify usage of Avalonia.Headless platform.\n/// </summary>\ninternal static class HeadlessWindowExtensions\n{\n    /// <summary>\n    /// Simulates click on the headless window/toplevel.\n    /// </summary>\n    public static void Click(\n        this TopLevel topLevel, \n        Control relativeTo, \n        MouseButton button = MouseButton.Left, \n        RawInputModifiers modifiers = RawInputModifiers.None)\n    {\n        var point = new Point(relativeTo.Bounds.Width / 2, relativeTo.Bounds.Height / 2);\n        var translatePoint = relativeTo.TranslatePoint(point, topLevel);\n        if (translatePoint is not null)\n        {\n            topLevel.MouseDown(translatePoint.Value, button, modifiers);\n            topLevel.MouseUp(translatePoint.Value, button, modifiers);\n        }\n    }\n\n    /// <summary>\n    /// Simulates mouse down on the headless window/toplevel.\n    /// </summary>\n    public static void MouseDown(\n        this TopLevel topLevel, \n        Control relativeTo, \n        Point point, \n        MouseButton button, \n        RawInputModifiers modifiers = RawInputModifiers.None)\n    {\n        var translatePoint = relativeTo.TranslatePoint(point, topLevel);\n        if (translatePoint is not null)\n        {\n            topLevel.MouseDown(translatePoint.Value, button, modifiers);\n        }\n    }\n\n    /// <summary>\n    /// Simulates mouse move on the headless window/toplevel.\n    /// </summary>\n    public static void MouseMove(\n        this TopLevel topLevel, \n        Control relativeTo, \n        Point point,\n        RawInputModifiers modifiers = RawInputModifiers.None)\n    {\n        var translatePoint = relativeTo.TranslatePoint(point, topLevel);\n        if (translatePoint is not null)\n        {\n            topLevel.MouseMove(translatePoint.Value, modifiers);\n        }\n    }\n\n    /// <summary>\n    /// Simulates mouse up on the headless window/toplevel.\n    /// </summary>\n    public static void MouseUp(\n        this TopLevel topLevel, \n        Control relativeTo, \n        Point point, \n        MouseButton button,\n        RawInputModifiers modifiers = RawInputModifiers.None)\n    {\n        var translatePoint = relativeTo.TranslatePoint(point, topLevel);\n        if (translatePoint is not null)\n        {\n            topLevel.MouseUp(translatePoint.Value, button, modifiers);\n        }\n    }\n\n    /// <summary>\n    /// Simulates mouse wheel on the headless window/toplevel.\n    /// </summary>\n    public static void MouseWheel(\n        this TopLevel topLevel, \n        Control relativeTo, \n        Point point, \n        Vector delta,\n        RawInputModifiers modifiers = RawInputModifiers.None)\n    {\n        var translatePoint = relativeTo.TranslatePoint(point, topLevel);\n        if (translatePoint is not null)\n        {\n            topLevel.MouseWheel(translatePoint.Value, delta, modifiers);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/ModuleInit.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing VerifyTests;\n\npublic static class ModuleInit\n{\n    [ModuleInitializer]\n    public static void InitOther()\n    {\n        VerifierSettings.InitializePlugins();\n        VerifyImageMagick.RegisterComparers(0.04);\n        VerifierSettings.UniqueForOSPlatform();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing Xunit;\n\n[assembly: AssemblyTitle(\"Avalonia.Xaml.Interactions.UnitTests\")]\n\n[assembly: CollectionBehavior(DisableTestParallelization = true)]\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactions.UnitTests/TestAppBuilder.cs",
    "content": "﻿using Avalonia.Headless;\nusing Avalonia.Xaml.Interactions.UnitTests;\n\n[assembly: AvaloniaTestApplication(typeof(TestAppBuilder))]\n\nnamespace Avalonia.Xaml.Interactions.UnitTests;\n\npublic class TestAppBuilder\n{\n    public static AppBuilder BuildAvaloniaApp()\n    {\n        return AppBuilder\n            .Configure<App>()\n            .UseSkia()\n            .UseHeadless(new AvaloniaHeadlessPlatformOptions { UseHeadlessDrawing = false });\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             x:Class=\"Avalonia.Xaml.Interactivity.UnitTests.App\">\n  <Application.Styles>\n    <FluentTheme />\n    <Style Selector=\"Window\">\n      <Setter Property=\"FontFamily\" Value=\"resm:Avalonia.Xaml.Interactivity.UnitTests.Assets?assembly=Avalonia.Xaml.Interactivity.UnitTests#Noto Mono\" />\n    </Style>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/App.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\nusing Avalonia;\n\npublic class App : Application\n{\n    public override void Initialize()\n    {\n        AvaloniaXamlLoader.Load(this);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/Avalonia.Xaml.Interactivity.UnitTests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\" ToolsVersion=\"15.0\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <OutputType>Library</OutputType>\n    <GenerateAssemblyInfo>False</GenerateAssemblyInfo>\n    <GenerateRuntimeConfigurationFiles>True</GenerateRuntimeConfigurationFiles>\n    <IsPackable>False</IsPackable>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" />\n    <PackageReference Include=\"Avalonia.Desktop\" />\n    <PackageReference Include=\"Avalonia.Themes.Fluent\" />\n    <PackageReference Include=\"Avalonia.Fonts.Inter\" />\n    <PackageReference Include=\"Avalonia.Headless.XUnit\" />\n  </ItemGroup>\n\n  <Import Project=\"..\\..\\build\\XUnit.props\" />\n\n  <ItemGroup>\n    <EmbeddedResource Include=\"..\\Avalonia.Xaml.Interactions.UnitTests\\*\\*.ttf\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactions\\Avalonia.Xaml.Interactions.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\Avalonia.Xaml.Interactivity\\Avalonia.Xaml.Interactivity.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/BehaviorCollectionTemplate001.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:generic=\"clr-namespace:System.Collections.Generic;assembly=System.Collections\"\n        xmlns:system=\"clr-namespace:System;assembly=System.Runtime\"\n        x:Class=\"Avalonia.Xaml.Interactivity.UnitTests.BehaviorCollectionTemplate001\"\n        Title=\"BehaviorCollectionTemplate001\">\n  <Window.Resources>\n    <SolidColorBrush x:Key=\"RedBrush\" Color=\"Red\" />\n  </Window.Resources>\n  <Window.Styles>\n    <Style Selector=\"ListBox.red > ListBoxItem\">\n      <Setter Property=\"(Interaction.Behaviors)\">\n        <BehaviorCollectionTemplate>\n          <BehaviorCollection>\n            <EventTriggerBehavior EventName=\"KeyDown\">\n              <ChangePropertyAction PropertyName=\"Background\" \n                                    Value=\"{StaticResource RedBrush}\" />\n            </EventTriggerBehavior>\n          </BehaviorCollection>\n        </BehaviorCollectionTemplate>\n      </Setter>\n    </Style>\n  </Window.Styles>\n  <ListBox Name=\"TargetListBox\"\n           Classes=\"red\">\n    <ListBox.ItemsSource>\n      <generic:List x:TypeArguments=\"x:String\">\n        <system:String>Item1</system:String>\n        <system:String>Item2</system:String>\n        <system:String>Item3</system:String>\n      </generic:List>\n    </ListBox.ItemsSource>\n  </ListBox>\n</Window>\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/BehaviorCollectionTemplate001.axaml.cs",
    "content": "﻿using Avalonia.Controls;\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic partial class BehaviorCollectionTemplate001 : Window\n{\n    public BehaviorCollectionTemplate001()\n    {\n        InitializeComponent();\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/BehaviorCollectionTemplateTests.cs",
    "content": "using System.Linq;\nusing Avalonia.Controls;\nusing Avalonia.Headless;\nusing Avalonia.Headless.XUnit;\nusing Avalonia.Input;\nusing Avalonia.Media;\nusing Avalonia.Media.Immutable;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class BehaviorCollectionTemplateTests\n{\n    [AvaloniaFact]\n    public void BehaviorCollectionTemplate_001()\n    {\n        var window = new BehaviorCollectionTemplate001();\n\n        window.Show();\n\n        var containers = window.TargetListBox.GetRealizedContainers().Cast<ListBoxItem>().ToList();\n\n        var behavior0 = containers[0].GetValue(Interaction.BehaviorsProperty);\n        Assert.NotNull(behavior0);\n        Assert.Single(behavior0);\n        Assert.Equal(containers[0], behavior0!.AssociatedObject);\n\n        var behavior1 = containers[1].GetValue(Interaction.BehaviorsProperty);\n        Assert.NotNull(behavior1);\n        Assert.Single(behavior1);\n        Assert.Equal(containers[1], behavior1!.AssociatedObject);\n\n        var behavior2 = containers[2].GetValue(Interaction.BehaviorsProperty);\n        Assert.NotNull(behavior2);\n        Assert.Single(behavior2);\n        Assert.Equal(containers[2], behavior2!.AssociatedObject);\n\n        Assert.Equal(containers[0].Background, Brushes.Transparent);\n        Assert.Equal(containers[1].Background, Brushes.Transparent);\n        Assert.Equal(containers[2].Background, Brushes.Transparent);\n\n        // KeyDown\n        containers[0].Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        Assert.Equal(window.Resources[\"RedBrush\"], containers[0].Background);\n\n        // KeyDown\n        containers[1].Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        Assert.Equal(window.Resources[\"RedBrush\"], containers[1].Background);\n\n        // KeyDown\n        containers[2].Focus();\n        window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);\n\n        Assert.Equal(window.Resources[\"RedBrush\"], containers[2].Background);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/BehaviorCollectionTest.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Headless.XUnit;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class BehaviorCollectionTest\n{\n    [AvaloniaFact]\n    public void VectorChanged_NonBehaviorAdded_ExceptionThrown()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Add(new StubBehavior());\n\n        TestUtilities.AssertThrowsInvalidOperationException(() => behaviorCollection.Add(new TextBlock()));\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_BehaviorChangedToNonBehavior_ExceptionThrown()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Add(new StubBehavior());\n            \n        TestUtilities.AssertThrowsInvalidOperationException(() => behaviorCollection[0] = new ToggleButton());\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_DuplicateAdd_ExceptionThrown()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        var stub = new StubBehavior();\n        behaviorCollection.Add(stub);\n\n        TestUtilities.AssertThrowsInvalidOperationException(() => behaviorCollection.Add(stub));\n\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_AddWhileNotAttached_AttachNotCalled()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        var stub = new StubBehavior();\n        behaviorCollection.Add(stub);\n\n        TestUtilities.AssertNotAttached(stub);\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_AddWhileAttached_AllAttached()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Attach(new Button());\n\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n\n        foreach (StubBehavior stub in behaviorCollection)\n        {\n            TestUtilities.AssertAttached(stub, behaviorCollection.AssociatedObject);\n        }\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_ReplaceWhileAttached_OldDetachedNewAttached()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Attach(new Button());\n\n        var first = new StubBehavior();\n        behaviorCollection.Add(first);\n\n        var second = new StubBehavior();\n\n        behaviorCollection[0] = second;\n\n        TestUtilities.AssertDetached(first);\n\n        TestUtilities.AssertAttached(second, behaviorCollection.AssociatedObject);\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_RemoveWhileNotAttached_DetachNotCalled()\n    {\n        var behaviorCollection = new BehaviorCollection();\n\n        var behavior = new StubBehavior();\n        behaviorCollection.Add(behavior);\n        behaviorCollection.Remove(behavior);\n\n        TestUtilities.AssertNotDetached(behavior);\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_RemoveWhileAttached_Detached()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Attach(new ToggleButton());\n\n        var behavior = new StubBehavior();\n        behaviorCollection.Add(behavior);\n        behaviorCollection.Remove(behavior);\n\n        TestUtilities.AssertDetached(behavior);\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_ResetWhileNotAttached_DetachNotCalled()\n    {\n        StubBehavior[] behaviorArray = { new StubBehavior(), new StubBehavior(), new StubBehavior() };\n\n        var behaviorCollection = new BehaviorCollection();\n        foreach (var behavior in behaviorArray)\n        {\n            behaviorCollection.Add(behavior);\n        }\n\n        behaviorCollection.Clear();\n\n        foreach (var behavior in behaviorArray)\n        {\n            TestUtilities.AssertNotDetached(behavior);\n        }\n    }\n\n    [AvaloniaFact]\n    public void VectorChanged_ResetWhileAttached_AllDetached()\n    {\n        StubBehavior[] behaviorArray = { new StubBehavior(), new StubBehavior(), new StubBehavior() };\n\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Attach(new Button());\n\n        foreach (var behavior in behaviorArray)\n        {\n            behaviorCollection.Add(behavior);\n        }\n\n        behaviorCollection.Clear();\n\n        foreach (var behavior in behaviorArray)\n        {\n            TestUtilities.AssertDetached(behavior);\n        }\n    }\n\n    [AvaloniaFact]\n    public void Attach_MultipleBehaviors_AllAttached()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n\n        var button = new Button();\n        behaviorCollection.Attach(button);\n             \n        Assert.Equal(button, behaviorCollection.AssociatedObject); // \"Attach should set the AssociatedObject to the given parameter.\"\n\n        foreach (StubBehavior stub in behaviorCollection)\n        {\n            TestUtilities.AssertAttached(stub, button);\n        }\n    }\n\n    [AvaloniaFact]\n    public void Attach_Null_AttachNotCalledOnItems()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n\n        behaviorCollection.Attach(null);\n\n        foreach (StubBehavior stub in behaviorCollection)\n        {\n            TestUtilities.AssertNotAttached(stub);\n        }\n    }\n\n    [AvaloniaFact]\n    public void Attach_MultipleObjects_ExceptionThrown()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        var stub = new StubBehavior();\n        behaviorCollection.Attach(new Button());\n\n        TestUtilities.AssertThrowsInvalidOperationException(() => behaviorCollection.Attach(new StackPanel()));\n    }\n\n    [AvaloniaFact]\n    public void Attach_NonNullThenNull_ExceptionThrown()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Add(new StubBehavior());\n\n        behaviorCollection.Attach(new Button());\n\n        TestUtilities.AssertThrowsInvalidOperationException(() => behaviorCollection.Attach(null));\n    }\n\n    [AvaloniaFact]\n    public void Attach_MultipleTimeSameObject_AttachCalledOnce()\n    {\n        var behaviorCollection = new BehaviorCollection() { new StubBehavior() };\n\n        var button = new Button();\n        behaviorCollection.Attach(button);\n        behaviorCollection.Attach(button);\n\n        // This method hard codes AttachCount == 1.\n        TestUtilities.AssertAttached((StubBehavior)behaviorCollection[0], button);\n    }\n\n    [AvaloniaFact]\n    public void Detach_NotAttached_DetachNotCalledOnItems()\n    {\n        var behaviorCollection = new BehaviorCollection() { new StubBehavior() };\n\n        behaviorCollection.Detach();\n\n        TestUtilities.AssertNotDetached((StubBehavior)behaviorCollection[0]);\n    }\n\n    [AvaloniaFact]\n    public void Detach_Attached_AllItemsDetached()\n    {\n        var behaviorCollection = new BehaviorCollection();\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n        behaviorCollection.Add(new StubBehavior());\n\n        behaviorCollection.Attach(new Button());\n        behaviorCollection.Detach();\n\n        Assert.Null(behaviorCollection.AssociatedObject); // \"The AssociatedObject should be null after Detach.\"\n\n        foreach (StubBehavior behavior in behaviorCollection)\n        {\n            TestUtilities.AssertDetached(behavior);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/BehaviorOfTTests.cs",
    "content": "namespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class BehaviorOfTTests\n{\n    // TODO:\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/BehaviorTests.cs",
    "content": "namespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class BehaviorTests\n{\n    // TODO:\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/InteractionTest.cs",
    "content": "﻿using System.Linq;\nusing Avalonia.Controls;\nusing Avalonia.Headless.XUnit;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class InteractionTest\n{\n    [AvaloniaFact]\n    public void SetBehaviors_MultipleBehaviors_AllAttached()\n    {\n        var behaviorCollection = new BehaviorCollection\n        {\n            new StubBehavior(),\n            new StubBehavior(),\n            new StubBehavior()\n        };\n\n        var button = new Button();\n        Interaction.SetBehaviors(button, behaviorCollection);\n\n        foreach (StubBehavior behavior in behaviorCollection)\n        {\n            Assert.Equal(1, behavior.AttachCount); // \"Should only have called Attach once.\"\n            Assert.Equal(0, behavior.DetachCount); // \"Should not have called Detach.\"\n            Assert.Equal(button, behavior.AssociatedObject); // \"Should be attached to the host of the BehaviorCollection.\"\n        }\n    }\n\n    [AvaloniaFact]\n    public void SetBehaviors_MultipleSets_DoesNotReattach()\n    {\n        var behaviorCollection = new BehaviorCollection() { new StubBehavior() };\n\n        var button = new Button();\n        Interaction.SetBehaviors(button, behaviorCollection);\n        Interaction.SetBehaviors(button, behaviorCollection);\n\n        foreach (StubBehavior behavior in behaviorCollection)\n        {\n            Assert.Equal(1, behavior.AttachCount); // \"Should only have called Attach once.\"\n        }\n    }\n\n    [AvaloniaFact]\n    public void SetBehaviors_CollectionThenNull_DeatchCollection()\n    {\n        var behaviorCollection = new BehaviorCollection() { new StubBehavior() };\n\n        var button = new Button();\n        Interaction.SetBehaviors(button, behaviorCollection);\n        Interaction.SetBehaviors(button, null);\n\n        foreach (StubBehavior behavior in behaviorCollection)\n        {\n            Assert.Equal(1, behavior.DetachCount); // \"Should only have called Detach once.\"\n            Assert.Null(behavior.AssociatedObject); // \"AssociatedObject should be null after Detach.\"\n        }\n    }\n\n    [AvaloniaFact]\n    public void SetBehaviors_NullThenNull_NoOp()\n    {\n        // As long as this doesn't crash/assert, we're good.\n\n        var button = new Button();\n        Interaction.SetBehaviors(button, null);\n        Interaction.SetBehaviors(button, null);\n        Interaction.SetBehaviors(button, null);\n    }\n\n    [AvaloniaFact]\n    public void SetBehaviors_ManualDetachThenNull_DoesNotDoubleDetach()\n    {\n        var behaviorCollection = new BehaviorCollection\n        {\n            new StubBehavior(),\n            new StubBehavior(),\n            new StubBehavior()\n        };\n\n        var button = new Button();\n        Interaction.SetBehaviors(button, behaviorCollection);\n\n        foreach (StubBehavior behavior in behaviorCollection)\n        {\n            behavior.Detach();\n        }\n\n        Interaction.SetBehaviors(button, null);\n\n        foreach (StubBehavior behavior in behaviorCollection)\n        {\n            Assert.Equal(1, behavior.DetachCount); // \"Setting BehaviorCollection to null should not call Detach on already Detached Behaviors.\"\n            Assert.Null(behavior.AssociatedObject); // \"AssociatedObject should be null after Detach.\"\n        }\n    }\n\n    [AvaloniaFact]\n    public void ExecuteActions_NullParameters_ReturnsEmptyEnumerable()\n    {\n        // Mostly just want to test that this doesn't throw any exceptions.\n        var result = Interaction.ExecuteActions(null, null, null);\n\n        Assert.NotNull(result);\n        Assert.Empty(result); // \"Calling ExecuteActions with a null ActionCollection should return an empty enumerable.\"\n    }\n\n    [AvaloniaFact]\n    public void ExecuteActions_MultipleActions_AllActionsExecuted()\n    {\n        var actions = new ActionCollection\n        {\n            new StubAction(),\n            new StubAction(),\n            new StubAction()\n        };\n\n        var sender = new Button();\n        var parameterString = \"TestString\";\n\n        Interaction.ExecuteActions(sender, actions, parameterString);\n\n        foreach (StubAction action in actions)\n        {\n            Assert.Equal(1, action.ExecuteCount); // \"Each IAction should be executed once.\"\n            Assert.Equal(sender, action.Sender); // \"Sender is passed to the actions.\"\n            Assert.Equal(parameterString, action.Parameter); // \"Parameter is passed to the actions.\"\n        }\n    }\n\n    [AvaloniaFact]\n    public void ExecuteActions_ActionsWithResults_ResultsInActionOrder()\n    {\n        string[] expectedReturnValues = { \"A\", \"B\", \"C\" };\n\n        var actions = new ActionCollection();\n\n        foreach (var returnValue in expectedReturnValues)\n        {\n            actions.Add(new StubAction(returnValue));\n        }\n\n        var results = Interaction.ExecuteActions(null, actions, null).ToList();\n\n        Assert.Equal(expectedReturnValues.Length, results.Count); // \"Should have the same number of results as IActions.\"\n\n        for (var resultIndex = 0; resultIndex < results.Count; resultIndex++)\n        {\n            Assert.Equal(expectedReturnValues[resultIndex], results[resultIndex]); // \"Results should be returned in the order of the actions in the ActionCollection.\"\n        }\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/InteractionTests.cs",
    "content": "namespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class InteractionTests\n{\n    // TODO:\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing Xunit;\n\n[assembly: AssemblyTitle(\"Avalonia.Xaml.Interactivity.UnitTests\")]\n\n[assembly: CollectionBehavior(DisableTestParallelization = true)]\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/StubAction.cs",
    "content": "﻿namespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class StubAction(object? returnValue) : AvaloniaObject, IAction\n{\n    public StubAction() : this(null)\n    {\n    }\n\n    public object? Sender\n    {\n        get;\n        private set;\n    }\n\n    public object? Parameter\n    {\n        get;\n        private set;\n    }\n\n    public int ExecuteCount\n    {\n        get;\n        private set;\n    }\n\n    public object? Execute(object? sender, object? parameter)\n    {\n        ExecuteCount++;\n        Sender = sender;\n        Parameter = parameter;\n        return returnValue;\n    }\n}"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/StubBehavior.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class StubBehavior : AvaloniaObject, IBehavior\n{\n    public int AttachCount\n    {\n        get;\n        private set;\n    }\n\n    public int DetachCount\n    {\n        get;\n        private set;\n    }\n\n    public ActionCollection Actions { get; private set; } = new();\n\n    public AvaloniaObject? AssociatedObject\n    {\n        get;\n        private set;\n    }\n\n    public void Attach(AvaloniaObject? avaloniaObject)\n    {\n        AssociatedObject = avaloniaObject;\n        AttachCount++;\n    }\n\n    public void Detach()\n    {\n        AssociatedObject = null;\n        DetachCount++;\n    }\n\n    public IEnumerable<object> Execute(object? sender, object parameter)\n    {\n        return Interaction.ExecuteActions(sender, Actions, parameter);\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/TestAppBuilder.cs",
    "content": "﻿using Avalonia.Headless;\nusing Avalonia.Xaml.Interactivity.UnitTests;\n\n[assembly: AvaloniaTestApplication(typeof(TestAppBuilder))]\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class TestAppBuilder\n{\n    public static AppBuilder BuildAvaloniaApp()\n    {\n        return AppBuilder\n            .Configure<App>()\n            .UseSkia()\n            .UseHeadless(new AvaloniaHeadlessPlatformOptions { UseHeadlessDrawing = false });\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/TestUitilties.cs",
    "content": "﻿using System;\nusing Xunit;\n\nnamespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic static class TestUtilities\n{\n    /// <summary>\n    /// Handles the difference between InvalidOperationException in managed and native.\n    /// </summary>\n    public static void AssertThrowsInvalidOperationException(Action action)\n    {\n        Assert.Throws<InvalidOperationException>(action);\n    }\n\n    public static void AssertThrowsArgumentException(Action action)\n    {\n        Assert.Throws<ArgumentException>(action);\n    }\n\n    public static void AssertDetached(StubBehavior behavior)\n    {\n        Assert.Equal(1, behavior.DetachCount); // \"The Behavior should be detached.\"\n        Assert.Null(behavior.AssociatedObject); // \"A Detached Behavior should have a null AssociatedObject.\"\n    }\n\n    public static void AssertNotDetached(StubBehavior behavior)\n    {\n        Assert.Equal(0, behavior.DetachCount); // \"The Behavior should not be detached.\"\n    }\n\n    public static void AssertAttached(StubBehavior behavior, AvaloniaObject? associatedObject)\n    {\n        Assert.Equal(1, behavior.AttachCount); // \"The behavior should be attached.\"\n        Assert.Equal(associatedObject, behavior.AssociatedObject); // \"The AssociatedObject of the Behavior should be what it was attached to.\"\n    }\n\n    public static void AssertNotAttached(StubBehavior behavior)\n    {\n        Assert.Equal(0, behavior.AttachCount); // \"The behavior should not be attached.\"\n        Assert.Null(behavior.AssociatedObject); // \"The AssociatedObject should be null for a non-attached Behavior.\"\n    }\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/TriggerOfTTests.cs",
    "content": "namespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class TriggerOfTTests\n{\n    // TODO:\n}\n"
  },
  {
    "path": "tests/Avalonia.Xaml.Interactivity.UnitTests/TriggerTests.cs",
    "content": "namespace Avalonia.Xaml.Interactivity.UnitTests;\n\npublic class TriggerTests\n{\n    // TODO:\n}\n"
  },
  {
    "path": "tests/Directory.Packages.props",
    "content": "﻿<Project>\n  <PropertyGroup>\n    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n    <AvaloniaVersion>11.0.10</AvaloniaVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageVersion Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Desktop\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Diagnostics\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.ReactiveUI\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Themes.Fluent\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Fonts.Inter\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Browser\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Avalonia.Headless.XUnit\" Version=\"$(AvaloniaVersion)\" />\n    <PackageVersion Include=\"Verify.Avalonia\" Version=\"1.0.1\" />\n    <PackageVersion Include=\"Verify.DiffPlex\" Version=\"2.2.1\" />\n    <PackageVersion Include=\"Verify.ImageMagick\" Version=\"3.2.2\" />\n    <PackageVersion Include=\"Verify.Xunit\" Version=\"20.8.2\" />\n    <PackageVersion Include=\"xunit\" Version=\"2.5.0\" />\n    <PackageVersion Include=\"xunit.abstractions\" Version=\"2.0.3\" />\n    <PackageVersion Include=\"xunit.assert\" Version=\"2.5.0\" />\n    <PackageVersion Include=\"xunit.core\" Version=\"2.5.0\" />\n    <PackageVersion Include=\"xunit.extensibility.core\" Version=\"2.5.0\" />\n    <PackageVersion Include=\"xunit.extensibility.execution\" Version=\"2.5.0\" />\n    <PackageVersion Include=\"xunit.runner.console\" Version=\"2.5.0\" />\n    <PackageVersion Include=\"xunit.runner.visualstudio\" Version=\"2.5.0\" />\n    <PackageVersion Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.2.0\" />\n  </ItemGroup>\n</Project>\n"
  }
]