From cbb10c4ace012a7c4bbc7460288ece73febb6580 Mon Sep 17 00:00:00 2001 From: David Oliver Date: Wed, 22 May 2019 14:22:34 -0400 Subject: [PATCH 01/13] [Android] Add conditionals --- src/CalcManager/CCalcManager.h | 4 ++-- src/CalcManager/CalculatorManager.cpp | 2 +- src/CalcManager/CalculatorVector.h | 2 +- src/CalcManager/compat.h | 2 +- src/CalcManager/pch.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/CalcManager/CCalcManager.h b/src/CalcManager/CCalcManager.h index 7af758a3..80f574f8 100644 --- a/src/CalcManager/CCalcManager.h +++ b/src/CalcManager/CCalcManager.h @@ -41,8 +41,8 @@ struct CalculatorManager_CreateParams GetCEngineStringFunc GetCEngineString; }; -#if defined(__EMSCRIPTEN__) || defined(__APPLE__) -#define DLL_EXPORT +#if defined(__EMSCRIPTEN__) || defined(__APPLE__) || defined(__ANDROID__) +#define DLL_EXPORT #else #define DLL_EXPORT __declspec(dllexport) #endif diff --git a/src/CalcManager/CalculatorManager.cpp b/src/CalcManager/CalculatorManager.cpp index c30cad2a..27735a60 100644 --- a/src/CalcManager/CalculatorManager.cpp +++ b/src/CalcManager/CalculatorManager.cpp @@ -14,7 +14,7 @@ static constexpr size_t SERIALIZED_NUMBER_MINSIZE = 3; // Converts Memory Command enum value to unsigned char, // while ignoring Warning C4309: 'conversion' : truncation of constant value -#if defined(__EMSCRIPTEN__) || defined(__APPLE__) +#if defined(__EMSCRIPTEN__) || defined(__APPLE__) || defined(__ANDROID__) #define MEMORY_COMMAND_TO_UNSIGNED_CHAR(c) static_cast(c) #else #define MEMORY_COMMAND_TO_UNSIGNED_CHAR(c) __pragma(warning(push)) __pragma(warning(disable : 4309)) static_cast(c) __pragma(warning(pop)) diff --git a/src/CalcManager/CalculatorVector.h b/src/CalcManager/CalculatorVector.h index ed9f213c..cf75a80b 100644 --- a/src/CalcManager/CalculatorVector.h +++ b/src/CalcManager/CalculatorVector.h @@ -10,7 +10,7 @@ #include "Ratpack/CalcErr.h" #include // for std::out_of_range -#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) +#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) && !defined(__ANDROID__) #include #include // for SAL #endif diff --git a/src/CalcManager/compat.h b/src/CalcManager/compat.h index 7ffeec1a..74920e4f 100644 --- a/src/CalcManager/compat.h +++ b/src/CalcManager/compat.h @@ -1,6 +1,6 @@ #pragma once -#if defined(__EMSCRIPTEN__) || defined(__APPLE__) +#if defined(__EMSCRIPTEN__) || defined(__APPLE__) || defined(__ANDROID__) #define HRESULT long #define _In_opt_ diff --git a/src/CalcManager/pch.h b/src/CalcManager/pch.h index cab9e5f7..4abe2ad9 100644 --- a/src/CalcManager/pch.h +++ b/src/CalcManager/pch.h @@ -18,7 +18,7 @@ #include #include -#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) +#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) && !defined(__ANDROID__) #include #include #include From 16d853e7a917afb021201085861f8a92a775ff8b Mon Sep 17 00:00:00 2001 From: David Oliver Date: Wed, 22 May 2019 14:39:26 -0400 Subject: [PATCH 02/13] Add CalcManager Android project --- .../CalcManager.Android.vcxproj | 164 ++++++++++++++++++ .../CalcManager.Android.vcxproj.filters | 10 ++ .../CalcManager_Android.cpp | 40 +++++ src/CalcManager.Android/CalcManager_Android.h | 10 ++ src/CalcManager.Android/pch.h | 8 + src/Calculator.sln | 2 + 6 files changed, 234 insertions(+) create mode 100644 src/CalcManager.Android/CalcManager.Android.vcxproj create mode 100644 src/CalcManager.Android/CalcManager.Android.vcxproj.filters create mode 100644 src/CalcManager.Android/CalcManager_Android.cpp create mode 100644 src/CalcManager.Android/CalcManager_Android.h create mode 100644 src/CalcManager.Android/pch.h diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj b/src/CalcManager.Android/CalcManager.Android.vcxproj new file mode 100644 index 00000000..2b0959d8 --- /dev/null +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj @@ -0,0 +1,164 @@ + + + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + Debug + x64 + + + Release + x64 + + + Debug + x86 + + + Release + x86 + + + + {08a1283c-522b-4820-8c56-361638a82e24} + Android + CalcManager_Android + 14.0 + Android + 3.0 + + + + DynamicLibrary + true + Clang_5_0 + + + DynamicLibrary + false + Clang_5_0 + + + DynamicLibrary + true + Clang_5_0 + + + DynamicLibrary + false + Clang_5_0 + + + DynamicLibrary + true + Clang_5_0 + + + DynamicLibrary + false + Clang_5_0 + + + DynamicLibrary + true + Clang_5_0 + + + DynamicLibrary + false + Clang_5_0 + + + + + + + + + + + + + + + + + + + + + + + + + Use + pch.h + + + + + Use + pch.h + + + + + Use + pch.h + + + + + Use + pch.h + + + + + Use + pch.h + + + + + Use + pch.h + + + + + Use + pch.h + + + + + Use + pch.h + + + + + + + + + + + + \ No newline at end of file diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj.filters b/src/CalcManager.Android/CalcManager.Android.vcxproj.filters new file mode 100644 index 00000000..b786da89 --- /dev/null +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj.filters @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/CalcManager.Android/CalcManager_Android.cpp b/src/CalcManager.Android/CalcManager_Android.cpp new file mode 100644 index 00000000..8ffe8b1b --- /dev/null +++ b/src/CalcManager.Android/CalcManager_Android.cpp @@ -0,0 +1,40 @@ +#include "CalcManager_Android.h" + +#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "CalcManager_Android", __VA_ARGS__)) +#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "CalcManager_Android", __VA_ARGS__)) + +extern "C" { + /* This trivial function returns the platform ABI for which this dynamic native library is compiled.*/ + const char * CalcManager_Android::getPlatformABI() + { + #if defined(__arm__) + #if defined(__ARM_ARCH_7A__) + #if defined(__ARM_NEON__) + #define ABI "armeabi-v7a/NEON" + #else + #define ABI "armeabi-v7a" + #endif + #else + #define ABI "armeabi" + #endif + #elif defined(__i386__) + #define ABI "x86" + #else + #define ABI "unknown" + #endif + LOGI("This dynamic shared library is compiled with ABI: %s", ABI); + return "This native library is compiled with ABI: %s" ABI "."; + } + + void CalcManager_Android() + { + } + + CalcManager_Android::CalcManager_Android() + { + } + + CalcManager_Android::~CalcManager_Android() + { + } +} diff --git a/src/CalcManager.Android/CalcManager_Android.h b/src/CalcManager.Android/CalcManager_Android.h new file mode 100644 index 00000000..14ab82a0 --- /dev/null +++ b/src/CalcManager.Android/CalcManager_Android.h @@ -0,0 +1,10 @@ +#pragma once + +class CalcManager_Android +{ +public: + const char * getPlatformABI(); + CalcManager_Android(); + ~CalcManager_Android(); +}; + diff --git a/src/CalcManager.Android/pch.h b/src/CalcManager.Android/pch.h new file mode 100644 index 00000000..bd99043a --- /dev/null +++ b/src/CalcManager.Android/pch.h @@ -0,0 +1,8 @@ +#include +#include + +#include +#include +#include + +#include diff --git a/src/Calculator.sln b/src/Calculator.sln index a998d314..22a92176 100644 --- a/src/Calculator.sln +++ b/src/Calculator.sln @@ -24,6 +24,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Calculator.UWP", "Calculato EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Calculator.Wasm", "Calculator.Wasm\Calculator.Wasm.csproj", "{53337466-6E79-45F3-A650-1BFB93CC19B0}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CalcManager.Android", "CalcManager.Android\CalcManager.Android.vcxproj", "{08A1283C-522B-4820-8C56-361638A82E24}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution Calculator.Shared\Calculator.Shared.projitems*{093428d1-ab83-4f1a-93e9-304b44a24d1f}*SharedItemsImports = 4 From 185ec7ff1162b5d01983918a99b60f655d18d27f Mon Sep 17 00:00:00 2001 From: David Oliver Date: Wed, 22 May 2019 14:42:15 -0400 Subject: [PATCH 03/13] [Android] CalcManager - include files --- .../CalcManager.Android.vcxproj | 65 +++++++- .../CalcManager.Android.vcxproj.filters | 146 +++++++++++++++++- .../CalcManager_Android.cpp | 40 ----- src/CalcManager.Android/CalcManager_Android.h | 10 -- src/CalcManager.Android/pch.h | 8 - 5 files changed, 201 insertions(+), 68 deletions(-) delete mode 100644 src/CalcManager.Android/CalcManager_Android.cpp delete mode 100644 src/CalcManager.Android/CalcManager_Android.h delete mode 100644 src/CalcManager.Android/pch.h diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj b/src/CalcManager.Android/CalcManager.Android.vcxproj index 2b0959d8..78eb10bc 100644 --- a/src/CalcManager.Android/CalcManager.Android.vcxproj +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj @@ -34,6 +34,64 @@ x86 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {08a1283c-522b-4820-8c56-361638a82e24} Android @@ -152,13 +210,6 @@ pch.h - - - - - - - \ No newline at end of file diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj.filters b/src/CalcManager.Android/CalcManager.Android.vcxproj.filters index b786da89..ed56f71d 100644 --- a/src/CalcManager.Android/CalcManager.Android.vcxproj.filters +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj.filters @@ -1,10 +1,150 @@  - + + {8b6920ee-f524-4a48-837a-dba211bd5f7f} + + + {628c5935-02b4-4f8a-b4f4-3850e24c8e36} + + + {d346c535-3d9b-4cbf-a41e-b89243f563c0} + - - + + + + + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + CEngine + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + RatPack + + + + + + + + + + + + + + + headers + + + headers + + + headers + + + headers + + + headers + + + headers + + + headers + + + headers + + + headers + + + headers + + + headers + + + headers + + + RatPack + + + RatPack + + + RatPack + \ No newline at end of file diff --git a/src/CalcManager.Android/CalcManager_Android.cpp b/src/CalcManager.Android/CalcManager_Android.cpp deleted file mode 100644 index 8ffe8b1b..00000000 --- a/src/CalcManager.Android/CalcManager_Android.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "CalcManager_Android.h" - -#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "CalcManager_Android", __VA_ARGS__)) -#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "CalcManager_Android", __VA_ARGS__)) - -extern "C" { - /* This trivial function returns the platform ABI for which this dynamic native library is compiled.*/ - const char * CalcManager_Android::getPlatformABI() - { - #if defined(__arm__) - #if defined(__ARM_ARCH_7A__) - #if defined(__ARM_NEON__) - #define ABI "armeabi-v7a/NEON" - #else - #define ABI "armeabi-v7a" - #endif - #else - #define ABI "armeabi" - #endif - #elif defined(__i386__) - #define ABI "x86" - #else - #define ABI "unknown" - #endif - LOGI("This dynamic shared library is compiled with ABI: %s", ABI); - return "This native library is compiled with ABI: %s" ABI "."; - } - - void CalcManager_Android() - { - } - - CalcManager_Android::CalcManager_Android() - { - } - - CalcManager_Android::~CalcManager_Android() - { - } -} diff --git a/src/CalcManager.Android/CalcManager_Android.h b/src/CalcManager.Android/CalcManager_Android.h deleted file mode 100644 index 14ab82a0..00000000 --- a/src/CalcManager.Android/CalcManager_Android.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -class CalcManager_Android -{ -public: - const char * getPlatformABI(); - CalcManager_Android(); - ~CalcManager_Android(); -}; - diff --git a/src/CalcManager.Android/pch.h b/src/CalcManager.Android/pch.h deleted file mode 100644 index bd99043a..00000000 --- a/src/CalcManager.Android/pch.h +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include - -#include -#include -#include - -#include From 1645a2b6c4094d647a9c1aacf7723f93e50ff806 Mon Sep 17 00:00:00 2001 From: David Oliver Date: Wed, 22 May 2019 15:12:16 -0400 Subject: [PATCH 04/13] [Android] Fixes for CalcManager to build --- .../CalcManager.Android.vcxproj | 64 ++++++++++++++++--- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj b/src/CalcManager.Android/CalcManager.Android.vcxproj index 78eb10bc..94449fbf 100644 --- a/src/CalcManager.Android/CalcManager.Android.vcxproj +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj @@ -165,50 +165,98 @@ Use - pch.h + ..\CalcManager\pch.h + Enabled + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + + false + Use - pch.h + ..\CalcManager\pch.h + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + Enabled + + false + Use - pch.h + ..\CalcManager\pch.h + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + Enabled + + false + Use - pch.h + ..\CalcManager\pch.h + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + Enabled + + false + Use - pch.h + ..\CalcManager\pch.h + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + Enabled + + false + Use - pch.h + ..\CalcManager\pch.h + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + Enabled + + false + Use - pch.h + ..\CalcManager\pch.h + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + Enabled + + false + Use - pch.h + ..\CalcManager\pch.h + c++1z + $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) + Enabled + + false + From aad5768f6d1c3cb59c8cd9f072812d40ac02e6b5 Mon Sep 17 00:00:00 2001 From: David Oliver Date: Thu, 23 May 2019 14:11:51 -0400 Subject: [PATCH 05/13] More CalcManager.Android fixes - target API 21 (Lollipop) - include math library - reenable error on unresolved symbols (otherwise will fail at runtime) --- .../CalcManager.Android.vcxproj | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj b/src/CalcManager.Android/CalcManager.Android.vcxproj index 94449fbf..b0969679 100644 --- a/src/CalcManager.Android/CalcManager.Android.vcxproj +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj @@ -105,6 +105,7 @@ DynamicLibrary true Clang_5_0 + android-21 DynamicLibrary @@ -115,11 +116,13 @@ DynamicLibrary true Clang_5_0 + android-21 DynamicLibrary false Clang_5_0 + android-21 DynamicLibrary @@ -135,11 +138,13 @@ DynamicLibrary true Clang_5_0 + android-21 DynamicLibrary false Clang_5_0 + android-21 @@ -171,7 +176,8 @@ $(StlIncludeDirectories);$(Sysroot)\usr\include;$(Sysroot)\usr\include\$(AndroidHeaderTriple);$(VS_NdkRoot)\sources\android\support\include;$(SolutionDir).\CalcManager\;%(AdditionalIncludeDirectories) - false + true + -lm @@ -183,7 +189,8 @@ Enabled - false + true + -lm @@ -195,7 +202,8 @@ Enabled - false + true + -lm @@ -207,7 +215,8 @@ Enabled - false + true + -lm @@ -219,7 +228,8 @@ Enabled - false + true + -lm @@ -231,7 +241,8 @@ Enabled - false + true + -lm @@ -243,7 +254,8 @@ Enabled - false + true + -lm @@ -255,7 +267,8 @@ Enabled - false + true + -lm From a56916ade1699414a561a52d18fd08c8407d267c Mon Sep 17 00:00:00 2001 From: David Oliver Date: Thu, 23 May 2019 14:13:15 -0400 Subject: [PATCH 06/13] [Android] Reference CalcManager from app head --- src/Calculator.Droid/Calculator.Droid.csproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Calculator.Droid/Calculator.Droid.csproj b/src/Calculator.Droid/Calculator.Droid.csproj index 39066a19..0e1b6656 100644 --- a/src/Calculator.Droid/Calculator.Droid.csproj +++ b/src/Calculator.Droid/Calculator.Droid.csproj @@ -83,6 +83,14 @@ + + + {08a1283c-522b-4820-8c56-361638a82e24} + CalcManager.Android + Android + false + + - \ No newline at end of file + diff --git a/src/Calculator.Droid/Properties/AndroidManifest.xml b/src/Calculator.Droid/Properties/AndroidManifest.xml index f789a779..590aa4a3 100644 --- a/src/Calculator.Droid/Properties/AndroidManifest.xml +++ b/src/Calculator.Droid/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - - + + \ No newline at end of file diff --git a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs index f636b9cd..b1cf2f04 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs @@ -73,7 +73,7 @@ namespace CalculationManager public static extern void CalculatorManager_UpdateMaxIntDigits(IntPtr nativeManager); [DllImport(DllPath)] - public static extern char CalculatorManager_DecimalSeparator(IntPtr nativeManager); + public static extern IntPtr CalculatorManager_DecimalSeparator(IntPtr nativeManager); [DllImport(DllPath)] public static extern bool CalculatorManager_RemoveHistoryItem(IntPtr nativeManager, int uIdx); diff --git a/src/Calculator.Shared/CalcManager/CalculatorManager.cs b/src/Calculator.Shared/CalcManager/CalculatorManager.cs index cfc919c8..2704e87a 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorManager.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorManager.cs @@ -4,6 +4,7 @@ using CalculatorApp; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Runtime.InteropServices; using System.Text; @@ -217,7 +218,10 @@ namespace CalculationManager => NativeDispatch.CalculatorManager_UpdateMaxIntDigits(_nativeManager); public char DecimalSeparator() - => NativeDispatch.CalculatorManager_DecimalSeparator(_nativeManager); + { + var pString = NativeDispatch.CalculatorManager_DecimalSeparator(_nativeManager); + return NativeDispatch.PtrToString(pString).FirstOrDefault(); + } public List GetHistoryItems() { diff --git a/src/Calculator.Shared/Controls/CalculationResult.cs b/src/Calculator.Shared/Controls/CalculationResult.cs index e2357a09..11f5b406 100644 --- a/src/Calculator.Shared/Controls/CalculationResult.cs +++ b/src/Calculator.Shared/Controls/CalculationResult.cs @@ -131,7 +131,7 @@ namespace CalculatorApp public static readonly DependencyProperty IsOperatorCommandProperty = DependencyProperty.Register("IsOperatorCommand", typeof(bool), typeof(CalculationResult), new PropertyMetadata(false)); - public event SelectedEventHandler Selected; + public event SelectedEventHandler ValueSelected; private Windows.UI.Xaml.Controls.ScrollViewer m_textContainer; @@ -532,7 +532,7 @@ namespace CalculatorApp void RaiseSelectedEvent() { - Selected?.Invoke(this); + ValueSelected?.Invoke(this); } }; } diff --git a/src/Calculator.Shared/Views/UnitConverter.xaml b/src/Calculator.Shared/Views/UnitConverter.xaml index 03ad7a16..8af21067 100644 --- a/src/Calculator.Shared/Views/UnitConverter.xaml +++ b/src/Calculator.Shared/Views/UnitConverter.xaml @@ -504,7 +504,7 @@ FlowDirection="{x:Bind LayoutDirection}" IsActive="{Binding Value1Active, Mode=TwoWay}" KeyDown="OnValueKeyDown" - Selected="OnValueSelected" + ValueSelected="OnValueSelected" TabIndex="1"/>