├── .gitignore ├── LICENSE ├── README.md ├── README_zh.md ├── VControl.sln ├── docs ├── assets │ ├── banner.png │ ├── banner.pptx │ ├── image-1.png │ ├── image-10.png │ ├── image-100.png │ ├── image-101.png │ ├── image-102.png │ ├── image-103.png │ ├── image-11.png │ ├── image-12.png │ ├── image-13.png │ ├── image-14.png │ ├── image-15.png │ ├── image-16.png │ ├── image-17.png │ ├── image-18.png │ ├── image-19.png │ ├── image-2.png │ ├── image-20.png │ ├── image-21.png │ ├── image-22.png │ ├── image-23.png │ ├── image-24.png │ ├── image-25.png │ ├── image-26.png │ ├── image-27.png │ ├── image-28.png │ ├── image-29.png │ ├── image-3.png │ ├── image-30.png │ ├── image-31.png │ ├── image-32.png │ ├── image-33.png │ ├── image-34.png │ ├── image-35.png │ ├── image-36.png │ ├── image-37.png │ ├── image-38.png │ ├── image-39.png │ ├── image-4.png │ ├── image-40.png │ ├── image-41.png │ ├── image-42.png │ ├── image-43.png │ ├── image-44.png │ ├── image-45.png │ ├── image-46.png │ ├── image-47.png │ ├── image-48.png │ ├── image-49.png │ ├── image-5.png │ ├── image-50.png │ ├── image-51.png │ ├── image-52.png │ ├── image-53.png │ ├── image-54.png │ ├── image-55.png │ ├── image-56.png │ ├── image-57.png │ ├── image-58.png │ ├── image-59.png │ ├── image-6.png │ ├── image-60.png │ ├── image-61.png │ ├── image-62.png │ ├── image-63.png │ ├── image-64.png │ ├── image-65.png │ ├── image-66.png │ ├── image-67.png │ ├── image-68.png │ ├── image-69.png │ ├── image-7.png │ ├── image-70.png │ ├── image-71.png │ ├── image-72.png │ ├── image-73.png │ ├── image-74.png │ ├── image-75.png │ ├── image-76.png │ ├── image-77.png │ ├── image-78.png │ ├── image-79.png │ ├── image-8.png │ ├── image-80.png │ ├── image-81.png │ ├── image-82.png │ ├── image-83.png │ ├── image-84.png │ ├── image-85.png │ ├── image-86.png │ ├── image-87.png │ ├── image-88.png │ ├── image-89.png │ ├── image-9.png │ ├── image-90.png │ ├── image-91.png │ ├── image-92.png │ ├── image-93.png │ ├── image-94.png │ ├── image-95.png │ ├── image-96.png │ ├── image-97.png │ ├── image-98.png │ ├── image-99.png │ ├── image.png │ ├── recording-1.gif │ ├── recording-1.png │ ├── recording-10.gif │ ├── recording-11.gif │ ├── recording-12.gif │ ├── recording-13.gif │ ├── recording-14.gif │ ├── recording-15.gif │ ├── recording-16.gif │ ├── recording-17.gif │ ├── recording-18.gif │ ├── recording-19.gif │ ├── recording-2.gif │ ├── recording-2.png │ ├── recording-20.gif │ ├── recording-21.gif │ ├── recording-22.gif │ ├── recording-23.gif │ ├── recording-24.gif │ ├── recording-25.gif │ ├── recording-26.gif │ ├── recording-27.gif │ ├── recording-28.gif │ ├── recording-29.gif │ ├── recording-3.gif │ ├── recording-3.png │ ├── recording-30.gif │ ├── recording-31.gif │ ├── recording-32.gif │ ├── recording-4.gif │ ├── recording-5.gif │ ├── recording-6.gif │ ├── recording-7.gif │ ├── recording-8.gif │ ├── recording-9.gif │ ├── recording.gif │ └── recording.png ├── colors-en.md ├── colors.md ├── global-styles-en.md ├── global-styles.md ├── icons-en.md ├── icons.md ├── markdown_to_docx.py ├── starter-en.md ├── starter.md ├── v-button-en.md ├── v-button.md ├── v-checkable-collection-en.md ├── v-checkable-collection.md ├── v-checkbox-button-en.md ├── v-checkbox-button.md ├── v-checkbox-en.md ├── v-checkbox-group-en.md ├── v-checkbox-group.md ├── v-checkbox.md ├── v-collection-en.md ├── v-collection.md ├── v-datepicker-en.md ├── v-datepicker.md ├── v-entry-en.md ├── v-entry.md ├── v-expander-en.md ├── v-expander.md ├── v-form-item-en.md ├── v-form-item.md ├── v-menu-cell-en.md ├── v-menu-cell.md ├── v-number-entry-en.md ├── v-number-entry.md ├── v-picker-en.md ├── v-picker.md ├── v-placeholder-view-en.md ├── v-placeholder-view.md ├── v-radiobutton-group-en.md ├── v-radiobutton-group.md ├── v-rich-text-editor-en.md ├── v-rich-text-editor.md ├── v-searchbar-en.md ├── v-searchbar.md ├── v-tag-picker-en.md ├── v-tag-picker.md ├── v-timeline-en.md ├── v-timeline.md ├── v-validating-entry-en.md ├── v-validating-entry.md ├── v-validating-picker-en.md └── v-validating-picker.md ├── samples └── src │ ├── App.xaml │ ├── App.xaml.cs │ ├── AppShell.xaml │ ├── AppShell.xaml.cs │ ├── Behaviors │ └── TriggerPopupBehavior.cs │ ├── Common │ ├── CommonHelper.cs │ ├── ITriggerPopupPage.cs │ ├── LoggedInUserChangedMessage.cs │ └── PopupSize.cs │ ├── Extensions │ └── DictionaryExtensions.cs │ ├── GlobalUsings.cs │ ├── MauiProgram.cs │ ├── Models │ ├── HomeViewItem.cs │ └── PickerM.cs │ ├── Navigation │ ├── INavigationService.cs │ └── MauiNavigationService.cs │ ├── Platforms │ ├── Android │ │ ├── AndroidManifest.xml │ │ ├── MainActivity.cs │ │ ├── MainApplication.cs │ │ └── Resources │ │ │ └── values │ │ │ ├── colors.xml │ │ │ └── strings.xml │ ├── MacCatalyst │ │ ├── AppDelegate.cs │ │ ├── Info.plist │ │ ├── Program.cs │ │ └── SaveMac.cs │ ├── Tizen │ │ ├── Main.cs │ │ └── tizen-manifest.xml │ ├── Windows │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── Package.appxmanifest │ │ ├── SaveWindows.cs │ │ └── app.manifest │ └── iOS │ │ ├── AppDelegate.cs │ │ ├── Info.plist │ │ ├── PrivacyInfo.xcprivacy │ │ └── Program.cs │ ├── Properties │ ├── Resources.Designer.cs │ ├── Resources.resx │ └── launchSettings.json │ ├── Resources │ ├── AppIcon │ │ ├── appicon.svg │ │ └── appiconfg.svg │ ├── Fonts │ │ ├── OpenSans-Regular.ttf │ │ └── OpenSans-Semibold.ttf │ ├── Images │ │ ├── aze.png │ │ ├── doc.png │ │ ├── download.png │ │ ├── food.jpg │ │ ├── ics.png │ │ ├── ppt.png │ │ ├── service3.jpg │ │ ├── sketch.png │ │ ├── tab_account.svg │ │ ├── tab_home.svg │ │ └── xls.png │ ├── Raw │ │ └── AboutAssets.txt │ └── Splash │ │ ├── logo.svg │ │ └── splash.svg │ ├── VControl.Samples.csproj │ ├── ViewModels │ ├── Base │ │ ├── EditPopupViewModelBase.cs │ │ ├── IPopupViewModelBase.cs │ │ ├── IViewModelBase.cs │ │ ├── ObservableCollectionExt.cs │ │ ├── PopupViewModelBase.cs │ │ └── ViewModelBase.cs │ ├── BaseViewModel.cs │ ├── EmailCheckableCollectionModel.cs │ ├── IDraggableViewModel.cs │ ├── IPopupContainerViewModelBase.cs │ ├── ISearchViewModel.cs │ ├── Others │ │ ├── ColorsPageViewModel.cs │ │ ├── HomeViewModel.cs │ │ ├── IconsPageViewModel.cs │ │ └── StyleSamplesViewModel.cs │ ├── VButtonViewModel.cs │ ├── VCardViewModel.cs │ ├── VCheckBoxButtonViewModel.cs │ ├── VCheckBoxGroupViewModel.cs │ ├── VCheckBoxViewModel.cs │ ├── VCheckableCollectionViewModel.cs │ ├── VCollectionViewModel.cs │ ├── VDateNativePickerViewModel.cs │ ├── VDatePickerViewModel.cs │ ├── VEditorViewModel.cs │ ├── VEntryViewModel.cs │ ├── VExpanderViewModel.cs │ ├── VFormItemViewModel.cs │ ├── VIndicatorViewModel.cs │ ├── VMenuCellViewModel.cs │ ├── VNumberEntryViewModel.cs │ ├── VPickerViewModel.cs │ ├── VPlaceholderViewViewModel.cs │ ├── VRadioButtonGroupViewModel.cs │ ├── VRadioButtonViewModel.cs │ ├── VRichTextEditorViewModel.cs │ ├── VSearchBarViewModel.cs │ ├── VTagPickerViewModel.cs │ ├── VTimeLineViewModel.cs │ ├── VTopAppBarAnimationWithScrollerView.cs │ ├── VTopAppBarViewModel.cs │ ├── VTouchContentViewViewModel.cs │ ├── VUploaderViewModel.cs │ ├── VValidatingEntryViewModel.cs │ └── VValidatingPickerViewModel.cs │ └── Views │ ├── Base │ ├── ContentPageBase.cs │ └── PopupContentPageBase.cs │ ├── Others │ ├── ColorsPage.xaml │ ├── ColorsPage.xaml.cs │ ├── HomePage.xaml │ ├── HomePage.xaml.cs │ ├── IconsPage.xaml │ ├── IconsPage.xaml.cs │ ├── StyleSamplesPage.xaml │ └── StyleSamplesPage.xaml.cs │ ├── VButtonView.xaml │ ├── VButtonView.xaml.cs │ ├── VCardView.xaml │ ├── VCardView.xaml.cs │ ├── VCheckBoxButtonView.xaml │ ├── VCheckBoxButtonView.xaml.cs │ ├── VCheckBoxGroupView.xaml │ ├── VCheckBoxGroupView.xaml.cs │ ├── VCheckBoxView.xaml │ ├── VCheckBoxView.xaml.cs │ ├── VCheckableCollectionView.xaml │ ├── VCheckableCollectionView.xaml.cs │ ├── VCollectionView.xaml │ ├── VCollectionView.xaml.cs │ ├── VDateNativePickerView.xaml │ ├── VDateNativePickerView.xaml.cs │ ├── VDatePickerView.xaml │ ├── VDatePickerView.xaml.cs │ ├── VEditorView.xaml │ ├── VEditorView.xaml.cs │ ├── VEntryView.xaml │ ├── VEntryView.xaml.cs │ ├── VExpanderView.xaml │ ├── VExpanderView.xaml.cs │ ├── VFormItemView.xaml │ ├── VFormItemView.xaml.cs │ ├── VIndicatorView.xaml │ ├── VIndicatorView.xaml.cs │ ├── VMenuCellView.xaml │ ├── VMenuCellView.xaml.cs │ ├── VNumberEntryView.xaml │ ├── VNumberEntryView.xaml.cs │ ├── VPickerView.xaml │ ├── VPickerView.xaml.cs │ ├── VPlaceholderViewView.xaml │ ├── VPlaceholderViewView.xaml.cs │ ├── VRadioButtonGroupView.xaml │ ├── VRadioButtonGroupView.xaml.cs │ ├── VRadioButtonView.xaml │ ├── VRadioButtonView.xaml.cs │ ├── VRichTextEditorView.xaml │ ├── VRichTextEditorView.xaml.cs │ ├── VSearchBarView.xaml │ ├── VSearchBarView.xaml.cs │ ├── VTagPickerView.xaml │ ├── VTagPickerView.xaml.cs │ ├── VTimeLineView.xaml │ ├── VTimeLineView.xaml.cs │ ├── VTopAppBarAnimationWithScrollerView.xaml │ ├── VTopAppBarAnimationWithScrollerView.xaml.cs │ ├── VTopAppBarView.xaml │ ├── VTopAppBarView.xaml.cs │ ├── VTouchContentViewView.xaml │ ├── VTouchContentViewView.xaml.cs │ ├── VUploaderView.xaml │ ├── VUploaderView.xaml.cs │ ├── VValidatingEntryView.xaml │ ├── VValidatingEntryView.xaml.cs │ ├── VValidatingPickerView.xaml │ └── VValidatingPickerView.xaml.cs └── src ├── Controls ├── ItemWrapper │ ├── ItemWrapperBase.cs │ ├── VItemWrapper.cs │ └── VPickerItemWrapper.cs ├── TouchRecognizer │ ├── ITouchRecognizer.cs │ ├── Region.cs │ ├── TouchActionEventArgs.cs │ ├── TouchActionEventHandler.cs │ ├── TouchActionType.cs │ ├── TouchRecognizer.Android.cs │ └── TouchRecognizer.iOS.cs ├── VButton.xaml ├── VButton.xaml.cs ├── VButton │ ├── ButtonStyles.cs │ └── ButtonVisualState.cs ├── VCalendar │ ├── CalendarModel.cs │ ├── ChinaDateServer.cs │ └── DayModel.cs ├── VCalendarItem.xaml ├── VCalendarItem.xaml.cs ├── VCard.xaml ├── VCard.xaml.cs ├── VCheckBox.xaml ├── VCheckBox.xaml.cs ├── VCheckBoxButton.xaml ├── VCheckBoxButton.xaml.cs ├── VCheckBoxGroup.xaml ├── VCheckBoxGroup.xaml.cs ├── VCheckableCollection.xaml ├── VCheckableCollection.xaml.cs ├── VCollection.xaml ├── VCollection.xaml.cs ├── VCollectionExpandableItem.xaml ├── VCollectionExpandableItem.xaml.cs ├── VCollectionItem.xaml ├── VCollectionItem.xaml.cs ├── VDateNativePicker.xaml ├── VDateNativePicker.xaml.cs ├── VDatePicker.xaml ├── VDatePicker.xaml.cs ├── VEditor.xaml ├── VEditor.xaml.cs ├── VEntry.xaml ├── VEntry.xaml.cs ├── VExpandable │ ├── ExpandDirection.cs │ ├── ExpandedChangedEventArgs.cs │ ├── ExpanderAnimation.cs │ └── IExpanderAnimation.cs ├── VExpander.xaml ├── VExpander.xaml.cs ├── VFormItem.xaml ├── VFormItem.xaml.cs ├── VIndicator.xaml ├── VIndicator.xaml.cs ├── VMenuCell.xaml ├── VMenuCell.xaml.cs ├── VNumberEntry.xaml ├── VNumberEntry.xaml.cs ├── VPicker.xaml ├── VPicker.xaml.cs ├── VPlaceholderView.xaml ├── VPlaceholderView.xaml.cs ├── VRadioButton.xaml ├── VRadioButton.xaml.cs ├── VRadioButtonGroup.xaml ├── VRadioButtonGroup.xaml.cs ├── VRadioButtonGroup │ ├── IRadioButtonModel.cs │ ├── RadioButtonGroupDirection.cs │ └── RadioButtonModel.cs ├── VRichTextEditor.xaml ├── VRichTextEditor.xaml.cs ├── VRichTextEditor │ ├── HtmlEditor.cs │ ├── HtmlParser.Android.cs │ └── HtmlParser.iOS.cs ├── VSearchBar.xaml ├── VSearchBar.xaml.cs ├── VTagPicker.xaml ├── VTagPicker.xaml.cs ├── VTimeLine.xaml ├── VTimeLine.xaml.cs ├── VTimeLine │ ├── ITimeLineItemModel.cs │ ├── TimeLineItemModel.cs │ └── TimeLineItemType.cs ├── VTimeLineItem.xaml ├── VTimeLineItem.xaml.cs ├── VTopAppBar.xaml ├── VTopAppBar.xaml.cs ├── VTopAppBar │ └── VTopAppBarStyles.cs ├── VTouchContentView.cs ├── VUploader.xaml ├── VUploader.xaml.cs ├── VValidatingEntry.xaml ├── VValidatingEntry.xaml.cs ├── VValidatingPicker.xaml ├── VValidatingPicker.xaml.cs └── Validations │ ├── IValidatableObject.cs │ ├── IValidationRule.cs │ ├── IsEmailRule.cs │ ├── IsNotNullOrEmptyRule.cs │ ├── IsUserNameOrEmailRule.cs │ ├── LessThanRule.cs │ ├── MaxLenRule.cs │ ├── MinCountOfDigitRule.cs │ ├── MinCountOfUpperLetterRule.cs │ ├── MinLenRule.cs │ ├── MoreThanRule.cs │ ├── ValidatableObject.cs │ └── Validators.cs ├── Converters ├── FirstValidationErrorConverter.cs ├── InvertedBoolConverter.cs └── StringToInvisibleConverter.cs ├── Platforms ├── Android │ └── PlatformClass1.cs ├── MacCatalyst │ └── PlatformClass1.cs ├── Tizen │ └── PlatformClass1.cs ├── Windows │ └── PlatformClass1.cs └── iOS │ └── PlatformClass1.cs ├── Resources ├── Fonts │ ├── Font_Awesome_6_Brands-Regular-400.otf │ ├── Font_Awesome_6_Free-Regular-400.otf │ └── Font_Awesome_6_Free-Solid-900.otf ├── Images │ └── v_control_empty.svg └── Styles │ ├── VControlColors.xaml │ ├── VControlColors.xaml.cs │ ├── VControlConsts.xaml │ ├── VControlConsts.xaml.cs │ ├── VControlGlobalStyles.xaml │ ├── VControlGlobalStyles.xaml.cs │ ├── VControlTheme.xaml │ └── VControlTheme.xaml.cs ├── VControl.csproj └── VControlBuilderExtensions.cs /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 linxiao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /VControl.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.12.35527.113 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VControl", "src\VControl.csproj", "{6960E882-1E8A-4CF8-A602-001E5113665C}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VControl.Samples", "samples\src\VControl.Samples.csproj", "{69FDACC9-1012-4001-AD37-09ECC5E1C651}" 9 | EndProject 10 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{9697DD8C-E3A2-4C07-A028-6F9CC35F86B7}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {6960E882-1E8A-4CF8-A602-001E5113665C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {6960E882-1E8A-4CF8-A602-001E5113665C}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {6960E882-1E8A-4CF8-A602-001E5113665C}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {6960E882-1E8A-4CF8-A602-001E5113665C}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {69FDACC9-1012-4001-AD37-09ECC5E1C651}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {69FDACC9-1012-4001-AD37-09ECC5E1C651}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {69FDACC9-1012-4001-AD37-09ECC5E1C651}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 25 | {69FDACC9-1012-4001-AD37-09ECC5E1C651}.Release|Any CPU.ActiveCfg = Release|Any CPU 26 | {69FDACC9-1012-4001-AD37-09ECC5E1C651}.Release|Any CPU.Build.0 = Release|Any CPU 27 | {69FDACC9-1012-4001-AD37-09ECC5E1C651}.Release|Any CPU.Deploy.0 = Release|Any CPU 28 | EndGlobalSection 29 | GlobalSection(SolutionProperties) = preSolution 30 | HideSolutionNode = FALSE 31 | EndGlobalSection 32 | GlobalSection(NestedProjects) = preSolution 33 | {69FDACC9-1012-4001-AD37-09ECC5E1C651} = {9697DD8C-E3A2-4C07-A028-6F9CC35F86B7} 34 | EndGlobalSection 35 | EndGlobal 36 | -------------------------------------------------------------------------------- /docs/assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/banner.png -------------------------------------------------------------------------------- /docs/assets/banner.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/banner.pptx -------------------------------------------------------------------------------- /docs/assets/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-1.png -------------------------------------------------------------------------------- /docs/assets/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-10.png -------------------------------------------------------------------------------- /docs/assets/image-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-100.png -------------------------------------------------------------------------------- /docs/assets/image-101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-101.png -------------------------------------------------------------------------------- /docs/assets/image-102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-102.png -------------------------------------------------------------------------------- /docs/assets/image-103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-103.png -------------------------------------------------------------------------------- /docs/assets/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-11.png -------------------------------------------------------------------------------- /docs/assets/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-12.png -------------------------------------------------------------------------------- /docs/assets/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-13.png -------------------------------------------------------------------------------- /docs/assets/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-14.png -------------------------------------------------------------------------------- /docs/assets/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-15.png -------------------------------------------------------------------------------- /docs/assets/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-16.png -------------------------------------------------------------------------------- /docs/assets/image-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-17.png -------------------------------------------------------------------------------- /docs/assets/image-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-18.png -------------------------------------------------------------------------------- /docs/assets/image-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-19.png -------------------------------------------------------------------------------- /docs/assets/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-2.png -------------------------------------------------------------------------------- /docs/assets/image-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-20.png -------------------------------------------------------------------------------- /docs/assets/image-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-21.png -------------------------------------------------------------------------------- /docs/assets/image-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-22.png -------------------------------------------------------------------------------- /docs/assets/image-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-23.png -------------------------------------------------------------------------------- /docs/assets/image-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-24.png -------------------------------------------------------------------------------- /docs/assets/image-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-25.png -------------------------------------------------------------------------------- /docs/assets/image-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-26.png -------------------------------------------------------------------------------- /docs/assets/image-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-27.png -------------------------------------------------------------------------------- /docs/assets/image-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-28.png -------------------------------------------------------------------------------- /docs/assets/image-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-29.png -------------------------------------------------------------------------------- /docs/assets/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-3.png -------------------------------------------------------------------------------- /docs/assets/image-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-30.png -------------------------------------------------------------------------------- /docs/assets/image-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-31.png -------------------------------------------------------------------------------- /docs/assets/image-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-32.png -------------------------------------------------------------------------------- /docs/assets/image-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-33.png -------------------------------------------------------------------------------- /docs/assets/image-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-34.png -------------------------------------------------------------------------------- /docs/assets/image-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-35.png -------------------------------------------------------------------------------- /docs/assets/image-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-36.png -------------------------------------------------------------------------------- /docs/assets/image-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-37.png -------------------------------------------------------------------------------- /docs/assets/image-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-38.png -------------------------------------------------------------------------------- /docs/assets/image-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-39.png -------------------------------------------------------------------------------- /docs/assets/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-4.png -------------------------------------------------------------------------------- /docs/assets/image-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-40.png -------------------------------------------------------------------------------- /docs/assets/image-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-41.png -------------------------------------------------------------------------------- /docs/assets/image-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-42.png -------------------------------------------------------------------------------- /docs/assets/image-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-43.png -------------------------------------------------------------------------------- /docs/assets/image-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-44.png -------------------------------------------------------------------------------- /docs/assets/image-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-45.png -------------------------------------------------------------------------------- /docs/assets/image-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-46.png -------------------------------------------------------------------------------- /docs/assets/image-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-47.png -------------------------------------------------------------------------------- /docs/assets/image-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-48.png -------------------------------------------------------------------------------- /docs/assets/image-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-49.png -------------------------------------------------------------------------------- /docs/assets/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-5.png -------------------------------------------------------------------------------- /docs/assets/image-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-50.png -------------------------------------------------------------------------------- /docs/assets/image-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-51.png -------------------------------------------------------------------------------- /docs/assets/image-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-52.png -------------------------------------------------------------------------------- /docs/assets/image-53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-53.png -------------------------------------------------------------------------------- /docs/assets/image-54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-54.png -------------------------------------------------------------------------------- /docs/assets/image-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-55.png -------------------------------------------------------------------------------- /docs/assets/image-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-56.png -------------------------------------------------------------------------------- /docs/assets/image-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-57.png -------------------------------------------------------------------------------- /docs/assets/image-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-58.png -------------------------------------------------------------------------------- /docs/assets/image-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-59.png -------------------------------------------------------------------------------- /docs/assets/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-6.png -------------------------------------------------------------------------------- /docs/assets/image-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-60.png -------------------------------------------------------------------------------- /docs/assets/image-61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-61.png -------------------------------------------------------------------------------- /docs/assets/image-62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-62.png -------------------------------------------------------------------------------- /docs/assets/image-63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-63.png -------------------------------------------------------------------------------- /docs/assets/image-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-64.png -------------------------------------------------------------------------------- /docs/assets/image-65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-65.png -------------------------------------------------------------------------------- /docs/assets/image-66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-66.png -------------------------------------------------------------------------------- /docs/assets/image-67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-67.png -------------------------------------------------------------------------------- /docs/assets/image-68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-68.png -------------------------------------------------------------------------------- /docs/assets/image-69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-69.png -------------------------------------------------------------------------------- /docs/assets/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-7.png -------------------------------------------------------------------------------- /docs/assets/image-70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-70.png -------------------------------------------------------------------------------- /docs/assets/image-71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-71.png -------------------------------------------------------------------------------- /docs/assets/image-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-72.png -------------------------------------------------------------------------------- /docs/assets/image-73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-73.png -------------------------------------------------------------------------------- /docs/assets/image-74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-74.png -------------------------------------------------------------------------------- /docs/assets/image-75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-75.png -------------------------------------------------------------------------------- /docs/assets/image-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-76.png -------------------------------------------------------------------------------- /docs/assets/image-77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-77.png -------------------------------------------------------------------------------- /docs/assets/image-78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-78.png -------------------------------------------------------------------------------- /docs/assets/image-79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-79.png -------------------------------------------------------------------------------- /docs/assets/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-8.png -------------------------------------------------------------------------------- /docs/assets/image-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-80.png -------------------------------------------------------------------------------- /docs/assets/image-81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-81.png -------------------------------------------------------------------------------- /docs/assets/image-82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-82.png -------------------------------------------------------------------------------- /docs/assets/image-83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-83.png -------------------------------------------------------------------------------- /docs/assets/image-84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-84.png -------------------------------------------------------------------------------- /docs/assets/image-85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-85.png -------------------------------------------------------------------------------- /docs/assets/image-86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-86.png -------------------------------------------------------------------------------- /docs/assets/image-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-87.png -------------------------------------------------------------------------------- /docs/assets/image-88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-88.png -------------------------------------------------------------------------------- /docs/assets/image-89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-89.png -------------------------------------------------------------------------------- /docs/assets/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-9.png -------------------------------------------------------------------------------- /docs/assets/image-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-90.png -------------------------------------------------------------------------------- /docs/assets/image-91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-91.png -------------------------------------------------------------------------------- /docs/assets/image-92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-92.png -------------------------------------------------------------------------------- /docs/assets/image-93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-93.png -------------------------------------------------------------------------------- /docs/assets/image-94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-94.png -------------------------------------------------------------------------------- /docs/assets/image-95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-95.png -------------------------------------------------------------------------------- /docs/assets/image-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-96.png -------------------------------------------------------------------------------- /docs/assets/image-97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-97.png -------------------------------------------------------------------------------- /docs/assets/image-98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-98.png -------------------------------------------------------------------------------- /docs/assets/image-99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image-99.png -------------------------------------------------------------------------------- /docs/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/image.png -------------------------------------------------------------------------------- /docs/assets/recording-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-1.gif -------------------------------------------------------------------------------- /docs/assets/recording-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-1.png -------------------------------------------------------------------------------- /docs/assets/recording-10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-10.gif -------------------------------------------------------------------------------- /docs/assets/recording-11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-11.gif -------------------------------------------------------------------------------- /docs/assets/recording-12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-12.gif -------------------------------------------------------------------------------- /docs/assets/recording-13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-13.gif -------------------------------------------------------------------------------- /docs/assets/recording-14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-14.gif -------------------------------------------------------------------------------- /docs/assets/recording-15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-15.gif -------------------------------------------------------------------------------- /docs/assets/recording-16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-16.gif -------------------------------------------------------------------------------- /docs/assets/recording-17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-17.gif -------------------------------------------------------------------------------- /docs/assets/recording-18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-18.gif -------------------------------------------------------------------------------- /docs/assets/recording-19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-19.gif -------------------------------------------------------------------------------- /docs/assets/recording-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-2.gif -------------------------------------------------------------------------------- /docs/assets/recording-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-2.png -------------------------------------------------------------------------------- /docs/assets/recording-20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-20.gif -------------------------------------------------------------------------------- /docs/assets/recording-21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-21.gif -------------------------------------------------------------------------------- /docs/assets/recording-22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-22.gif -------------------------------------------------------------------------------- /docs/assets/recording-23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-23.gif -------------------------------------------------------------------------------- /docs/assets/recording-24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-24.gif -------------------------------------------------------------------------------- /docs/assets/recording-25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-25.gif -------------------------------------------------------------------------------- /docs/assets/recording-26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-26.gif -------------------------------------------------------------------------------- /docs/assets/recording-27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-27.gif -------------------------------------------------------------------------------- /docs/assets/recording-28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-28.gif -------------------------------------------------------------------------------- /docs/assets/recording-29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-29.gif -------------------------------------------------------------------------------- /docs/assets/recording-3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-3.gif -------------------------------------------------------------------------------- /docs/assets/recording-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-3.png -------------------------------------------------------------------------------- /docs/assets/recording-30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-30.gif -------------------------------------------------------------------------------- /docs/assets/recording-31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-31.gif -------------------------------------------------------------------------------- /docs/assets/recording-32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-32.gif -------------------------------------------------------------------------------- /docs/assets/recording-4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-4.gif -------------------------------------------------------------------------------- /docs/assets/recording-5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-5.gif -------------------------------------------------------------------------------- /docs/assets/recording-6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-6.gif -------------------------------------------------------------------------------- /docs/assets/recording-7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-7.gif -------------------------------------------------------------------------------- /docs/assets/recording-8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-8.gif -------------------------------------------------------------------------------- /docs/assets/recording-9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording-9.gif -------------------------------------------------------------------------------- /docs/assets/recording.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording.gif -------------------------------------------------------------------------------- /docs/assets/recording.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/docs/assets/recording.png -------------------------------------------------------------------------------- /docs/markdown_to_docx.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pypandoc 3 | 4 | def get_markdown_files(directory): 5 | return [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.md')] 6 | 7 | def convert_markdown_to_docx(markdown_files, output_file): 8 | # 读取所有Markdown文件的内容并合并 9 | markdown_content = "" 10 | for file in markdown_files: 11 | with open(file, 'r', encoding='utf-8') as f: 12 | markdown_content += f.read() + "\n\n" 13 | 14 | # 使用pypandoc将合并后的Markdown内容转换为Word文档 15 | output = pypandoc.convert_text(markdown_content, 'docx', format='md', outputfile=output_file) 16 | if output: 17 | print(f"转换过程中出现错误: {output}") 18 | else: 19 | print(f"文档已生成: {output_file}") 20 | 21 | if __name__ == "__main__": 22 | directory = '.' 23 | output_file = 'v-control docs.docx' 24 | markdown_files = get_markdown_files(directory) 25 | convert_markdown_to_docx(markdown_files, output_file) -------------------------------------------------------------------------------- /docs/starter.md: -------------------------------------------------------------------------------- 1 | # 开始 2 | 3 | ## 介绍 4 | 5 | V-Control是适用于[.NET MAUI](https://dotnet.microsoft.com/zh-cn/apps/maui) 的组件库(Component),或在微软体系下称其为[控件库(Control)](https://learn.microsoft.com/zh-cn/dotnet/maui/user-interface/controls/?view=net-maui-9.0),它提供了一组开箱即用的 UI 控件,可快速搭建面向业务的应用程序界面。 6 | 7 | 8 | 9 | ## 安装 10 | 11 | 1. 在你的.NET MAUI 项目中执行以下命令来安装 V-Control: 12 | 13 | ```bash 14 | dotnet add package VControl 15 | ``` 16 | 17 | 或在NUGET中搜索"V-Control"并安装它。 18 | 19 | 20 | 2. 在 `MauiProgram` 使用`.UseVControl()`在MauiAppBuilder中添加V-Control的处理程序。 21 | 22 | 23 | 24 | ```csharp 25 | public static MauiApp CreateMauiApp() 26 | { 27 | var builder = MauiApp.CreateBuilder(); 28 | builder 29 | .UseMauiApp() 30 | .UseVControl() //👈在这里添加V-Control的处理程序 31 | var mauiApp = builder.Build(); 32 | return mauiApp; 33 | } 34 | ``` 35 | 36 | 3. 打开 `App.xaml` 文件, 在资源中添加``。 37 | 38 | ```xml 39 | 40 | 41 | 44 | 45 | 46 | ... 47 | 48 | 49 | 50 | ``` 51 | 52 | ## 使用 53 | 54 | 55 | 在XAML中使用V-Control,首先在页面根元素中定义VControl.Controls的命名空间 56 | 57 | ```xml 58 | xmlns:v="clr-namespace:VControl.Controls;assembly=VControl" 59 | ``` 60 | 命名空间前缀`v`可以使用其他的字符来代替。 61 | 62 | 在使用V-Control控件时,你可以使用`v:`前缀来引用控件。 63 | 64 | ![alt text](assets/image-39.png) 65 | 66 | ## 源码和示例 67 | 68 | 您可以前往[GitHub](https://github.com/jevonsflash/VControl)查看V-Control的源码和示例。 -------------------------------------------------------------------------------- /docs/v-checkbox-button.md: -------------------------------------------------------------------------------- 1 | 2 | # VCheckBoxButton 3 | 4 | 在两种状态之间切换的按钮,通常用于有两个相互排斥的简单状态(例如“开”和“关”)的情况。 5 | 6 | ## 基础用法 7 | 8 | 9 | 基础的CheckBoxButton用法,使用 10 | 11 | ![alt text](assets/recording-21.gif) 12 | 13 | 14 | 15 | 使用 `IsChecked` 属性来设置是否选中。此属性为双向数据绑定属性。 16 | 17 | 18 | ```xml 19 | 20 | ``` 21 | 22 | ## 禁用状态 23 | 24 | 25 | 多选框不可用状态。 26 | 27 | 设置 `IsEnabled`属性为 `False` 即可。 28 | 29 | ![alt text](assets/image-84.png) 30 | 31 | 32 | ```xml 33 | 35 | ``` 36 | 37 | 38 | 39 | 40 | ## 自定义内容 41 | 42 | 可以通过设置`ContentSlot`属性来设置CheckBoxButton的自定义内容。 43 | 44 | 带图标的CheckBox 45 | 46 | ![alt text](assets/recording-22.gif) 47 | 48 | 49 | ```xml 50 | 52 | 53 | 54 | 55 | 59 | 63 | 73 | 74 | 75 | 76 | ``` 77 | -------------------------------------------------------------------------------- /docs/v-checkbox.md: -------------------------------------------------------------------------------- 1 | 2 | # VCheckBox 3 | 4 | 多项选择器中的选择单元 5 | 6 | 7 | ## 基础用法 8 | 9 | 10 | 基础的CheckBox用法,使用 11 | 12 | ![alt text](assets/image-35.png) 13 | 14 | ```xml 15 | 16 | 17 | ``` 18 | 19 | 使用 `IsChecked` 属性来设置是否选中。此属性为双向数据绑定属性。 20 | 21 | ![alt text](assets/recording-23.gif) 22 | 23 | 24 | ```xml 25 | 26 | ``` 27 | 28 | ## 禁用状态 29 | 30 | 31 | 多选框不可用状态。 32 | 33 | 设置 `IsEnabled`属性为 `False` 即可。 34 | 35 | ![alt text](assets/image-36.png) 36 | 37 | 38 | ```xml 39 | 41 | ``` 42 | 43 | ## 不确定状态 44 | 45 | 设置 `IsIndeterminate` 属性为 `True` 用以表示 CheckBox 的不确定状态,注意:`IsIndeterminate` 属性仅改变控件外观,不变更控件的IsChecked状态。 46 | 47 | 48 | ![alt text](assets/recording-1.gif) 49 | 50 | 51 | ```xml 52 | 53 | 55 | ``` 56 | 57 | 58 | ## 变更图标 59 | 60 | 设置 `IconText`指定图标,图标的格式为Unicode字符或图标名称。默认为`\uF068`。 61 | 62 | ![alt text](assets/image-37.png) 63 | 64 | ```xml 65 | 68 | ``` 69 | 70 | 71 | 72 | ## 自定义内容 73 | 74 | 可以通过设置`ContentSlot`属性来设置CheckBox的自定义内容。设置此属性将覆盖原CheckBox中的图标。 75 | 76 | 带图标的CheckBox 77 | 78 | ![alt text](assets/image-38.png) 79 | 80 | 81 | ```xml 82 | 83 | 84 | 87 | 88 | 89 | ``` 90 | -------------------------------------------------------------------------------- /docs/v-collection.md: -------------------------------------------------------------------------------- 1 | 2 | # VCollection 3 | 4 | 一组数据的集合,用于列表显示和选择数据。 5 | 6 | 7 | ## 基础用法 8 | 9 | 10 | 使用 `ItemsSource` 属性来绑定数据。 11 | 12 | 13 | ![alt text](assets/image-86.png) 14 | 15 | 16 | ```xml 17 | 18 | 19 | 20 | ``` 21 | 22 | 设置 `DisplayPropertyName` 属性来指定显示的属性。 23 | 24 | ![alt text](assets/recording-25.gif) 25 | 26 | 27 | ```xml 28 | 30 | 31 | ``` 32 | 33 | 34 | ## 搜索框 35 | 36 | 37 | 使用 `SearchKeywords` 可绑定属性指定搜索关键字。将不区分大小写模糊匹配符合条件的项。 38 | 39 | 40 | ![alt text](assets/recording-24.gif) 41 | 42 | ```xml 43 | 46 | 47 | ``` 48 | 49 | 50 | 51 | 52 | ## 隐藏搜索框 53 | 54 | 55 | 多选框不可用状态。设置 `HasSearchBar`属性为 `False` 可移除搜索框。 56 | 57 | 58 | ```xml 59 | 62 | 63 | 64 | ``` 65 | 66 | ## 编辑和删除按钮 67 | 68 | 69 | 使用 `HasEdit` 和 `HasRemove` 属性来显示或隐藏编辑和删除按钮。 70 | 71 | ![alt text](assets/image-87.png) 72 | 73 | ```xml 74 | 78 | 79 | ``` 80 | 81 | 82 | ## 禁用状态 83 | 84 | 85 | 多选框不可用状态。 86 | 87 | 设置 `IsCollectionEnabled`属性为 `False` 即可。 88 | 89 | 90 | ![alt text](assets/image-85.png) 91 | 92 | 93 | ```xml 94 | 96 | 97 | 98 | ``` 99 | 100 | -------------------------------------------------------------------------------- /docs/v-picker-en.md: -------------------------------------------------------------------------------- 1 | # VPicker 2 | 3 | Selector Component. 4 | 5 | ## Basic Usage 6 | 7 | ![alt text](assets/image-101.png) 8 | 9 | Use the `ItemsSource` property to bind the selector's data source, which should be an object bound to `IList>`. 10 | 11 | Use the `SelectedItem` property to bind the currently selected item. 12 | 13 | ```xml 14 | 17 | ``` 18 | 19 | Set the `DisplayPropertyName` property to specify the display attribute. 20 | 21 | ![alt text](assets/recording-32.gif) 22 | 23 | ```xml 24 | 28 | ``` 29 | 30 | ## Placeholder Text 31 | 32 | ![alt text](assets/image-102.png) 33 | 34 | Use the `PickerTitle` property to set the placeholder text. 35 | 36 | ```xml 37 | 41 | ``` 42 | 43 | ## Disabled State 44 | 45 | ![alt text](assets/image-103.png) 46 | 47 | Use the `IsPickerEnabled` property to set whether the component is enabled. 48 | 49 | ```xml 50 | 54 | 55 | 56 | ``` 57 | 58 | -------------------------------------------------------------------------------- /docs/v-picker.md: -------------------------------------------------------------------------------- 1 | 2 | # VPicker 3 | 4 | 选择器组件。 5 | 6 | 7 | ## 基础用法 8 | 9 | 10 | ![alt text](assets/image-101.png) 11 | 12 | 使用 `ItemsSource` 属性绑定选择器数据源,需要绑定 `IList>` 的对象。 13 | 14 | 使用 `SelectedItem` 属性绑定当前选中的项。 15 | 16 | 17 | ```xml 18 | 21 | 22 | ``` 23 | 24 | 25 | 26 | 27 | 设置 `DisplayPropertyName` 属性来指定显示的属性。 28 | 29 | ![alt text](assets/recording-32.gif) 30 | 31 | ```xml 32 | 36 | 37 | 38 | ``` 39 | 40 | 41 | ## 占位文本 42 | 43 | 44 | 45 | ![alt text](assets/image-102.png) 46 | 47 | 使用 `PickerTitle` 属性设置占位文本。 48 | 49 | 50 | ```xml 51 | 52 | 56 | 57 | ``` 58 | 59 | ## 禁用状态 60 | 61 | 62 | ![alt text](assets/image-103.png) 63 | 64 | 65 | 使用 `IsPickerEnabled` 属性设置组件是否可用。 66 | 67 | ```xml 68 | 72 | 73 | 74 | ``` 75 | 76 | -------------------------------------------------------------------------------- /docs/v-placeholder-view-en.md: -------------------------------------------------------------------------------- 1 | # VPlaceholderView 2 | 3 | Placeholder prompt view component. Commonly used for empty state placeholders or result displays. 4 | 5 | ## Basic Usage 6 | 7 | Basic usage of the placeholder prompt view. 8 | 9 | ![alt text](assets/recording-19.gif) 10 | 11 | ```xml 12 | 13 | ``` 14 | 15 | ## Title 16 | 17 | Use the `TitleText` property to set the title. 18 | Use the `ButtonText` property to set the button text. 19 | 20 | ![alt text](assets/image-74.png) 21 | 22 | ```xml 23 | 24 | ``` 25 | 26 | ## Customization 27 | 28 | Use `ContentSlot` to set custom content. 29 | 30 | ![alt text](assets/image-75.png) 31 | 32 | Using an image as content: 33 | 34 | ```xml 35 | 36 | 37 | 40 | 41 | 42 | ``` 43 | -------------------------------------------------------------------------------- /docs/v-placeholder-view.md: -------------------------------------------------------------------------------- 1 | 2 | # VPlaceholderView 3 | 4 | 占位提示视图组件。常用于空状态占位提示,或者结果展示 5 | 6 | 7 | ## 基础用法 8 | 9 | 10 | 基础的占位提示视图用法 11 | 12 | 13 | ![alt text](assets/recording-19.gif) 14 | 15 | ```xml 16 | 17 | ``` 18 | 19 | 20 | ## 标题 21 | 22 | 使用 `TitleText` 属性设置标题 23 | 使用 `ButtonText` 属性设置按钮文本 24 | 25 | 26 | ![alt text](assets/image-74.png) 27 | 28 | ```xml 29 | 30 | ``` 31 | 32 | 33 | 34 | 35 | ## 自定义 36 | 37 | 使用`ContentSlot`设置自定义内容 38 | 39 | ![alt text](assets/image-75.png) 40 | 41 | 以图片作为内容 42 | 43 | ```xml 44 | 45 | 46 | 49 | 50 | 51 | 52 | ``` 53 | 54 | 55 | -------------------------------------------------------------------------------- /docs/v-radiobutton-group.md: -------------------------------------------------------------------------------- 1 | 2 | # VRadioButtonGroup 3 | 4 | 用于展示多个选项并允许用户选择其中单个选项。 5 | 6 | 7 | ## 基础用法 8 | 9 | 10 | 基础用法 11 | 12 | 使用 `ItemsSource` 和 `SelectedItem` 属性来绑定数据和选中项。 13 | 14 | 绑定的数据源对象,需要包含`Value`和`Icon` 15 | 16 | 17 | ![alt text](assets/image-52.png) 18 | 19 | 20 | ```xml 21 | 23 | 24 | ``` 25 | 26 | 27 | CodeBehind 28 | 29 | ```csharp 30 | 31 | InspTypeList2 = new ObservableCollection() 32 | { 33 | new RadioButtonModel() { Id = "1", Value = "Booking" }, 34 | new RadioButtonModel() { Id = "2", Value = "Reports" }, 35 | new RadioButtonModel() { Id = "3", Value = "Documents" } 36 | }; 37 | ``` 38 | 39 | ## 带图标 40 | 41 | 42 | 绑定的数据源对象的`Icon`属性,设置图标。图标的格式为Unicode字符或图标名称。 43 | 44 | 45 | ![alt text](assets/image-53.png) 46 | 47 | 48 | CodeBehind 49 | 50 | ```csharp 51 | InspTypeList = new ObservableCollection() 52 | { 53 | new RadioButtonModel() 54 | { 55 | Id = "1", 56 | Value = "Booking", 57 | Icon = "\uF0eb", 58 | }, 59 | new RadioButtonModel() 60 | { 61 | Id = "2", 62 | Value = "Reports", 63 | Icon = "\uE4f0", 64 | }, 65 | new RadioButtonModel() 66 | { 67 | Id = "3", 68 | Value = "Documents", 69 | Icon = "\uF15b", 70 | }, 71 | }; 72 | 73 | ``` 74 | 75 | ## 禁用状态 76 | 77 | 78 | 使控件进入不可用状态。 79 | 80 | 设置 `IsEnabled`属性为 `False` 即可。 81 | 82 | 83 | ![alt text](assets/image-54.png) 84 | 85 | 86 | ![alt text](assets/image-55.png) 87 | 88 | 89 | ## 排列方向 90 | 91 | 设置 `RadioButtonGroupDirection` 属性来设置排列方向,默认为横向。 92 | 93 | 可选择的方向: 94 | 95 | * Horizontal - 横向 96 | * Vertical - 纵向 97 | 98 | ![alt text](assets/image-56.png) 99 | 100 | ```xml 101 | 103 | 104 | ``` 105 | -------------------------------------------------------------------------------- /docs/v-rich-text-editor-en.md: -------------------------------------------------------------------------------- 1 | # VRichTextEditor 2 | 3 | Rich Text Editor Component 4 | 5 | The rich text editor is a WYSIWYG (What You See Is What You Get) editor, where the content entered and style changes made by the user are directly reflected in the editor. 6 | 7 | ![alt text](assets/recording-2.png) 8 | -------------------------------------------------------------------------------- /docs/v-rich-text-editor.md: -------------------------------------------------------------------------------- 1 | 2 | # VRichTextEditor 3 | 4 | 富文本编辑框组件 5 | 6 | 富文本编辑器是一种所见即所得(what you see is what you get 简称 WYSIWYG)文本编辑器,用户在编辑器中输入内容和所做的样式修改,都会直接反映在编辑器中。 7 | 8 | ![alt text](assets/recording-2.png) -------------------------------------------------------------------------------- /docs/v-searchbar.md: -------------------------------------------------------------------------------- 1 | 2 | # VSearchBar 3 | 4 | 搜索栏组件。 5 | 6 | 7 | ## 基础用法 8 | 9 | 10 | 基础的搜索栏用法 11 | 12 | ![alt text](assets/image-61.png) 13 | 14 | ```xml 15 | 16 | ``` 17 | 18 | ## 关键字 19 | 20 | 21 | 设置 `Title` 指定关键字(标题)内容 22 | 23 | ![alt text](assets/image-68.png) 24 | 25 | ```xml 26 | 27 | 28 | ``` 29 | 30 | ## 占位文本 31 | 32 | 33 | 设置 `Placeholder` 指定占位文本内容 34 | 35 | ![alt text](assets/image-62.png) 36 | 37 | ```xml 38 | 39 | ``` 40 | 41 | ## 隐藏搜索按钮 42 | 43 | 44 | 设置 `HasSearchButton` 为 `False` 属性即可隐藏搜索按钮。 45 | 46 | ![alt text](assets/image-63.png) 47 | 48 | ```xml 49 | 50 | 51 | ``` 52 | 53 | ## 搜索按钮图标 54 | 55 | 设置 `IconText` 指定搜索按钮图标,图标的格式为Unicode字符或图标名称。默认为`\uF002`(放大镜) 56 | 57 | ![alt text](assets/image-64.png) 58 | 59 | ```xml 60 | 61 | ``` 62 | 63 | 64 | ## 标题颜色 65 | 66 | 67 | 使用`TitleColor`属性即可设置标题颜色 68 | 69 | ![alt text](assets/image-65.png) 70 | 71 | ```xml 72 | 74 | 75 | ``` 76 | 77 | 78 | 79 | 80 | ## 自定义内容 81 | 82 | 使用`ContentSlot`设置搜索栏的后缀内容 83 | 84 | ![alt text](assets/image-66.png) 85 | 86 | 带图标和文本的后缀 87 | 88 | ```xml 89 | 90 | 91 | 92 | 93 | 94 | 97 | 98 | 99 | 100 | 101 | ``` 102 | -------------------------------------------------------------------------------- /docs/v-timeline.md: -------------------------------------------------------------------------------- 1 | 2 | # VTimeLine 3 | 4 | 可视化地呈现时间流信息。 5 | 6 | 7 | ## 基础用法 8 | 9 | 10 | 使用 `ItemsSource` 属性来绑定数据。 11 | 12 | 13 | ![alt text](assets/image-77.png) 14 | 15 | 16 | 17 | 18 | 数据源的条目可通过如下属性控制时间流信息: 19 | 20 | ``` 21 | string Title - 标题 22 | 23 | string Details - 详情 24 | 25 | string Date - 日期 26 | 27 | TimeLineItemType Type - 节点样式类型 28 | 29 | Color TitleColor - 标题颜色 30 | ``` 31 | 32 | 其中 `TimeLineItemType` 为枚举类型,包含以下几种: 33 | 34 | * Normal - 普通节点样式 35 | * Active - 当前节点样式 36 | * Success - 成功节点样式 37 | 38 | 39 | ```xml 40 | 41 | ``` 42 | 43 | 44 | ViewModel: 45 | 46 | ```csharp 47 | this.ProBarList = new ObservableCollection() 48 | { 49 | new TimeLineItemModel() 50 | { 51 | Date = now.AddDays(-2).ToString("G"), 52 | Title = "Event start", 53 | Type = TimeLineItemType.Normal, 54 | }, 55 | new TimeLineItemModel() 56 | { 57 | Date = now.AddDays(-1).ToString("G"), 58 | Title = "Approved", 59 | Type = TimeLineItemType.Active, 60 | }, 61 | new TimeLineItemModel() 62 | { 63 | Date = now.ToString("G"), 64 | Title = "Success", 65 | Type = TimeLineItemType.Success, 66 | }, 67 | }; 68 | ``` 69 | 70 | ## 标题颜色 71 | 72 | 73 | 通过绑定对象的 `TitleColor` 属性即可设置标题颜色。 74 | 75 | ![alt text](assets/image-78.png) 76 | 77 | 78 | ViewModel: 79 | 80 | ```csharp 81 | new TimeLineItemModel() 82 | { 83 | Date = now.ToString("G"), 84 | Title = "Event start", 85 | TitleColor = Colors.Red, 86 | Type = TimeLineItemType.Normal, 87 | }, 88 | ``` 89 | 90 | ## 详情内容 91 | 92 | 93 | 通过绑定对象的 `Details` 属性即可设置详情内容。 94 | 95 | ![alt text](assets/image-79.png) 96 | 97 | 98 | ViewModel: 99 | 100 | ```csharp 101 | new TimeLineItemModel() 102 | { 103 | Date = now.ToString("G"), 104 | Title = "Event start", 105 | Details="Gary accepted merge request!! ", 106 | TitleColor = Colors.Green, 107 | Type = TimeLineItemType.Normal, 108 | }, 109 | ``` 110 | 111 | -------------------------------------------------------------------------------- /samples/src/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples; 4 | 5 | public partial class App : Application 6 | { 7 | public App(INavigationService navigationService) 8 | { 9 | InitializeComponent(); 10 | InitApp(); 11 | MainPage = new AppShell(navigationService); 12 | } 13 | 14 | private void InitApp() 15 | { 16 | if (VersionTracking.IsFirstLaunchEver) 17 | { 18 | //首次打开 19 | } 20 | } 21 | 22 | protected override async void OnStart() 23 | { 24 | base.OnStart(); 25 | 26 | //code snippet 27 | OnResume(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /samples/src/AppShell.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /samples/src/AppShell.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples; 4 | 5 | public partial class AppShell : Shell 6 | { 7 | private readonly INavigationService _navigationService; 8 | 9 | public AppShell(INavigationService navigationService) 10 | { 11 | _navigationService = navigationService; 12 | InitializeComponent(); 13 | } 14 | 15 | protected override async void OnHandlerChanged() 16 | { 17 | base.OnHandlerChanged(); 18 | 19 | if (Handler is not null) 20 | { 21 | await _navigationService.InitializeAsync(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /samples/src/Behaviors/TriggerPopupBehavior.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Common; 2 | 3 | namespace VControl.Samples.Behaviors 4 | { 5 | public class TriggerPopupBehavior : Behavior 6 | { 7 | public bool PopupLoading { get; private set; } 8 | 9 | protected override void OnAttachedTo(ContentPage bindable) 10 | { 11 | base.OnAttachedTo(bindable); 12 | bindable.Appearing += OnPageAppearing; 13 | bindable.Disappearing += OnPageDisappearing; 14 | } 15 | 16 | protected override void OnDetachingFrom(ContentPage bindable) 17 | { 18 | base.OnDetachingFrom(bindable); 19 | bindable.Appearing -= OnPageAppearing; 20 | bindable.Disappearing -= OnPageDisappearing; 21 | } 22 | 23 | private async void OnPageAppearing(object sender, EventArgs e) 24 | { 25 | (sender as ITriggerPopupPage)?.Triggerpopup(); 26 | } 27 | 28 | private async void OnPageDisappearing(object sender, EventArgs e) 29 | { 30 | (sender as ITriggerPopupPage)?.Dismisspopup(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /samples/src/Common/CommonHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using VControl.Samples.Models; 7 | 8 | namespace VControl.Samples.Common 9 | { 10 | public class CommonHelper 11 | { 12 | private static Random _random = new Random(); 13 | private static List _firstNames = new List 14 | { 15 | "John", 16 | "Emma", 17 | "Michael", 18 | "Sophia", 19 | "James", 20 | "Olivia", 21 | "David", 22 | "Isabella", 23 | "Daniel", 24 | "Charlotte", 25 | }; 26 | private static List _lastNames = new List 27 | { 28 | "Smith", 29 | "Johnson", 30 | "Brown", 31 | "Davis", 32 | "Wilson", 33 | "Moore", 34 | "Taylor", 35 | "Anderson", 36 | "Harris", 37 | "Clark", 38 | }; 39 | 40 | public static List GenerateRandomNamesAndEmails(int count) 41 | { 42 | var result = new List(); 43 | 44 | for (int i = 0; i < count; i++) 45 | { 46 | var firstName = _firstNames[_random.Next(_firstNames.Count)]; 47 | var lastName = _lastNames[_random.Next(_lastNames.Count)]; 48 | 49 | var fullName = $"{firstName} {lastName}"; 50 | var email = $"{firstName.ToLower()}.{lastName.ToLower()}@email.com"; 51 | 52 | result.Add(new PickerM() { Title = fullName, Value = email }); 53 | } 54 | 55 | return result; 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /samples/src/Common/ITriggerPopupPage.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.Common 2 | { 3 | public interface ITriggerPopupPage 4 | { 5 | Task Dismisspopup(); 6 | 7 | Task Triggerpopup(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/Common/LoggedInUserChangedMessage.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.Messaging.Messages; 2 | 3 | namespace VControl.Samples.Common 4 | { 5 | public class LoggedInUserChangedMessage : ValueChangedMessage 6 | { 7 | public LoggedInUserChangedMessage(string user) 8 | : base(user) { } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /samples/src/Common/PopupSize.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.Common 2 | { 3 | internal static class PopupSize 4 | { 5 | // examples for fixed sizes 6 | public static Size Tiny => new Size(100, 100); 7 | 8 | public static Size Small => new Size(300, 300); 9 | 10 | // examples for relative to screen sizes 11 | public static Size Medium => 12 | new Size( 13 | 0.7 * (DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density), 14 | 0.6 * (DeviceDisplay.MainDisplayInfo.Height / DeviceDisplay.MainDisplayInfo.Density) 15 | ); 16 | 17 | public static Size Large => 18 | new Size( 19 | 0.9 * (DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density), 20 | 0.8 * (DeviceDisplay.MainDisplayInfo.Height / DeviceDisplay.MainDisplayInfo.Density) 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /samples/src/Extensions/DictionaryExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.Extensions; 2 | 3 | public static class DictionaryExtensions 4 | { 5 | /// 6 | /// 返回Bool值, 不符合时返回DefaultValue 7 | /// 8 | /// 9 | /// 10 | /// 11 | /// 12 | public static bool ValueAsBool( 13 | this IDictionary dictionary, 14 | string key, 15 | bool defaultValue = false 16 | ) => 17 | dictionary.ContainsKey(key) && dictionary[key] is bool dictValue ? dictValue : defaultValue; 18 | 19 | /// 20 | /// 返回Int值, 不符合时返回DefaultValue 21 | /// 22 | /// 23 | /// 24 | /// 25 | /// 26 | public static int ValueAsInt( 27 | this IDictionary dictionary, 28 | string key, 29 | int defaultValue = 0 30 | ) => dictionary.ContainsKey(key) && dictionary[key] is int intValue ? intValue : defaultValue; 31 | } 32 | -------------------------------------------------------------------------------- /samples/src/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using CommunityToolkit.Mvvm.ComponentModel; 2 | global using CommunityToolkit.Mvvm.Input; 3 | global using VControl.Samples.ViewModels; 4 | -------------------------------------------------------------------------------- /samples/src/Models/HomeViewItem.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.Models 2 | { 3 | public partial class HomeViewItem : ObservableObject 4 | { 5 | [ObservableProperty] 6 | public string _title; 7 | 8 | [ObservableProperty] 9 | public string _icon; 10 | 11 | [ObservableProperty] 12 | public string _info; 13 | 14 | [ObservableProperty] 15 | public string _url; 16 | 17 | [ObservableProperty] 18 | public bool _isExpanded; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /samples/src/Navigation/INavigationService.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Maui.Views; 2 | 3 | namespace VControl.Samples.Services.Navigation 4 | { 5 | public interface INavigationService 6 | { 7 | Task InitializeAsync(); 8 | 9 | Task GetCurrentPageAsync(); 10 | 11 | Task NavigateToAsync(string route, IDictionary routeParameters = null); 12 | 13 | Task NavigateToAsync(IDictionary routeParameters = null) 14 | where T : ContentPage; 15 | 16 | Task ShowPopupAsync(Popup popupPage); 17 | 18 | Task HidePopupAsync(Popup popupPage); 19 | 20 | Task PushAsync(Page page, bool animated = true); 21 | 22 | Task PushModalAsync(Page page, bool animated = true); 23 | 24 | Task GetCurrentUriAsync(); 25 | 26 | Task PopAsync(bool animated = true); 27 | 28 | Task PopModalAsync(bool animated = true); 29 | 30 | Task PopToRootAsync(bool animated = true); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /samples/src/Platforms/Android/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /samples/src/Platforms/Android/MainApplication.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Runtime; 3 | 4 | namespace VControl.Samples; 5 | 6 | [Application] 7 | public class MainApplication : MauiApplication 8 | { 9 | public MainApplication(IntPtr handle, JniHandleOwnership ownership) 10 | : base(handle, ownership) 11 | { 12 | } 13 | 14 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/Platforms/Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FF7415 4 | #FF7415 5 | #FF7415 6 | -------------------------------------------------------------------------------- /samples/src/Platforms/Android/Resources/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | none 4 | -------------------------------------------------------------------------------- /samples/src/Platforms/MacCatalyst/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using Foundation; 2 | 3 | namespace VControl.Samples; 4 | 5 | [Register("AppDelegate")] 6 | public class AppDelegate : MauiUIApplicationDelegate 7 | { 8 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/Platforms/MacCatalyst/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIDeviceFamily 6 | 7 | 1 8 | 2 9 | 10 | UIRequiredDeviceCapabilities 11 | 12 | arm64 13 | 14 | UISupportedInterfaceOrientations 15 | 16 | UIInterfaceOrientationPortrait 17 | UIInterfaceOrientationLandscapeLeft 18 | UIInterfaceOrientationLandscapeRight 19 | 20 | UISupportedInterfaceOrientations~ipad 21 | 22 | UIInterfaceOrientationPortrait 23 | UIInterfaceOrientationPortraitUpsideDown 24 | UIInterfaceOrientationLandscapeLeft 25 | UIInterfaceOrientationLandscapeRight 26 | 27 | XSAppIconAssets 28 | Assets.xcassets/appicon.appiconset 29 | 30 | NSCameraUsageDescription 31 | This app needs access to the camera to take photos. 32 | NSMicrophoneUsageDescription 33 | This app needs access to microphone for taking videos. 34 | NSPhotoLibraryAddUsageDescription 35 | This app needs access to the photo gallery for picking photos and videos. 36 | NSPhotoLibraryUsageDescription 37 | This app needs access to photos gallery for picking photos and videos. 38 | 39 | com.apple.security.personal-information.photos-library 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /samples/src/Platforms/MacCatalyst/Program.cs: -------------------------------------------------------------------------------- 1 | using ObjCRuntime; 2 | using UIKit; 3 | 4 | namespace VControl.Samples; 5 | 6 | public class Program 7 | { 8 | // This is the main entry point of the application. 9 | static void Main(string[] args) 10 | { 11 | // if you want to use a different Application Delegate class from "AppDelegate" 12 | // you can specify it here. 13 | UIApplication.Main(args, null, typeof(AppDelegate)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/Platforms/MacCatalyst/SaveMac.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Platforms/MacCatalyst/SaveMac.cs -------------------------------------------------------------------------------- /samples/src/Platforms/Tizen/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Maui; 3 | using Microsoft.Maui.Hosting; 4 | 5 | namespace VControl.Samples; 6 | 7 | class Program : MauiApplication 8 | { 9 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 10 | 11 | static void Main(string[] args) 12 | { 13 | var app = new Program(); 14 | app.Run(args); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /samples/src/Platforms/Tizen/tizen-manifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | maui-appicon-placeholder 7 | 8 | 9 | 10 | 11 | http://tizen.org/privilege/internet 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /samples/src/Platforms/Windows/App.xaml: -------------------------------------------------------------------------------- 1 |  7 | 8 | 9 | -------------------------------------------------------------------------------- /samples/src/Platforms/Windows/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | 3 | // To learn more about WinUI, the WinUI project structure, 4 | // and more about our project templates, see: http://aka.ms/winui-project-info. 5 | 6 | namespace VControl.Samples.WinUI; 7 | 8 | /// 9 | /// Provides application-specific behavior to supplement the default Application class. 10 | /// 11 | public partial class App : MauiWinUIApplication 12 | { 13 | /// 14 | /// Initializes the singleton application object. This is the first line of authored code 15 | /// executed, and as such is the logical equivalent of main() or WinMain(). 16 | /// 17 | public App() 18 | { 19 | this.InitializeComponent(); 20 | } 21 | 22 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 23 | } 24 | 25 | -------------------------------------------------------------------------------- /samples/src/Platforms/Windows/Package.appxmanifest: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | $placeholder$ 15 | User Name 16 | $placeholder$.png 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /samples/src/Platforms/Windows/SaveWindows.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Platforms/Windows/SaveWindows.cs -------------------------------------------------------------------------------- /samples/src/Platforms/Windows/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | true/PM 12 | PerMonitorV2, PerMonitor 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /samples/src/Platforms/iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using Foundation; 3 | using UIKit; 4 | 5 | namespace VControl.Samples; 6 | 7 | [Register("AppDelegate")] 8 | public class AppDelegate : MauiUIApplicationDelegate 9 | { 10 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 11 | 12 | public override bool FinishedLaunching(UIApplication app, NSDictionary options) 13 | { 14 | AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 15 | return base.FinishedLaunching(app, options); 16 | } 17 | 18 | private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 19 | { 20 | Debug.WriteLine(e.ExceptionObject); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /samples/src/Platforms/iOS/PrivacyInfo.xcprivacy: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSPrivacyAccessedAPITypes 6 | 7 | 8 | NSPrivacyAccessedAPIType 9 | NSPrivacyAccessedAPICategoryFileTimestamp 10 | NSPrivacyAccessedAPITypeReasons 11 | 12 | C617.1 13 | 3B52.1 14 | 15 | 16 | 17 | NSPrivacyAccessedAPIType 18 | NSPrivacyAccessedAPICategorySystemBootTime 19 | NSPrivacyAccessedAPITypeReasons 20 | 21 | 35F9.1 22 | 8FFB.1 23 | 3D61.1 24 | 25 | 26 | 27 | NSPrivacyAccessedAPIType 28 | NSPrivacyAccessedAPICategoryDiskSpace 29 | NSPrivacyAccessedAPITypeReasons 30 | 31 | E174.1 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /samples/src/Platforms/iOS/Program.cs: -------------------------------------------------------------------------------- 1 | using UIKit; 2 | 3 | namespace VControl.Samples; 4 | 5 | public class Program 6 | { 7 | // This is the main entry point of the application. 8 | static void Main(string[] args) 9 | { 10 | // if you want to use a different Application Delegate class from "AppDelegate" 11 | // you can specify it here. 12 | UIApplication.Main(args, null, typeof(AppDelegate)); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /samples/src/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Windows Machine": { 4 | "commandName": "MsixPackage", 5 | "nativeDebugging": false 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /samples/src/Resources/AppIcon/appiconfg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /samples/src/Resources/Fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /samples/src/Resources/Fonts/OpenSans-Semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Fonts/OpenSans-Semibold.ttf -------------------------------------------------------------------------------- /samples/src/Resources/Images/aze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/aze.png -------------------------------------------------------------------------------- /samples/src/Resources/Images/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/doc.png -------------------------------------------------------------------------------- /samples/src/Resources/Images/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/download.png -------------------------------------------------------------------------------- /samples/src/Resources/Images/food.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/food.jpg -------------------------------------------------------------------------------- /samples/src/Resources/Images/ics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/ics.png -------------------------------------------------------------------------------- /samples/src/Resources/Images/ppt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/ppt.png -------------------------------------------------------------------------------- /samples/src/Resources/Images/service3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/service3.jpg -------------------------------------------------------------------------------- /samples/src/Resources/Images/sketch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/sketch.png -------------------------------------------------------------------------------- /samples/src/Resources/Images/tab_account.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/src/Resources/Images/tab_home.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /samples/src/Resources/Images/xls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/samples/src/Resources/Images/xls.png -------------------------------------------------------------------------------- /samples/src/Resources/Raw/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories). Deployment of the asset to your application 3 | is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. 4 | 5 | 6 | 7 | These files will be deployed with you package and will be accessible using Essentials: 8 | 9 | async Task LoadMauiAsset() 10 | { 11 | using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); 12 | using var reader = new StreamReader(stream); 13 | 14 | var contents = reader.ReadToEnd(); 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/Resources/Splash/splash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /samples/src/ViewModels/Base/IPopupViewModelBase.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.ViewModels.Base 2 | { 3 | public interface IPopupViewModelBase 4 | { 5 | Size PopupSize { get; set; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /samples/src/ViewModels/Base/IViewModelBase.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public interface IViewModelBase : IQueryAttributable 6 | { 7 | INavigationService NavigationService { get; } 8 | 9 | IAsyncRelayCommand InitializeAsyncCommand { get; } 10 | 11 | bool IsBusy { get; } 12 | string PageTitle { get; } 13 | 14 | bool IsInitialized { get; } 15 | 16 | /// 17 | /// 页面初始化 18 | /// 19 | /// 20 | Task InitializeAsync(); 21 | } 22 | -------------------------------------------------------------------------------- /samples/src/ViewModels/Base/ObservableCollectionExt.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Collections.Specialized; 3 | using System.ComponentModel; 4 | 5 | namespace VControl.Samples.ViewModels; 6 | 7 | public class ObservableCollectionExt : ObservableCollection 8 | { 9 | public ObservableCollectionExt() 10 | : base() { } 11 | 12 | public ObservableCollectionExt(IEnumerable collection) 13 | : base(collection) { } 14 | 15 | public ObservableCollectionExt(List list) 16 | : base(list) { } 17 | 18 | public void ReloadData(IEnumerable items) 19 | { 20 | ReloadData(innerList => 21 | { 22 | foreach (var item in items) 23 | { 24 | innerList.Add(item); 25 | } 26 | }); 27 | } 28 | 29 | public void ReloadData(Action> innerListAction) 30 | { 31 | Items.Clear(); 32 | 33 | innerListAction(Items); 34 | 35 | OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count))); 36 | OnPropertyChanged(new PropertyChangedEventArgs("Items[]")); 37 | OnCollectionChanged( 38 | new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset) 39 | ); 40 | } 41 | 42 | public async Task ReloadDataAsync(Func, Task> innerListAction) 43 | { 44 | Items.Clear(); 45 | 46 | await innerListAction(Items); 47 | 48 | OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count))); 49 | OnPropertyChanged(new PropertyChangedEventArgs("Items[]")); 50 | OnCollectionChanged( 51 | new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset) 52 | ); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /samples/src/ViewModels/Base/PopupViewModelBase.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | using Size = Microsoft.Maui.Graphics.Size; 3 | 4 | namespace VControl.Samples.ViewModels.Base 5 | { 6 | public class PopupViewModelBase : ViewModelBase, IPopupViewModelBase 7 | { 8 | private readonly IDeviceDisplay deviceDisplay; 9 | 10 | private Size _popupSize; 11 | 12 | private bool _loading; 13 | 14 | public PopupViewModelBase(INavigationService navigationService) 15 | : base(navigationService) 16 | { 17 | deviceDisplay = DeviceDisplay.Current; 18 | deviceDisplay.MainDisplayInfoChanged += DeviceDisplay_MainDisplayInfoChanged; 19 | var displayInfo = deviceDisplay.MainDisplayInfo; 20 | SetSize(displayInfo); 21 | } 22 | 23 | public Size PopupSize 24 | { 25 | get { return _popupSize; } 26 | set 27 | { 28 | _popupSize = value; 29 | OnPropertyChanged(); 30 | } 31 | } 32 | 33 | public bool Loading 34 | { 35 | get { return _loading; } 36 | set 37 | { 38 | _loading = value; 39 | OnPropertyChanged(); 40 | } 41 | } 42 | 43 | protected virtual void SetSize(DisplayInfo displayInfo) 44 | { 45 | var newWidth = displayInfo.Width; 46 | var newHeight = displayInfo.Height * 0.8; 47 | 48 | var d = displayInfo.Density; 49 | PopupSize = new Size(newWidth / d, newHeight / d); 50 | } 51 | 52 | private void DeviceDisplay_MainDisplayInfoChanged( 53 | object sender, 54 | DisplayInfoChangedEventArgs e 55 | ) 56 | { 57 | var displayInfo = e.DisplayInfo; 58 | // 新的宽度和高度 59 | SetSize(displayInfo); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /samples/src/ViewModels/BaseViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.ViewModels 2 | { 3 | public partial class BaseViewModel : ObservableObject { } 4 | } 5 | -------------------------------------------------------------------------------- /samples/src/ViewModels/IDraggableViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.Core.ViewModels 2 | { 3 | public interface IDraggableViewModel 4 | { 5 | Command ItemDragged { get; set; } 6 | 7 | Command ItemDraggedOver { get; set; } 8 | 9 | Command ItemDragLeave { get; set; } 10 | 11 | Command ItemDropped { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /samples/src/ViewModels/IPopupContainerViewModelBase.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.ViewModels 2 | { 3 | public interface IPopupContainerViewModelBase 4 | { 5 | bool PopupLoading { get; set; } 6 | 7 | Task CloseAllPopup(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/ViewModels/ISearchViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.Core.ViewModels 2 | { 3 | public interface ISearchViewModel 4 | { 5 | Command SearchCommand { get; set; } 6 | 7 | string SearchKeywords { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/ViewModels/Others/IconsPageViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Samples.Services.Navigation; 3 | 4 | namespace VControl.Samples.ViewModels; 5 | 6 | public partial class IconsPageViewModel : ViewModelBase 7 | { 8 | [ObservableProperty] 9 | private ObservableCollection _iconItemList; 10 | 11 | public IconsPageViewModel(INavigationService navService) 12 | : base(navService) 13 | { 14 | var res = Application.Current.Resources; 15 | IconItemList = new ObservableCollection() 16 | { 17 | new 18 | { 19 | Title = "house", 20 | Icon = "\uF015", 21 | TextColor = "Red", 22 | FontFamily = "FontAwesome-Solid", 23 | }, 24 | new 25 | { 26 | Title = "magnifying-glass", 27 | Icon = "\uF002", 28 | TextColor = "green", 29 | FontFamily = "FontAwesome-Solid", 30 | }, 31 | new 32 | { 33 | Title = "user", 34 | Icon = "\uF007", 35 | TextColor = "orange", 36 | FontFamily = "FontAwesome-Solid", 37 | }, 38 | new 39 | { 40 | Title = "facebook", 41 | Icon = "\uF09a", 42 | TextColor = "blue", 43 | FontFamily = "FontAwesome-Brands", 44 | }, 45 | new 46 | { 47 | Title = "check", 48 | Icon = "\uF00c", 49 | TextColor = "green", 50 | FontFamily = "FontAwesome-Solid", 51 | }, 52 | new 53 | { 54 | Title = "download", 55 | Icon = "\uF019", 56 | TextColor = "Red", 57 | FontFamily = "FontAwesome-Solid", 58 | }, 59 | }; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /samples/src/ViewModels/Others/StyleSamplesViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class StyleSamplesViewModel : ViewModelBase 6 | { 7 | public StyleSamplesViewModel(INavigationService navService) 8 | : base(navService) { } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VButtonViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VButtonViewModel : ViewModelBase 6 | { 7 | public VButtonViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VButton Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isLoading; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VCardViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VCardViewModel : ViewModelBase 6 | { 7 | public VCardViewModel(INavigationService navService) 8 | : base(navService) { } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VCheckBoxButtonViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VCheckBoxButtonViewModel : ViewModelBase 6 | { 7 | public VCheckBoxButtonViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VCheckBoxButtonView Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isExpanded = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VCheckBoxGroupViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Samples.Services.Navigation; 3 | 4 | namespace VControl.Samples.ViewModels; 5 | 6 | public partial class VCheckBoxGroupViewModel : ViewModelBase 7 | { 8 | public VCheckBoxGroupViewModel(INavigationService navService) 9 | : base(navService) 10 | { 11 | this.PageTitle = "VCheckBoxGroupView Samples"; 12 | 13 | CityList = new ObservableCollection() 14 | { 15 | "Austin", 16 | "Washington", 17 | "Denver", 18 | "Chicago", 19 | "Seattle", 20 | "New York", 21 | "Los Angeles", 22 | }; 23 | 24 | CollectionModel1 = new EmailCheckableCollectionModel(); 25 | } 26 | 27 | [ObservableProperty] 28 | public ObservableCollection _cityList; 29 | 30 | [ObservableProperty] 31 | private EmailCheckableCollectionModel _collectionModel1; 32 | } 33 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VCheckBoxViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VCheckBoxViewModel : ViewModelBase 6 | { 7 | public VCheckBoxViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VButton Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isIndeterminate = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VCheckableCollectionViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Samples.Common; 3 | using VControl.Samples.Models; 4 | using VControl.Samples.Services.Navigation; 5 | 6 | namespace VControl.Samples.ViewModels; 7 | 8 | public partial class VCheckableCollectionViewModel : ViewModelBase 9 | { 10 | public VCheckableCollectionViewModel(INavigationService navService) 11 | : base(navService) 12 | { 13 | this.PageTitle = "VTouchContentView Samples"; 14 | CollectionModel1 = new EmailCheckableCollectionModel(); 15 | CollectionModel2 = new EmailCheckableCollectionModel(); 16 | CollectionModel3 = new EmailCheckableCollectionModel(); 17 | } 18 | 19 | [ObservableProperty] 20 | private EmailCheckableCollectionModel _collectionModel1; 21 | 22 | [ObservableProperty] 23 | private EmailCheckableCollectionModel _collectionModel2; 24 | 25 | [ObservableProperty] 26 | private EmailCheckableCollectionModel _collectionModel3; 27 | } 28 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VCollectionViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VCollectionViewModel : ViewModelBase 6 | { 7 | [ObservableProperty] 8 | private bool _isExpanded = true; 9 | 10 | public VCollectionViewModel(INavigationService navService) 11 | : base(navService) 12 | { 13 | this.PageTitle = "VCollectionView Samples"; 14 | CollectionModel1 = new EmailCheckableCollectionModel(); 15 | CollectionModel2 = new EmailCheckableCollectionModel(); 16 | CollectionModel3 = new EmailCheckableCollectionModel(); 17 | } 18 | 19 | [ObservableProperty] 20 | private EmailCheckableCollectionModel _collectionModel1; 21 | 22 | [ObservableProperty] 23 | private EmailCheckableCollectionModel _collectionModel2; 24 | 25 | [ObservableProperty] 26 | private EmailCheckableCollectionModel _collectionModel3; 27 | } 28 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VDateNativePickerViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VDateNativePickerViewModel : ViewModelBase 6 | { 7 | public VDateNativePickerViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VDateNativePickerView Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isExpanded = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VEditorViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VEditorViewModel : ViewModelBase 6 | { 7 | public VEditorViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VEditor Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isIndeterminate = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VEntryViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VEntryViewModel : ViewModelBase 6 | { 7 | public VEntryViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VEntry Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isIndeterminate = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VExpanderViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VExpanderViewModel : ViewModelBase 6 | { 7 | public VExpanderViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VExpanderView Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isExpanded = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VFormItemViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VFormItemViewModel : ViewModelBase 6 | { 7 | public VFormItemViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VFormItemView Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _hasInfo = true; 15 | 16 | [ObservableProperty] 17 | private bool _hasTitle = true; 18 | 19 | [ObservableProperty] 20 | private bool _isInvalid = true; 21 | } 22 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VIndicatorViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VIndicatorViewModel : ViewModelBase 6 | { 7 | public VIndicatorViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VIndicatorView Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isExpanded = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VMenuCellViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VMenuCellViewModel : ViewModelBase 6 | { 7 | public VMenuCellViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VMenuCell Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isLoading; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VNumberEntryViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VNumberEntryViewModel : ViewModelBase 6 | { 7 | public VNumberEntryViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VNumberEntryView Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isIndeterminate = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VPickerViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Samples.Models; 3 | using VControl.Samples.Services.Navigation; 4 | 5 | namespace VControl.Samples.ViewModels; 6 | 7 | public partial class VPickerViewModel : ViewModelBase 8 | { 9 | 10 | public VPickerViewModel(INavigationService navService) 11 | : base(navService) 12 | { 13 | this.SalutationList = new() 14 | { 15 | new PickerM { Value = "-NULL-" }, 16 | new PickerM { Id = "1", Value = "Mr." }, 17 | new PickerM { Id = "2", Value = "Ms." }, 18 | new PickerM { Id = "3", Value = "Mrs." }, 19 | new PickerM { Id = "4", Value = "Miss." }, 20 | 21 | }; 22 | 23 | 24 | this.AgeList = new(); 25 | for (int i = 14; i < 23; i++) 26 | { 27 | 28 | AgeList.Add(new PickerM { Value = i.ToString() } 29 | ); 30 | } 31 | 32 | } 33 | 34 | [ObservableProperty] 35 | private ObservableCollection _salutationList; 36 | 37 | [ObservableProperty] 38 | private PickerM _selectedSalutation = new(); 39 | 40 | 41 | [ObservableProperty] 42 | private ObservableCollection _ageList; 43 | 44 | [ObservableProperty] 45 | private PickerM _selectedAge = new(); 46 | [ObservableProperty] 47 | private string _displayPropertyName = "Value"; 48 | 49 | } 50 | 51 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VPlaceholderViewViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VPlaceholderViewViewModel : ViewModelBase 6 | { 7 | public VPlaceholderViewViewModel(INavigationService navService) 8 | : base(navService) { } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VRadioButtonGroupViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Controls; 3 | using VControl.Samples.Services.Navigation; 4 | 5 | namespace VControl.Samples.ViewModels; 6 | 7 | public partial class VRadioButtonGroupViewModel : ViewModelBase 8 | { 9 | public VRadioButtonGroupViewModel(INavigationService navService) 10 | : base(navService) 11 | { 12 | InspTypeList = new ObservableCollection() 13 | { 14 | new RadioButtonModel() 15 | { 16 | Id = "1", 17 | Value = "Booking", 18 | Icon = "\uF0eb", 19 | }, 20 | new RadioButtonModel() 21 | { 22 | Id = "2", 23 | Value = "Reports", 24 | Icon = "\uE4f0", 25 | }, 26 | new RadioButtonModel() 27 | { 28 | Id = "3", 29 | Value = "Documents", 30 | Icon = "\uF15b", 31 | }, 32 | }; 33 | this.InspType = InspTypeList.FirstOrDefault().Id; 34 | 35 | InspTypeList2 = new ObservableCollection() 36 | { 37 | new RadioButtonModel() { Id = "1", Value = "Booking" }, 38 | new RadioButtonModel() { Id = "2", Value = "Reports" }, 39 | new RadioButtonModel() { Id = "3", Value = "Documents" }, 40 | }; 41 | } 42 | 43 | [ObservableProperty] 44 | private ObservableCollection _inspTypeList; 45 | 46 | [ObservableProperty] 47 | private ObservableCollection _inspTypeList2; 48 | 49 | [ObservableProperty] 50 | private string _inspType; 51 | } 52 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VRadioButtonViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Controls; 3 | using VControl.Controls.VExpandable; 4 | using VControl.Samples.Services.Navigation; 5 | 6 | namespace VControl.Samples.ViewModels; 7 | 8 | public partial class VRadioButtonViewModel : ViewModelBase 9 | { 10 | public VRadioButtonViewModel(INavigationService navService) 11 | : base(navService) { } 12 | } 13 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VRichTextEditorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.ComponentModel; 3 | using VControl.Samples.Models; 4 | using VControl.Samples.Services.Navigation; 5 | 6 | namespace VControl.Samples.ViewModels; 7 | 8 | public partial class VRichTextEditorViewModel : ViewModelBase 9 | { 10 | public VRichTextEditorViewModel(INavigationService navService) 11 | : base(navService) 12 | { 13 | this.PageTitle = "VRichTextEditorView Samples"; 14 | } 15 | 16 | [ObservableProperty] 17 | private string _content; 18 | 19 | [ObservableProperty] 20 | private string _placeHolder; 21 | 22 | [ObservableProperty] 23 | private string _htmlContent; 24 | } 25 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VSearchBarViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VSearchBarViewModel : ViewModelBase 6 | { 7 | public VSearchBarViewModel(INavigationService navService) 8 | : base(navService) 9 | { 10 | this.PageTitle = "VSearchBarView Samples"; 11 | } 12 | 13 | [ObservableProperty] 14 | private bool _isIndeterminate = true; 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VTopAppBarAnimationWithScrollerView.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class AnimationWithScrollerViewModel : ViewModelBase 6 | { 7 | public AnimationWithScrollerViewModel(INavigationService navService) 8 | : base(navService) { } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VTopAppBarViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VTopAppBarViewModel : ViewModelBase 6 | { 7 | public VTopAppBarViewModel(INavigationService navService) 8 | : base(navService) { } 9 | 10 | [ObservableProperty] 11 | private double _progress; 12 | 13 | [ObservableProperty] 14 | private bool _isLoading; 15 | 16 | [RelayCommand] 17 | private async Task MoreAsync(object obj) 18 | { 19 | await this.AlertOkayAsync(obj.ToString()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VTouchContentViewViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Samples.Services.Navigation; 3 | 4 | namespace VControl.Samples.ViewModels; 5 | 6 | public partial class VTouchContentViewViewModel : ViewModelBase 7 | { 8 | public VTouchContentViewViewModel(INavigationService navService) 9 | : base(navService) 10 | { 11 | this.PageTitle = "VTouchContentView Samples"; 12 | _debugMessages = new ObservableCollection() { "-----------Start------------" }; 13 | } 14 | 15 | [ObservableProperty] 16 | private ObservableCollection _debugMessages; 17 | } 18 | -------------------------------------------------------------------------------- /samples/src/ViewModels/VUploaderViewModel.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Services.Navigation; 2 | 3 | namespace VControl.Samples.ViewModels; 4 | 5 | public partial class VUploaderViewModel : ViewModelBase 6 | { 7 | public VUploaderViewModel(INavigationService navService) 8 | : base(navService) { } 9 | } 10 | -------------------------------------------------------------------------------- /samples/src/Views/Base/ContentPageBase.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | 3 | namespace VControl.Samples.Views.Base; 4 | 5 | public abstract class ContentPageBase : ContentPageBase 6 | where TViewModel : ViewModelBase 7 | { 8 | public ContentPageBase(TViewModel viewModel) 9 | : base(viewModel) { } 10 | } 11 | 12 | public abstract class ContentPageBase : ContentPage 13 | { 14 | public ContentPageBase(object? viewModel = null) 15 | { 16 | HideSoftInputOnTapped = true; 17 | 18 | BindingContext = viewModel; 19 | 20 | if (string.IsNullOrWhiteSpace(Title) && GetType() != null) 21 | { 22 | Title = 23 | viewModel == null && viewModel is IViewModelBase viewModelBase 24 | ? viewModelBase.PageTitle 25 | : GetType().Name; 26 | } 27 | 28 | NavigationPage.SetBackButtonTitle(this, string.Empty); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /samples/src/Views/Base/PopupContentPageBase.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Samples.Views.Base; 2 | 3 | public abstract class PopupContentPageBase : PopupContentPageBase 4 | where TViewModel : ViewModelBase 5 | { 6 | public PopupContentPageBase(TViewModel viewModel) 7 | : base(viewModel) 8 | { 9 | this.Opened += PopupBase_Opened; 10 | } 11 | 12 | public abstract void PopupBase_Opened( 13 | object sender, 14 | CommunityToolkit.Maui.Core.PopupOpenedEventArgs e 15 | ); 16 | 17 | public new TViewModel BindingContext => (TViewModel)base.BindingContext; 18 | } 19 | 20 | public abstract class PopupContentPageBase : CommunityToolkit.Maui.Views.Popup 21 | { 22 | private readonly IDeviceDisplay deviceDisplay; 23 | 24 | public PopupContentPageBase(object? viewModel = null) 25 | { 26 | BindingContext = viewModel; 27 | NavigationPage.SetBackButtonTitle(this, string.Empty); 28 | this.deviceDisplay = DeviceDisplay.Current; 29 | this.deviceDisplay.MainDisplayInfoChanged += DeviceDisplay_MainDisplayInfoChanged; 30 | this.Opened += PopupContentPageBase_Opened; 31 | } 32 | 33 | private void PopupContentPageBase_Opened( 34 | object sender, 35 | CommunityToolkit.Maui.Core.PopupOpenedEventArgs e 36 | ) 37 | { 38 | var displayInfo = this.deviceDisplay.MainDisplayInfo; 39 | SetSize(displayInfo); 40 | } 41 | 42 | private void DeviceDisplay_MainDisplayInfoChanged(object sender, DisplayInfoChangedEventArgs e) 43 | { 44 | var displayInfo = e.DisplayInfo; 45 | // 新的宽度和高度 46 | SetSize(displayInfo); 47 | } 48 | 49 | protected virtual void SetSize(DisplayInfo displayInfo) 50 | { 51 | var newWidth = displayInfo.Width; 52 | var newHeight = displayInfo.Height * VerticalHRatio; 53 | 54 | var d = displayInfo.Density; 55 | PopupSize = new Size(newWidth / d, newHeight / d); 56 | this.Size = PopupSize; 57 | } 58 | 59 | public Size PopupSize { get; set; } 60 | public double VerticalHRatio { get; set; } = 0.8; 61 | } 62 | -------------------------------------------------------------------------------- /samples/src/Views/Others/ColorsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class ColorsPage : ContentPageBase 6 | { 7 | public ColorsPage(ColorsPageViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e) { } 14 | } 15 | -------------------------------------------------------------------------------- /samples/src/Views/Others/HomePage.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class HomePage : ContentPageBase 6 | { 7 | public HomePage(HomeViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e) { } 14 | 15 | private void ScrollView_Scrolled(object sender, ScrolledEventArgs e) 16 | { 17 | var progress = Math.Min(65, e.ScrollY) / 65; 18 | this.MainTopAppBar.Progress = progress; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /samples/src/Views/Others/IconsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class IconsPage : ContentPageBase 6 | { 7 | public IconsPage(IconsPageViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e) { } 14 | } 15 | -------------------------------------------------------------------------------- /samples/src/Views/Others/StyleSamplesPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class StyleSamplesPage : ContentPageBase 6 | { 7 | public StyleSamplesPage(StyleSamplesViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e) { } 14 | } 15 | -------------------------------------------------------------------------------- /samples/src/Views/VButtonView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VButtonView : ContentPageBase 6 | { 7 | public VButtonView(VButtonViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/src/Views/VCardView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VCardView : ContentPageBase 6 | { 7 | public VCardView(VCardViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/src/Views/VCheckBoxButtonView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Linq; 3 | using System.Windows.Input; 4 | using Microsoft.Maui.Controls; 5 | using Microsoft.Maui.Controls.Compatibility; 6 | using Microsoft.Maui.Layouts; 7 | using VControl.Samples.Views.Base; 8 | 9 | namespace VControl.Samples.Views; 10 | 11 | public partial class VCheckBoxButtonView : ContentPageBase 12 | { 13 | public VCheckBoxButtonView(VCheckBoxButtonViewModel viewModel) 14 | : base(viewModel) 15 | { 16 | InitializeComponent(); 17 | } 18 | } -------------------------------------------------------------------------------- /samples/src/Views/VCheckBoxGroupView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | using System.Collections.Specialized; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Runtime.CompilerServices; 7 | using System.Windows.Input; 8 | using Microsoft.Maui.Controls; 9 | using Microsoft.Maui.Layouts; 10 | using VControl.Controls; 11 | using VControl.Samples.Views.Base; 12 | 13 | namespace VControl.Samples.Views; 14 | 15 | 16 | public partial class VCheckBoxGroupView : ContentPageBase 17 | { 18 | public VCheckBoxGroupView(VCheckBoxGroupViewModel viewModel) 19 | : base(viewModel) 20 | { 21 | InitializeComponent(); 22 | } 23 | } -------------------------------------------------------------------------------- /samples/src/Views/VCheckBoxView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Linq; 3 | using System.Windows.Input; 4 | using Microsoft.Maui.Controls; 5 | using Microsoft.Maui.Controls.Compatibility; 6 | using Microsoft.Maui.Layouts; 7 | using VControl.Samples.Views.Base; 8 | 9 | namespace VControl.Samples.Views; 10 | 11 | public partial class VCheckBoxView : ContentPageBase 12 | { 13 | public VCheckBoxView(VCheckBoxViewModel viewModel) 14 | : base(viewModel) 15 | { 16 | InitializeComponent(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /samples/src/Views/VCheckableCollectionView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | using System.Collections.Specialized; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Runtime.CompilerServices; 7 | using System.Windows.Input; 8 | using Microsoft.Maui.Controls; 9 | using Microsoft.Maui.Layouts; 10 | using VControl.Controls; 11 | using VControl.Samples.Views.Base; 12 | 13 | namespace VControl.Samples.Views; 14 | 15 | public partial class VCheckableCollectionView : ContentPageBase 16 | { 17 | public VCheckableCollectionView(VCheckableCollectionViewModel viewModel) 18 | : base(viewModel) 19 | { 20 | InitializeComponent(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /samples/src/Views/VCollectionView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | using System.Collections.Specialized; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Runtime.CompilerServices; 7 | using System.Windows.Input; 8 | using Microsoft.Maui.Controls; 9 | using Microsoft.Maui.Layouts; 10 | using VControl.Controls; 11 | using VControl.Samples.Views.Base; 12 | 13 | namespace VControl.Samples.Views; 14 | 15 | public partial class VCollectionView : ContentPageBase 16 | { 17 | public VCollectionView(VCollectionViewModel viewModel) 18 | : base(viewModel) 19 | { 20 | InitializeComponent(); 21 | } 22 | } -------------------------------------------------------------------------------- /samples/src/Views/VDateNativePickerView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /samples/src/Views/VDateNativePickerView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VDateNativePickerView : ContentPageBase 6 | { 7 | public VDateNativePickerView(VDateNativePickerViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | } -------------------------------------------------------------------------------- /samples/src/Views/VDatePickerView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Collections.Specialized; 3 | using System.ComponentModel; 4 | using System.Globalization; 5 | using System.Windows.Input; 6 | using Microsoft.Maui.Controls; 7 | using Microsoft.Maui.Controls.Shapes; 8 | using Microsoft.Maui.Platform; 9 | using VControl.Controls.VCalendar; 10 | using VControl.Samples.Views.Base; 11 | 12 | namespace VControl.Samples.Views; 13 | 14 | public partial class VDatePickerView : ContentPageBase 15 | { 16 | public VDatePickerView(VDatePickerViewModel viewModel) 17 | : base(viewModel) 18 | { 19 | InitializeComponent(); 20 | } 21 | 22 | private void TextCell_Tapped(object sender, EventArgs e) 23 | { 24 | MainDatePicker.SetAll(false); 25 | } 26 | 27 | private void TextCell_Tapped_1(object sender, EventArgs e) 28 | { 29 | MainDatePicker.SetAll(true); 30 | } 31 | 32 | private void TextCell_Tapped_2(object sender, EventArgs e) 33 | { 34 | MainDatePicker.TrySetSelectedDate((sender as SwitchCell).On, DateTime.Now); 35 | } 36 | 37 | private void TextCell_Tapped_3(object sender, EventArgs e) 38 | { 39 | MainDatePicker.JumpToDate(DateTime.Now); 40 | } 41 | 42 | private void SwitchCell_OnChanged(object sender, ToggledEventArgs e) 43 | { 44 | MainDatePicker.TrySetSelectedDate((sender as SwitchCell).On, DateTime.Now); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /samples/src/Views/VEditorView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Windows.Input; 3 | using VControl.Samples.Views.Base; 4 | 5 | namespace VControl.Samples.Views; 6 | 7 | public partial class VEditorView : ContentPageBase 8 | { 9 | public VEditorView(VEditorViewModel viewModel) 10 | : base(viewModel) 11 | { 12 | InitializeComponent(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /samples/src/Views/VEntryView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Windows.Input; 3 | using Microsoft.Maui.Controls.Compatibility; 4 | using VControl.Samples.Views.Base; 5 | 6 | namespace VControl.Samples.Views; 7 | 8 | public partial class VEntryView : ContentPageBase 9 | { 10 | public VEntryView(VEntryViewModel viewModel) 11 | : base(viewModel) 12 | { 13 | InitializeComponent(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/Views/VExpanderView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Windows.Input; 3 | using VControl.Controls.VExpandable; 4 | using VControl.Samples.Views.Base; 5 | 6 | namespace VControl.Samples.Views; 7 | 8 | public partial class VExpanderView : ContentPageBase 9 | { 10 | public VExpanderView(VExpanderViewModel viewModel) 11 | : base(viewModel) 12 | { 13 | InitializeComponent(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/Views/VFormItemView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Input; 2 | using VControl.Samples.Views.Base; 3 | 4 | namespace VControl.Samples.Views; 5 | 6 | 7 | 8 | public partial class VFormItemView : ContentPageBase 9 | { 10 | public VFormItemView(VFormItemViewModel viewModel) 11 | : base(viewModel) 12 | { 13 | InitializeComponent(); 14 | } 15 | } -------------------------------------------------------------------------------- /samples/src/Views/VIndicatorView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /samples/src/Views/VIndicatorView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | 6 | public partial class VIndicatorView : ContentPageBase 7 | { 8 | public VIndicatorView(VIndicatorViewModel viewModel) 9 | : base(viewModel) 10 | { 11 | InitializeComponent(); 12 | } 13 | } -------------------------------------------------------------------------------- /samples/src/Views/VMenuCellView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Input; 2 | using VControl.Samples.Views.Base; 3 | 4 | namespace VControl.Samples.Views; 5 | 6 | public partial class VMenuCellView : ContentPageBase 7 | { 8 | public VMenuCellView(VMenuCellViewModel viewModel) 9 | : base(viewModel) 10 | { 11 | InitializeComponent(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /samples/src/Views/VNumberEntryView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Runtime.CompilerServices; 3 | using System.Windows.Input; 4 | using VControl.Samples.Views.Base; 5 | 6 | namespace VControl.Samples.Views; 7 | 8 | public partial class VNumberEntryView : ContentPageBase 9 | { 10 | public VNumberEntryView(VNumberEntryViewModel viewModel) 11 | : base(viewModel) 12 | { 13 | InitializeComponent(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/Views/VPickerView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | using System.Collections.Specialized; 4 | using System.Runtime.CompilerServices; 5 | using System.Windows.Input; 6 | using VControl.Samples.Views.Base; 7 | 8 | namespace VControl.Samples.Views; 9 | 10 | 11 | public partial class VPickerView : ContentPageBase 12 | { 13 | public VPickerView(VPickerViewModel viewModel) 14 | : base(viewModel) 15 | { 16 | InitializeComponent(); 17 | } 18 | } -------------------------------------------------------------------------------- /samples/src/Views/VPlaceholderViewView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /samples/src/Views/VPlaceholderViewView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VPlaceholderViewView : ContentPageBase 6 | { 7 | public VPlaceholderViewView(VPlaceholderViewViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/src/Views/VRadioButtonGroupView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VRadioButtonGroupView : ContentPageBase 6 | { 7 | public VRadioButtonGroupView(VRadioButtonGroupViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/src/Views/VRadioButtonView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /samples/src/Views/VRadioButtonView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VRadioButtonView : ContentPageBase 6 | { 7 | public VRadioButtonView(VRadioButtonViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/src/Views/VRichTextEditorView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /samples/src/Views/VRichTextEditorView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using VControl.Samples.Views.Base; 3 | 4 | namespace VControl.Samples.Views; 5 | 6 | public partial class VRichTextEditorView : ContentPageBase 7 | { 8 | public VRichTextEditorView(VRichTextEditorViewModel viewModel) 9 | : base(viewModel) 10 | { 11 | InitializeComponent(); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /samples/src/Views/VSearchBarView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Windows.Input; 3 | using VControl.Samples.Views.Base; 4 | 5 | namespace VControl.Samples.Views; 6 | 7 | public partial class VSearchBarView : ContentPageBase 8 | { 9 | public VSearchBarView(VSearchBarViewModel viewModel) 10 | : base(viewModel) 11 | { 12 | InitializeComponent(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /samples/src/Views/VTagPickerView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | using System.Collections.Specialized; 4 | using System.Runtime.CompilerServices; 5 | using System.Windows.Input; 6 | using Microsoft.Maui.Controls; 7 | using VControl.Controls; 8 | using VControl.Samples.Views.Base; 9 | 10 | namespace VControl.Samples.Views; 11 | 12 | public partial class VTagPickerView : ContentPageBase 13 | { 14 | public VTagPickerView(VTagPickerViewModel viewModel) 15 | : base(viewModel) 16 | { 17 | InitializeComponent(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /samples/src/Views/VTimeLineView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using VControl.Samples.Views.Base; 3 | 4 | namespace VControl.Samples.Views; 5 | 6 | public partial class VTimeLineView : ContentPageBase 7 | { 8 | public VTimeLineView(VTimeLineViewModel viewModel) 9 | : base(viewModel) 10 | { 11 | InitializeComponent(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /samples/src/Views/VTopAppBarAnimationWithScrollerView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class AnimationWithScrollerView : ContentPageBase 6 | { 7 | public AnimationWithScrollerView(AnimationWithScrollerViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void ScrollView_Scrolled(object sender, ScrolledEventArgs e) 14 | { 15 | var progress = Math.Min(65, e.ScrollY) / 65; 16 | this.MainTopAppBar.Progress = progress; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /samples/src/Views/VTopAppBarView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VTopAppBarView : ContentPageBase 6 | { 7 | public VTopAppBarView(VTopAppBarViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/src/Views/VTouchContentViewView.xaml.cs: -------------------------------------------------------------------------------- 1 | using VControl.Samples.Views.Base; 2 | 3 | namespace VControl.Samples.Views; 4 | 5 | public partial class VTouchContentViewView : ContentPageBase 6 | { 7 | public VTouchContentViewView(VTouchContentViewViewModel viewModel) 8 | : base(viewModel) 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void TouchContentView_OnTouchActionInvoked( 14 | object sender, 15 | Controls.TouchActionEventArgs e 16 | ) 17 | { 18 | var msg = e.Type + " is Invoked, position:" + e.Location; 19 | (BindingContext as VTouchContentViewViewModel).DebugMessages.Insert(0, msg); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /samples/src/Views/VUploaderView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /samples/src/Views/VUploaderView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | using System.Collections.Specialized; 4 | using System.Windows.Input; 5 | using VControl.Samples.Views.Base; 6 | 7 | namespace VControl.Samples.Views; 8 | 9 | 10 | 11 | public partial class VUploaderView : ContentPageBase 12 | { 13 | public VUploaderView(VUploaderViewModel viewModel) 14 | : base(viewModel) 15 | { 16 | InitializeComponent(); 17 | } 18 | } -------------------------------------------------------------------------------- /samples/src/Views/VValidatingEntryView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Windows.Input; 3 | using VControl.Controls.Validations; 4 | using VControl.Samples.Views.Base; 5 | 6 | namespace VControl.Samples.Views; 7 | 8 | public partial class VValidatingEntryView : ContentPageBase 9 | { 10 | public VValidatingEntryView(VValidatingEntryViewModel viewModel) 11 | : base(viewModel) 12 | { 13 | InitializeComponent(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/src/Views/VValidatingPickerView.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 32 | 33 | -------------------------------------------------------------------------------- /samples/src/Views/VValidatingPickerView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.ObjectModel; 3 | using System.Windows.Input; 4 | using VControl.Controls.Validations; 5 | using VControl.Samples.Views.Base; 6 | 7 | namespace VControl.Samples.Views; 8 | 9 | 10 | public partial class VValidatingPickerView : ContentPageBase 11 | { 12 | public VValidatingPickerView(VValidatingPickerViewModel viewModel) 13 | : base(viewModel) 14 | { 15 | InitializeComponent(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Controls/ItemWrapper/VItemWrapper.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public partial class VItemWrapper : ItemWrapperBase 4 | { 5 | private int _index; 6 | 7 | private bool _isSelected; 8 | 9 | private bool _isEnabled; 10 | 11 | private bool _hasRemove; 12 | 13 | private bool _hasEdit; 14 | 15 | public int Index 16 | { 17 | get => _index; 18 | set => SetProperty(ref _index, value); 19 | } 20 | 21 | public bool IsSelected 22 | { 23 | get => _isSelected; 24 | set => SetProperty(ref _isSelected, value); 25 | } 26 | 27 | public bool IsEnabled 28 | { 29 | get => _isEnabled; 30 | set => SetProperty(ref _isEnabled, value); 31 | } 32 | 33 | public bool HasRemove 34 | { 35 | get => _hasRemove; 36 | set => SetProperty(ref _hasRemove, value); 37 | } 38 | 39 | public bool HasEdit 40 | { 41 | get => _hasEdit; 42 | set => SetProperty(ref _hasEdit, value); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Controls/ItemWrapper/VPickerItemWrapper.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public class VPickerItemWrapper : ItemWrapperBase { } 4 | } 5 | -------------------------------------------------------------------------------- /src/Controls/TouchRecognizer/ITouchRecognizer.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public interface ITouchRecognizer : IDisposable 4 | { 5 | event EventHandler OnTouchActionInvoked; 6 | 7 | void Dispose(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Controls/TouchRecognizer/Region.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public class Region 4 | { 5 | public Region() { } 6 | 7 | public Region(double sx, double ex, double sy, double ey, string name = "") 8 | : this() 9 | { 10 | StartX = sx; 11 | EndX = ex; 12 | StartY = sy; 13 | EndY = ey; 14 | Name = name; 15 | } 16 | 17 | public string Name { get; set; } 18 | 19 | public double StartX { get; set; } 20 | 21 | public double EndX { get; set; } 22 | 23 | public double StartY { get; set; } 24 | 25 | public double EndY { get; set; } 26 | 27 | public double Width => EndX - StartX; 28 | 29 | public double Height => EndY - StartY; 30 | 31 | public bool Contains(Region content) 32 | { 33 | var translationX = 0; 34 | var translationY = 0; 35 | var isXin = 36 | translationX >= StartX - content.Width / 2 37 | && translationX <= EndX - content.Width / 2; 38 | var isYin = 39 | translationY >= StartY - content.Height / 2 40 | && translationY <= EndY - content.Height / 2; 41 | return isXin && isYin; 42 | } 43 | 44 | public bool Contains(Point point) 45 | { 46 | var translationX = 0; 47 | var translationY = 0; 48 | var isXin = translationX >= StartX - point.X && translationX <= EndX - point.X; 49 | var isYin = translationY >= StartY - point.Y && translationY <= EndY - point.Y; 50 | return isXin && isYin; 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Controls/TouchRecognizer/TouchActionEventArgs.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public class TouchActionEventArgs : EventArgs 4 | { 5 | public TouchActionEventArgs(long id, TouchActionType type, Point location, bool isInContact) 6 | { 7 | Id = id; 8 | Type = type; 9 | Location = location; 10 | IsInContact = isInContact; 11 | } 12 | 13 | public long Id { private set; get; } 14 | 15 | public TouchActionType Type { private set; get; } 16 | 17 | public Point Location { private set; get; } 18 | 19 | public bool IsInContact { private set; get; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Controls/TouchRecognizer/TouchActionEventHandler.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public delegate void TouchActionEventHandler(object sender, TouchActionEventArgs args); 4 | } 5 | -------------------------------------------------------------------------------- /src/Controls/TouchRecognizer/TouchActionType.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public enum TouchActionType 4 | { 5 | Entered, 6 | Pressed, 7 | Moved, 8 | Released, 9 | Exited, 10 | Cancelled, 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Controls/VButton.xaml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 18 | 27 | 28 | 29 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/Controls/VButton/ButtonStyles.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public enum ButtonStyles 4 | { 5 | Light, 6 | Text, 7 | Primary, 8 | Outlined, 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Controls/VButton/ButtonVisualState.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public enum ButtonVisualState 4 | { 5 | Normal, 6 | MouseOver, 7 | Pressed, 8 | Disabled, 9 | Busy, 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Controls/VCalendar/CalendarModel.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.VCalendar 2 | { 3 | public class CalendarModel 4 | { 5 | private const int MAX_WEEKS = 6; 6 | 7 | private const int MAX_DAYS = 7; 8 | 9 | private DateTime _currentDate; 10 | 11 | private DayModel[,] currentCalendar; 12 | 13 | public CalendarModel(DateTime baseDate) 14 | { 15 | _currentDate = baseDate; 16 | MakeCurrentCalendar(); 17 | } 18 | 19 | public DayModel[,] CurrentCalendar 20 | { 21 | get { return currentCalendar; } 22 | } 23 | 24 | public int CurrentYear 25 | { 26 | get { return _currentDate.Year; } 27 | } 28 | 29 | public int CurrentMonth 30 | { 31 | get { return _currentDate.Month; } 32 | } 33 | 34 | public void NextMonth() 35 | { 36 | _currentDate = _currentDate.AddMonths(1); 37 | MakeCurrentCalendar(); 38 | } 39 | 40 | public void PriorMonth() 41 | { 42 | _currentDate = _currentDate.AddMonths(-1); 43 | MakeCurrentCalendar(); 44 | } 45 | 46 | private void MakeCurrentCalendar() 47 | { 48 | currentCalendar = new DayModel[MAX_WEEKS, MAX_DAYS]; 49 | 50 | int lastDay = DateTime.DaysInMonth(_currentDate.Year, _currentDate.Month); 51 | 52 | DateTime cDate = new DateTime(_currentDate.Year, _currentDate.Month, 1); 53 | 54 | DayModel dayCellAux = null; 55 | 56 | for (int i = 1, line = 0; i <= lastDay; i++) 57 | { 58 | int j = Convert.ToInt32(cDate.DayOfWeek); 59 | dayCellAux = new DayModel(cDate, (line, j)); 60 | 61 | currentCalendar[line, j] = dayCellAux; 62 | 63 | if (cDate.DayOfWeek == DayOfWeek.Saturday) 64 | line++; 65 | 66 | cDate = cDate.AddDays(1); 67 | //SetCurrentDate(cDate, dayCellAux); 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/Controls/VCalendar/DayModel.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | 3 | namespace VControl.Controls.VCalendar 4 | { 5 | public class DayModel : INotifyPropertyChanged 6 | { 7 | public DayModel(DateTime date, (int, int) position = default) 8 | { 9 | Position = position; 10 | 11 | Date = date; 12 | } 13 | 14 | public event PropertyChangedEventHandler PropertyChanged; 15 | 16 | public DateTime Date { get; protected set; } 17 | 18 | public (int, int) Position { get; protected set; } 19 | 20 | public static DayModel GetDayNothing() 21 | { 22 | return new DayModel(DateTime.MinValue); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Controls/VCheckBoxGroup.xaml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/Controls/VCollection.xaml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 10 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 27 | 28 | 29 | 30 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/Controls/VDateNativePicker.xaml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/Controls/VEditor.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /src/Controls/VEntry.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 8 | 10 | 11 | 12 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/Controls/VExpandable/ExpandDirection.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.VExpandable 2 | { 3 | public enum ExpandDirection 4 | { 5 | Down, 6 | Up, 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/Controls/VExpandable/ExpandedChangedEventArgs.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.VExpandable 2 | { 3 | public class ExpandedChangedEventArgs(bool isExpanded) : EventArgs 4 | { 5 | /// 6 | /// True if Is Expanded. 7 | /// 8 | public bool IsExpanded { get; } = isExpanded; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Controls/VExpandable/ExpanderAnimation.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.VExpandable 2 | { 3 | public class ExpanderAnimation : IExpanderAnimation 4 | { 5 | protected uint AnimationLength { get; } = 150; 6 | 7 | public async Task OnCollapse(View view) 8 | { 9 | await view.ScaleYTo(0, AnimationLength, Easing.CubicOut); 10 | } 11 | 12 | public async Task OnExpand(View view) 13 | { 14 | await view.ScaleYTo(1, AnimationLength, Easing.CubicIn); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Controls/VExpandable/IExpanderAnimation.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.VExpandable 2 | { 3 | public interface IExpanderAnimation 4 | { 5 | Task OnExpand(View expanderView); 6 | 7 | Task OnCollapse(View expanderView); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Controls/VExpander.xaml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 20 | 23 | 38 | 39 | 40 | 41 | 42 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/Controls/VIndicator.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/Controls/VIndicator.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls; 2 | 3 | public partial class VIndicator : ContentView 4 | { 5 | public static readonly BindableProperty ProgressColorProperty = BindableProperty.Create( 6 | nameof(ProgressColor), 7 | typeof(Color), 8 | typeof(VIndicator) 9 | ); 10 | 11 | public static readonly BindableProperty IsBusyProperty = BindableProperty.Create( 12 | nameof(IsBusy), 13 | typeof(bool), 14 | typeof(VIndicator), 15 | false, 16 | propertyChanged: OnIsBusyChanged 17 | ); 18 | 19 | static void OnIsBusyChanged(BindableObject bindable, object oldValue, object newValue) 20 | { 21 | (bindable as VIndicator)?.OnIsBusyChanged(); 22 | } 23 | 24 | protected async void OnIsBusyChanged() 25 | { 26 | if (IsBusy) 27 | { 28 | MainActivityIndicator.IsRunning = true; 29 | await MainActivityIndicator.FadeTo(1); 30 | } 31 | else 32 | { 33 | MainActivityIndicator.IsRunning = false; 34 | await MainActivityIndicator.FadeTo(0); 35 | } 36 | } 37 | 38 | public bool IsBusy 39 | { 40 | get => (bool)GetValue(IsBusyProperty); 41 | set => SetValue(IsBusyProperty, value); 42 | } 43 | 44 | public Color ProgressColor 45 | { 46 | get => (Color)GetValue(ProgressColorProperty); 47 | set => SetValue(ProgressColorProperty, value); 48 | } 49 | 50 | public VIndicator() 51 | { 52 | InitializeComponent(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Controls/VMenuCell.xaml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 14 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/Controls/VNumberEntry.xaml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/Controls/VRadioButtonGroup/IRadioButtonModel.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public interface IRadioButtonModel 4 | { 5 | string Value { get; } 6 | 7 | string Id { get; } 8 | 9 | string Icon { get; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Controls/VRadioButtonGroup/RadioButtonGroupDirection.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public enum RadioButtonGroupDirection 4 | { 5 | Vertical, 6 | Horizontal 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/Controls/VRadioButtonGroup/RadioButtonModel.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public class RadioButtonModel : IRadioButtonModel 4 | { 5 | public string Value { get; set; } 6 | 7 | public string Id { get; set; } 8 | 9 | public string Icon { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Controls/VSearchBar.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 33 | 34 | 35 | 36 | 37 | 38 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/Controls/VTimeLine/ITimeLineItemModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace VControl.Controls 8 | { 9 | public interface ITimeLineItemModel 10 | { 11 | string Title { get; set; } 12 | 13 | string Details { get; set; } 14 | 15 | string Date { get; set; } 16 | 17 | TimeLineItemType Type { get; set; } 18 | 19 | 20 | Color TitleColor { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Controls/VTimeLine/TimeLineItemModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace VControl.Controls 8 | { 9 | public class TimeLineItemModel : ITimeLineItemModel 10 | { 11 | public string Title { get; set; } 12 | 13 | public string Details { get; set; } 14 | 15 | public string Date { get; set; } 16 | 17 | public TimeLineItemType Type { get; set; } 18 | 19 | 20 | public Color TitleColor { get; set; } = Application.Current?.Resources["OnSurface"] as Color; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Controls/VTimeLine/TimeLineItemType.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls; 2 | 3 | public enum TimeLineItemType 4 | { 5 | Normal, 6 | Active, 7 | Success, 8 | } 9 | -------------------------------------------------------------------------------- /src/Controls/VTopAppBar/VTopAppBarStyles.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls 2 | { 3 | public enum VTopAppBarStyles 4 | { 5 | Fixed, 6 | Active, 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/Controls/VValidatingEntry.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 11 | 12 | 13 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/Controls/VValidatingPicker.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 16 | 17 | 18 | 19 | 22 | 24 | 25 | 26 | 29 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/Controls/Validations/IValidatableObject.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | public interface IValidatableObject 4 | { 5 | bool IsValid { get; } 6 | bool Validate(); 7 | 8 | IEnumerable Errors { get; } 9 | } 10 | -------------------------------------------------------------------------------- /src/Controls/Validations/IValidationRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | public interface IValidationRule 4 | { 5 | string ValidationMessage { get; set; } 6 | 7 | bool Check(T value); 8 | } 9 | -------------------------------------------------------------------------------- /src/Controls/Validations/IsEmailRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | /// 4 | /// 是否邮箱 5 | /// 6 | /// 7 | public class IsEmailRule : IValidationRule 8 | { 9 | public string ValidationMessage { get; set; } 10 | 11 | public bool Check(T value) 12 | { 13 | if (value is string email && !string.IsNullOrWhiteSpace(email)) 14 | { 15 | return Validators.IsEmail(email); 16 | } 17 | 18 | return false; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Controls/Validations/IsNotNullOrEmptyRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | public class IsNotNullOrEmptyRule : IValidationRule 4 | { 5 | public string ValidationMessage { get; set; } 6 | 7 | public bool Check(T value) 8 | { 9 | if (value is string str) 10 | return !string.IsNullOrWhiteSpace(str); 11 | else if (!Equals(value, default(T))) 12 | return true; 13 | 14 | return false; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Controls/Validations/IsUserNameOrEmailRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | /// 4 | /// 是否用户名或邮箱 5 | /// 6 | /// 7 | public class IsUserNameOrEmailRule : IValidationRule 8 | { 9 | public string ValidationMessage { get; set; } 10 | 11 | public bool Check(T value) 12 | { 13 | if (value is string val && !string.IsNullOrWhiteSpace(val)) 14 | { 15 | return Validators.IsAccount(val) || Validators.IsEmail(val); 16 | } 17 | 18 | return false; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Controls/Validations/LessThanRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | public class LessThanRule : IValidationRule 4 | { 5 | private readonly double _upperLimitValue; 6 | private readonly bool _isEqualValid; 7 | 8 | public LessThanRule(double value, bool isEqualValid = false) 9 | { 10 | this._upperLimitValue = value; 11 | this._isEqualValid = isEqualValid; 12 | } 13 | 14 | public string ValidationMessage { get; set; } 15 | 16 | public bool Check(T value) => 17 | _isEqualValid ? Convert.ToDouble(value) <= _upperLimitValue : Convert.ToDouble(value) < _upperLimitValue; 18 | } 19 | -------------------------------------------------------------------------------- /src/Controls/Validations/MaxLenRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | public class MaxLenRule : IValidationRule 4 | { 5 | private readonly int _maxLen; 6 | 7 | public MaxLenRule(int maxLength) 8 | { 9 | _maxLen = maxLength; 10 | } 11 | 12 | public string ValidationMessage { get; set; } 13 | 14 | public bool Check(T value) => 15 | value is string str && !string.IsNullOrWhiteSpace(str) && str.Length <= _maxLen; 16 | } 17 | -------------------------------------------------------------------------------- /src/Controls/Validations/MinCountOfDigitRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | 4 | public class MinCountOfDigitRule : IValidationRule 5 | { 6 | private readonly int _minCount; 7 | 8 | public MinCountOfDigitRule(int minCount = 1) 9 | { 10 | _minCount = minCount; 11 | } 12 | 13 | public string ValidationMessage { get; set; } 14 | 15 | public bool Check(T value) 16 | { 17 | if (value is string val && !string.IsNullOrWhiteSpace(val)) 18 | { 19 | return Validators.CountOfDigit(val) >= _minCount; 20 | } 21 | 22 | return false; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Controls/Validations/MinCountOfUpperLetterRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | /// 4 | /// 是否用户名或邮箱 5 | /// 6 | /// 7 | public class MinCountOfUpperLetterRule : IValidationRule 8 | { 9 | private readonly int _minCount; 10 | 11 | public MinCountOfUpperLetterRule(int minCount = 1) 12 | { 13 | _minCount = minCount; 14 | } 15 | 16 | public string ValidationMessage { get; set; } 17 | 18 | public bool Check(T value) 19 | { 20 | if (value is string val && !string.IsNullOrWhiteSpace(val)) 21 | { 22 | return Validators.CountOfUpperLetter(val) >= _minCount; 23 | } 24 | 25 | return false; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Controls/Validations/MinLenRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | public class MinLenRule : IValidationRule 4 | { 5 | private readonly int _minLen; 6 | 7 | public MinLenRule(int minLength) 8 | { 9 | _minLen = minLength; 10 | } 11 | 12 | public string ValidationMessage { get; set; } 13 | 14 | public bool Check(T value) => 15 | value is string str && !string.IsNullOrWhiteSpace(str) && str.Length >= _minLen; 16 | } 17 | -------------------------------------------------------------------------------- /src/Controls/Validations/MoreThanRule.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Controls.Validations; 2 | 3 | public class MoreThanRule : IValidationRule 4 | { 5 | private readonly double _underLimitValue; 6 | private readonly bool _isEqualValid; 7 | 8 | public MoreThanRule(double value, bool isEqualValid = false) 9 | { 10 | this._underLimitValue = value; 11 | this._isEqualValid = isEqualValid; 12 | } 13 | 14 | public string ValidationMessage { get; set; } 15 | 16 | public bool Check(T value) => 17 | _isEqualValid ? Convert.ToDouble(value) >= _underLimitValue : Convert.ToDouble(value) > _underLimitValue; 18 | } 19 | -------------------------------------------------------------------------------- /src/Controls/Validations/ValidatableObject.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Diagnostics.CodeAnalysis; 3 | using System.Runtime.CompilerServices; 4 | 5 | namespace VControl.Controls.Validations; 6 | 7 | public class ValidatableObject : INotifyPropertyChanged, IValidatableObject 8 | { 9 | private IEnumerable _errors; 10 | private bool _isValid; 11 | private T _value; 12 | 13 | public event PropertyChangedEventHandler? PropertyChanged; 14 | 15 | public List> Validations { get; set; } = new(); 16 | 17 | public IEnumerable Errors 18 | { 19 | get => _errors; 20 | set => SetProperty(ref _errors, value); 21 | } 22 | 23 | public bool IsValid 24 | { 25 | get => _isValid; 26 | set => SetProperty(ref _isValid, value); 27 | } 28 | 29 | public T Value 30 | { 31 | get => _value; 32 | set => SetProperty(ref _value, value); 33 | } 34 | 35 | public ValidatableObject() 36 | { 37 | _isValid = true; 38 | _errors = Enumerable.Empty(); 39 | } 40 | 41 | protected bool SetProperty( 42 | [NotNullIfNotNull(nameof(newValue))] ref T field, 43 | T newValue, 44 | [CallerMemberName] string? propertyName = null 45 | ) 46 | { 47 | if (EqualityComparer.Default.Equals(field, newValue)) 48 | { 49 | return false; 50 | } 51 | field = newValue; 52 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 53 | return true; 54 | } 55 | 56 | public bool Validate() 57 | { 58 | Errors = 59 | Validations?.Where(v => !v.Check(Value))?.Select(v => v.ValidationMessage)?.ToArray() 60 | ?? Enumerable.Empty(); 61 | 62 | IsValid = !Errors.Any(); 63 | 64 | return IsValid; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/Converters/FirstValidationErrorConverter.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | 3 | namespace VControl.Converters; 4 | public class FirstValidationErrorConverter : IValueConverter 5 | { 6 | public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) 7 | { 8 | if (value is IEnumerable v) 9 | { 10 | return v?.FirstOrDefault(); 11 | } 12 | return string.Empty; 13 | } 14 | public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) 15 | { 16 | throw new NotImplementedException(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Converters/InvertedBoolConverter.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | 3 | namespace VControl.Converters 4 | { 5 | public class InvertedBoolConverter : IValueConverter 6 | { 7 | public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) 8 | { 9 | if (value is bool v) return !v; 10 | return default; 11 | } 12 | 13 | public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) 14 | { 15 | if (value is bool v) return !v; 16 | return default; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/Converters/StringToInvisibleConverter.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | 3 | namespace VControl.Converters 4 | { 5 | public class StringToInvisibleConverter : IValueConverter 6 | { 7 | public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) 8 | { 9 | return !string.IsNullOrWhiteSpace(value as string); 10 | } 11 | 12 | public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) 13 | { 14 | throw new NotImplementedException(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Platforms/Android/PlatformClass1.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Platforms.Android 2 | { 3 | // All the code in this file is only included on Android. 4 | public class PlatformClass1 5 | { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/Platforms/MacCatalyst/PlatformClass1.cs: -------------------------------------------------------------------------------- 1 | namespace VControl 2 | { 3 | // All the code in this file is only included on Mac Catalyst. 4 | public class PlatformClass1 5 | { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/Platforms/Tizen/PlatformClass1.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace VControl 4 | { 5 | // All the code in this file is only included on Tizen. 6 | public class PlatformClass1 7 | { 8 | } 9 | } -------------------------------------------------------------------------------- /src/Platforms/Windows/PlatformClass1.cs: -------------------------------------------------------------------------------- 1 | namespace VControl 2 | { 3 | // All the code in this file is only included on Windows. 4 | public class PlatformClass1 5 | { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/Platforms/iOS/PlatformClass1.cs: -------------------------------------------------------------------------------- 1 | namespace VControl 2 | { 3 | // All the code in this file is only included on iOS. 4 | public class PlatformClass1 5 | { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/Resources/Fonts/Font_Awesome_6_Brands-Regular-400.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/src/Resources/Fonts/Font_Awesome_6_Brands-Regular-400.otf -------------------------------------------------------------------------------- /src/Resources/Fonts/Font_Awesome_6_Free-Regular-400.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/src/Resources/Fonts/Font_Awesome_6_Free-Regular-400.otf -------------------------------------------------------------------------------- /src/Resources/Fonts/Font_Awesome_6_Free-Solid-900.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jevonsflash/V-Control/82ab556498056e23e98529f622254fdca74acdb2/src/Resources/Fonts/Font_Awesome_6_Free-Solid-900.otf -------------------------------------------------------------------------------- /src/Resources/Styles/VControlColors.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Styles 2 | { 3 | public partial class VControlColors : ResourceDictionary 4 | { 5 | public VControlColors() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Resources/Styles/VControlConsts.xaml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 7 | 8 | 9 | OpenSansRegular 10 | 11 | 10 12 | 12 13 | 16 14 | 20 15 | 16 | 17 | 12 18 | 28 19 | 18 20 | 21 | 16 22 | 14 23 | 24 | 25 | 26 | 27 | 12 28 | 12,10,12,0 29 | 30 | 31 | 32 | 33 | 48 34 | 35 | 36 | 37 | 38 | 24 39 | 41 | 42 | 12 43 | 45 | 46 | 47 | 48 48 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/Resources/Styles/VControlConsts.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Styles 2 | { 3 | public partial class VControlConsts : ResourceDictionary 4 | { 5 | public VControlConsts() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Resources/Styles/VControlGlobalStyles.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace VControl.Styles 2 | { 3 | public partial class VControlGlobalStyles : ResourceDictionary 4 | { 5 | public VControlGlobalStyles() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Resources/Styles/VControlTheme.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace VControl.Styles 8 | { 9 | public partial class VControlTheme : ResourceDictionary 10 | { 11 | public VControlTheme() 12 | { 13 | InitializeComponent(); 14 | } 15 | } 16 | } 17 | --------------------------------------------------------------------------------