├── .gitattributes
├── .gitignore
├── .nuget
├── NuGet.Config
├── NuGet.exe
└── NuGet.targets
├── FormsPopup.sln
├── FormsPopup
├── FormsPopup.Droid
│ ├── Assets
│ │ └── AboutAssets.txt
│ ├── FormsPopup.Droid.csproj
│ ├── FormsPopup.Droid.csproj.bak
│ ├── MainActivity.cs
│ ├── Properties
│ │ ├── AndroidManifest.xml
│ │ └── AssemblyInfo.cs
│ ├── Resources
│ │ ├── AboutResources.txt
│ │ ├── Resource.Designer.cs
│ │ ├── drawable-hdpi
│ │ │ └── icon.png
│ │ ├── drawable-xhdpi
│ │ │ └── icon.png
│ │ ├── drawable-xxhdpi
│ │ │ └── icon.png
│ │ └── drawable
│ │ │ └── icon.png
│ └── packages.config
├── FormsPopup.Examples
│ ├── App.cs
│ ├── CodedPopupExample.cs
│ ├── CodedSimpleExample.cs
│ ├── ComplexLayoutExample.xaml
│ ├── ComplexLayoutExample.xaml.cs
│ ├── FormsPopup.Examples.csproj
│ ├── NavigationExample.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── XamlPopupExample.xaml
│ ├── XamlPopupExample.xaml.cs
│ └── packages.config
├── FormsPopup.iOS
│ ├── AppDelegate.cs
│ ├── Entitlements.plist
│ ├── FormsPopup.iOS.csproj
│ ├── Info.plist
│ ├── Main.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── Resources
│ │ ├── Default-568h@2x.png
│ │ ├── Default-Portrait.png
│ │ ├── Default-Portrait@2x.png
│ │ ├── Default.png
│ │ ├── Default@2x.png
│ │ ├── Icon-60@2x.png
│ │ ├── Icon-60@3x.png
│ │ ├── Icon-76.png
│ │ ├── Icon-76@2x.png
│ │ ├── Icon-Small-40.png
│ │ ├── Icon-Small-40@2x.png
│ │ ├── Icon-Small-40@3x.png
│ │ ├── Icon-Small.png
│ │ ├── Icon-Small@2x.png
│ │ ├── Icon-Small@3x.png
│ │ └── LaunchScreen.storyboard
│ ├── iTunesArtwork
│ ├── iTunesArtwork@2x
│ └── packages.config
└── FormsPopup
│ ├── FormsPopup.csproj
│ ├── Popup.cs
│ ├── PopupHidingEventArgs.cs
│ ├── PopupPage.cs
│ ├── PopupPageInitializer.cs
│ ├── PopupSectionType.cs
│ ├── PopupShowingEventArgs.cs
│ ├── PopupTappedEventArgs.cs
│ ├── Properties
│ └── AssemblyInfo.cs
│ ├── TapGestureRecognizerVisitor.cs
│ ├── VisualElementExtensions.cs
│ └── packages.config
├── LICENSE
├── README.md
└── pictures
├── androidPopup.gif
├── gridlayout.png
└── iOSPopup.gif
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.sln.docstates
8 | *.userprefs
9 |
10 | # Build results
11 | [Dd]ebug/
12 | [Dd]ebugPublic/
13 | [Rr]elease/
14 | x64/
15 | build/
16 | bld/
17 | [Bb]in/
18 | [Oo]bj/
19 |
20 | # Roslyn cache directories
21 | *.ide/
22 |
23 | # MSTest test Results
24 | [Tt]est[Rr]esult*/
25 | [Bb]uild[Ll]og.*
26 |
27 | #NUNIT
28 | *.VisualState.xml
29 | TestResult.xml
30 |
31 | # Build Results of an ATL Project
32 | [Dd]ebugPS/
33 | [Rr]eleasePS/
34 | dlldata.c
35 |
36 | *_i.c
37 | *_p.c
38 | *_i.h
39 | *.ilk
40 | *.meta
41 | *.obj
42 | *.pch
43 | *.pdb
44 | *.pgc
45 | *.pgd
46 | *.rsp
47 | *.sbr
48 | *.tlb
49 | *.tli
50 | *.tlh
51 | *.tmp
52 | *.tmp_proj
53 | *.log
54 | *.vspscc
55 | *.vssscc
56 | .builds
57 | *.pidb
58 | *.svclog
59 | *.scc
60 |
61 | # Chutzpah Test files
62 | _Chutzpah*
63 |
64 | # Visual C++ cache files
65 | ipch/
66 | *.aps
67 | *.ncb
68 | *.opensdf
69 | *.sdf
70 | *.cachefile
71 |
72 | # Visual Studio profiler
73 | *.psess
74 | *.vsp
75 | *.vspx
76 |
77 | # TFS 2012 Local Workspace
78 | $tf/
79 |
80 | # Guidance Automation Toolkit
81 | *.gpState
82 |
83 | # ReSharper is a .NET coding add-in
84 | _ReSharper*/
85 | *.[Rr]e[Ss]harper
86 | *.DotSettings.user
87 |
88 | # JustCode is a .NET coding addin-in
89 | .JustCode
90 |
91 | # TeamCity is a build add-in
92 | _TeamCity*
93 |
94 | # DotCover is a Code Coverage Tool
95 | *.dotCover
96 |
97 | # NCrunch
98 | _NCrunch_*
99 | .*crunch*.local.xml
100 |
101 | # MightyMoose
102 | *.mm.*
103 | AutoTest.Net/
104 |
105 | # Web workbench (sass)
106 | .sass-cache/
107 |
108 | # Installshield output folder
109 | [Ee]xpress/
110 |
111 | # DocProject is a documentation generator add-in
112 | DocProject/buildhelp/
113 | DocProject/Help/*.HxT
114 | DocProject/Help/*.HxC
115 | DocProject/Help/*.hhc
116 | DocProject/Help/*.hhk
117 | DocProject/Help/*.hhp
118 | DocProject/Help/Html2
119 | DocProject/Help/html
120 |
121 | # Click-Once directory
122 | publish/
123 |
124 | # Publish Web Output
125 | *.[Pp]ublish.xml
126 | *.azurePubxml
127 | ## TODO: Comment the next line if you want to checkin your
128 | ## web deploy settings but do note that will include unencrypted
129 | ## passwords
130 | #*.pubxml
131 |
132 | # NuGet Packages Directory
133 | packages/*
134 | ## TODO: If the tool you use requires repositories.config
135 | ## uncomment the next line
136 | #!packages/repositories.config
137 |
138 | # Enable "build/" folder in the NuGet Packages folder since
139 | # NuGet packages use it for MSBuild targets.
140 | # This line needs to be after the ignore of the build folder
141 | # (and the packages folder if the line above has been uncommented)
142 | !packages/build/
143 |
144 | # Windows Azure Build Output
145 | csx/
146 | *.build.csdef
147 |
148 | # Windows Store app package directory
149 | AppPackages/
150 |
151 | # Others
152 | sql/
153 | *.Cache
154 | ClientBin/
155 | [Ss]tyle[Cc]op.*
156 | ~$*
157 | *~
158 | *.dbmdl
159 | *.dbproj.schemaview
160 | *.pfx
161 | *.publishsettings
162 | node_modules/
163 |
164 | # RIA/Silverlight projects
165 | Generated_Code/
166 |
167 | # Backup & report files from converting an old project file
168 | # to a newer Visual Studio version. Backup files are not needed,
169 | # because we have git ;-)
170 | _UpgradeReport_Files/
171 | Backup*/
172 | UpgradeLog*.XML
173 | UpgradeLog*.htm
174 |
175 | # SQL Server files
176 | *.mdf
177 | *.ldf
178 |
179 | # Business Intelligence projects
180 | *.rdl.data
181 | *.bim.layout
182 | *.bim_*.settings
183 |
184 | # Microsoft Fakes
185 | FakesAssemblies/
186 |
187 | # LightSwitch generated files
188 | GeneratedArtifacts/
189 | _Pvt_Extensions/
190 | ModelManifest.xml
--------------------------------------------------------------------------------
/.nuget/NuGet.Config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.nuget/NuGet.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/.nuget/NuGet.exe
--------------------------------------------------------------------------------
/.nuget/NuGet.targets:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $(MSBuildProjectDirectory)\..\
5 |
6 |
7 | false
8 |
9 |
10 | false
11 |
12 |
13 | true
14 |
15 |
16 | false
17 |
18 |
19 |
20 |
21 |
22 |
26 |
27 |
28 |
29 |
30 | $([System.IO.Path]::Combine($(SolutionDir), ".nuget"))
31 |
32 |
33 |
34 |
35 | $(SolutionDir).nuget
36 |
37 |
38 |
39 | $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config
40 | $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config
41 |
42 |
43 |
44 | $(MSBuildProjectDirectory)\packages.config
45 | $(PackagesProjectConfig)
46 |
47 |
48 |
49 |
50 | $(NuGetToolsPath)\NuGet.exe
51 | @(PackageSource)
52 |
53 | "$(NuGetExePath)"
54 | mono --runtime=v4.0.30319 "$(NuGetExePath)"
55 |
56 | $(TargetDir.Trim('\\'))
57 |
58 | -RequireConsent
59 | -NonInteractive
60 |
61 | "$(SolutionDir) "
62 | "$(SolutionDir)"
63 |
64 |
65 | $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)
66 | $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols
67 |
68 |
69 |
70 | RestorePackages;
71 | $(BuildDependsOn);
72 |
73 |
74 |
75 |
76 | $(BuildDependsOn);
77 | BuildPackage;
78 |
79 |
80 |
81 |
82 |
83 |
84 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
99 |
100 |
103 |
104 |
105 |
106 |
108 |
109 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
141 |
142 |
143 |
144 |
145 |
--------------------------------------------------------------------------------
/FormsPopup.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 14
4 | VisualStudioVersion = 14.0.25420.1
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup", "FormsPopup\FormsPopup\FormsPopup.csproj", "{CA22517D-4B83-43F5-A23F-9207229D2024}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup.iOS", "FormsPopup\FormsPopup.iOS\FormsPopup.iOS.csproj", "{ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup.Droid", "FormsPopup\FormsPopup.Droid\FormsPopup.Droid.csproj", "{34D6EE8D-1671-4A69-9736-A3BD774037B9}"
11 | EndProject
12 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{632435A2-E61B-4422-A2F2-7145CA6A074D}"
13 | ProjectSection(SolutionItems) = preProject
14 | .nuget\NuGet.Config = .nuget\NuGet.Config
15 | .nuget\NuGet.exe = .nuget\NuGet.exe
16 | .nuget\NuGet.targets = .nuget\NuGet.targets
17 | EndProjectSection
18 | EndProject
19 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup.Examples", "FormsPopup\FormsPopup.Examples\FormsPopup.Examples.csproj", "{67F9D3A8-F71E-4428-913F-C37AE82CDB24}"
20 | EndProject
21 | Global
22 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
23 | Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
24 | Ad-Hoc|iPhone = Ad-Hoc|iPhone
25 | Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
26 | Ad-Hoc|Mixed Platforms = Ad-Hoc|Mixed Platforms
27 | AppStore|Any CPU = AppStore|Any CPU
28 | AppStore|iPhone = AppStore|iPhone
29 | AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
30 | AppStore|Mixed Platforms = AppStore|Mixed Platforms
31 | Debug|Any CPU = Debug|Any CPU
32 | Debug|iPhone = Debug|iPhone
33 | Debug|iPhoneSimulator = Debug|iPhoneSimulator
34 | Debug|Mixed Platforms = Debug|Mixed Platforms
35 | Release|Any CPU = Release|Any CPU
36 | Release|iPhone = Release|iPhone
37 | Release|iPhoneSimulator = Release|iPhoneSimulator
38 | Release|Mixed Platforms = Release|Mixed Platforms
39 | EndGlobalSection
40 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
41 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
42 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
43 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
44 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
45 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU
46 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU
47 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
48 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Any CPU.Build.0 = Release|Any CPU
49 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|iPhone.ActiveCfg = Release|Any CPU
50 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
51 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
52 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
53 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
54 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Any CPU.Build.0 = Debug|Any CPU
55 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|iPhone.ActiveCfg = Debug|Any CPU
56 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
57 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
58 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
59 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Any CPU.ActiveCfg = Release|Any CPU
60 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Any CPU.Build.0 = Release|Any CPU
61 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|iPhone.ActiveCfg = Release|Any CPU
62 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
63 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
64 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Mixed Platforms.Build.0 = Release|Any CPU
65 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
66 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
67 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
68 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
69 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
70 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|Mixed Platforms.ActiveCfg = Ad-Hoc|iPhone
71 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|Mixed Platforms.Build.0 = Ad-Hoc|iPhone
72 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
73 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
74 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhone.Build.0 = AppStore|iPhone
75 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
76 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
77 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|Mixed Platforms.ActiveCfg = AppStore|iPhone
78 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|Mixed Platforms.Build.0 = AppStore|iPhone
79 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
80 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhone.ActiveCfg = Debug|iPhone
81 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhone.Build.0 = Debug|iPhone
82 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
83 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
84 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Mixed Platforms.ActiveCfg = Debug|iPhone
85 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Mixed Platforms.Build.0 = Debug|iPhone
86 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|Any CPU.ActiveCfg = Release|iPhone
87 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhone.ActiveCfg = Release|iPhone
88 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhone.Build.0 = Release|iPhone
89 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
90 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
91 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|Mixed Platforms.ActiveCfg = Release|iPhone
92 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|Mixed Platforms.Build.0 = Release|iPhone
93 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
94 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
95 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
96 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
97 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
98 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
99 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU
100 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU
101 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|Any CPU
102 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
103 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Any CPU.Build.0 = Release|Any CPU
104 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
105 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|iPhone.ActiveCfg = Release|Any CPU
106 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
107 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
108 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
109 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Mixed Platforms.Deploy.0 = Release|Any CPU
110 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
111 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
112 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
113 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|iPhone.ActiveCfg = Debug|Any CPU
114 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
115 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
116 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
117 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Mixed Platforms.Deploy.0 = Debug|Any CPU
118 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
119 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Any CPU.Build.0 = Release|Any CPU
120 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Any CPU.Deploy.0 = Release|Any CPU
121 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|iPhone.ActiveCfg = Release|Any CPU
122 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
123 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
124 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
125 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Mixed Platforms.Deploy.0 = Release|Any CPU
126 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
127 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
128 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
129 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
130 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU
131 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU
132 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
133 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Any CPU.Build.0 = Release|Any CPU
134 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|iPhone.ActiveCfg = Release|Any CPU
135 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
136 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
137 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
138 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
139 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Any CPU.Build.0 = Debug|Any CPU
140 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|iPhone.ActiveCfg = Debug|Any CPU
141 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
142 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
143 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
144 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Any CPU.ActiveCfg = Release|Any CPU
145 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Any CPU.Build.0 = Release|Any CPU
146 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|iPhone.ActiveCfg = Release|Any CPU
147 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
148 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
149 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Mixed Platforms.Build.0 = Release|Any CPU
150 | EndGlobalSection
151 | GlobalSection(SolutionProperties) = preSolution
152 | HideSolutionNode = FALSE
153 | EndGlobalSection
154 | EndGlobal
155 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Assets/AboutAssets.txt:
--------------------------------------------------------------------------------
1 | Any raw assets you want to be deployed with your application can be placed in
2 | this directory (and child directories) and given a Build Action of "AndroidAsset".
3 |
4 | These files will be deployed with you package and will be accessible using Android's
5 | AssetManager, like this:
6 |
7 | public class ReadAsset : Activity
8 | {
9 | protected override void OnCreate (Bundle bundle)
10 | {
11 | base.OnCreate (bundle);
12 |
13 | InputStream input = Assets.Open ("my_asset.txt");
14 | }
15 | }
16 |
17 | Additionally, some Android functions will automatically load asset files:
18 |
19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
20 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/FormsPopup.Droid.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}
7 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
8 | Library
9 | Properties
10 | FormsPopup.Droid
11 | FormsPopup.Droid
12 | 512
13 | true
14 | Resources\Resource.Designer.cs
15 | Off
16 | Properties\AndroidManifest.xml
17 | True
18 | armeabi,armeabi-v7a,x86
19 |
20 |
21 |
22 |
23 |
24 | v6.0
25 |
26 |
27 | ..\..\
28 | true
29 |
30 |
31 | true
32 | full
33 | false
34 | bin\Debug\
35 | DEBUG;TRACE
36 | prompt
37 | 4
38 | None
39 |
40 |
41 | pdbonly
42 | true
43 | bin\Release\
44 | TRACE
45 | prompt
46 | 4
47 | False
48 |
49 |
50 |
51 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\FormsViewGroup.dll
52 | True
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll
62 | True
63 |
64 |
65 | ..\..\packages\Xamarin.Android.Support.Design.23.3.0\lib\MonoAndroid43\Xamarin.Android.Support.Design.dll
66 | True
67 |
68 |
69 | ..\..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
70 | True
71 |
72 |
73 | ..\..\packages\Xamarin.Android.Support.v7.AppCompat.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll
74 | True
75 |
76 |
77 | ..\..\packages\Xamarin.Android.Support.v7.CardView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.CardView.dll
78 | True
79 |
80 |
81 | ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll
82 | True
83 |
84 |
85 | ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll
86 | True
87 |
88 |
89 | ..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll
90 | True
91 |
92 |
93 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Core.dll
94 | True
95 |
96 |
97 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
98 | True
99 |
100 |
101 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
102 | True
103 |
104 |
105 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
106 | True
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}
131 | FormsPopup.Examples
132 |
133 |
134 |
135 |
136 |
137 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
153 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/FormsPopup.Droid.csproj.bak:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}
7 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
8 | Library
9 | Properties
10 | FormsPopup.Droid
11 | FormsPopup.Droid
12 | 512
13 | true
14 | Resources\Resource.Designer.cs
15 | Off
16 | Properties\AndroidManifest.xml
17 | True
18 | armeabi,armeabi-v7a,x86
19 |
20 |
21 |
22 |
23 |
24 | v5.0
25 | 9a68efc6
26 | ..\..\
27 | true
28 |
29 |
30 | true
31 | full
32 | false
33 | bin\Debug\
34 | DEBUG;TRACE
35 | prompt
36 | 4
37 | None
38 |
39 |
40 | pdbonly
41 | true
42 | bin\Release\
43 | TRACE
44 | prompt
45 | 4
46 | False
47 |
48 |
49 |
50 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\FormsViewGroup.dll
51 | True
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | ..\..\packages\Xamarin.Android.Support.v4.22.2.0.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
61 | True
62 |
63 |
64 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Core.dll
65 | True
66 |
67 |
68 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
69 | True
70 |
71 |
72 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
73 | True
74 |
75 |
76 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
77 | True
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}
102 | FormsPopup.Examples
103 |
104 |
105 |
106 |
107 |
108 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
109 |
110 |
111 |
112 |
113 |
120 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/MainActivity.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | using Android.App;
4 | using Android.Content.PM;
5 | using Android.Runtime;
6 | using Android.Views;
7 | using Android.Widget;
8 | using Android.OS;
9 | using FormsPopup.Examples;
10 |
11 | namespace FormsPopup.Droid
12 | {
13 | [Activity(Label = "FormsPopup", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
14 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
15 | {
16 | protected override void OnCreate(Bundle bundle)
17 | {
18 | base.OnCreate(bundle);
19 |
20 | global::Xamarin.Forms.Forms.Init(this, bundle);
21 | LoadApplication(new App());
22 | }
23 | }
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Properties/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 | using Android.App;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("FormsPopup.Droid")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("FormsPopup.Droid")]
14 | [assembly: AssemblyCopyright("Copyright © 2014")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: ComVisible(false)]
18 |
19 | // Version information for an assembly consists of the following four values:
20 | //
21 | // Major Version
22 | // Minor Version
23 | // Build Number
24 | // Revision
25 | //
26 | // You can specify all the values or you can default the Build and Revision Numbers
27 | // by using the '*' as shown below:
28 | // [assembly: AssemblyVersion("1.0.*")]
29 | [assembly: AssemblyVersion("1.0.0.0")]
30 | [assembly: AssemblyFileVersion("1.0.0.0")]
31 |
32 | // Add some common permissions, these can be removed if not needed
33 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)]
34 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
35 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Resources/AboutResources.txt:
--------------------------------------------------------------------------------
1 | Images, layout descriptions, binary blobs and string dictionaries can be included
2 | in your application as resource files. Various Android APIs are designed to
3 | operate on the resource IDs instead of dealing with images, strings or binary blobs
4 | directly.
5 |
6 | For example, a sample Android app that contains a user interface layout (main.xml),
7 | an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
8 | would keep its resources in the "Resources" directory of the application:
9 |
10 | Resources/
11 | drawable-hdpi/
12 | icon.png
13 |
14 | drawable-ldpi/
15 | icon.png
16 |
17 | drawable-mdpi/
18 | icon.png
19 |
20 | layout/
21 | main.xml
22 |
23 | values/
24 | strings.xml
25 |
26 | In order to get the build system to recognize Android resources, set the build action to
27 | "AndroidResource". The native Android APIs do not operate directly with filenames, but
28 | instead operate on resource IDs. When you compile an Android application that uses resources,
29 | the build system will package the resources for distribution and generate a class called
30 | "Resource" that contains the tokens for each one of the resources included. For example,
31 | for the above Resources layout, this is what the Resource class would expose:
32 |
33 | public class Resource {
34 | public class drawable {
35 | public const int icon = 0x123;
36 | }
37 |
38 | public class layout {
39 | public const int main = 0x456;
40 | }
41 |
42 | public class strings {
43 | public const int first_string = 0xabc;
44 | public const int second_string = 0xbcd;
45 | }
46 | }
47 |
48 | You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main
49 | to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
50 | string in the dictionary file values/strings.xml.
51 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Resources/Resource.Designer.cs:
--------------------------------------------------------------------------------
1 | #pragma warning disable 1591
2 | // ------------------------------------------------------------------------------
3 | //
4 | // This code was generated by a tool.
5 | // Mono Runtime Version: 4.0.30319.42000
6 | //
7 | // Changes to this file may cause incorrect behavior and will be lost if
8 | // the code is regenerated.
9 | //
10 | // ------------------------------------------------------------------------------
11 |
12 | [assembly: Android.Runtime.ResourceDesignerAttribute("FormsPopup.Droid.Resource", IsApplication=true)]
13 |
14 | namespace FormsPopup.Droid
15 | {
16 |
17 |
18 | [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
19 | public partial class Resource
20 | {
21 |
22 | static Resource()
23 | {
24 | global::Android.Runtime.ResourceIdManager.UpdateIdValues();
25 | }
26 |
27 | public static void UpdateIdValues()
28 | {
29 | global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::FormsPopup.Droid.Resource.Attribute.actionBarSize;
30 | }
31 |
32 | public partial class Attribute
33 | {
34 |
35 | static Attribute()
36 | {
37 | global::Android.Runtime.ResourceIdManager.UpdateIdValues();
38 | }
39 |
40 | private Attribute()
41 | {
42 | }
43 | }
44 |
45 | public partial class Drawable
46 | {
47 |
48 | // aapt resource value: 0x7f020000
49 | public const int icon = 2130837504;
50 |
51 | static Drawable()
52 | {
53 | global::Android.Runtime.ResourceIdManager.UpdateIdValues();
54 | }
55 |
56 | private Drawable()
57 | {
58 | }
59 | }
60 | }
61 | }
62 | #pragma warning restore 1591
63 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Resources/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Resources/drawable-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable-xhdpi/icon.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Resources/drawable-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable-xxhdpi/icon.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/Resources/drawable/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable/icon.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Droid/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/App.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace FormsPopup.Examples
4 | {
5 | public class App : Application
6 | {
7 | public App()
8 | {
9 | /*
10 | * Try these:
11 | * MainPage = new CodedPopupExample();
12 | * MainPage = new CodedSimpleExample();
13 | * MainPage = new NavigationPage(new NavigationExample());
14 | * MainPage = new CodedPopupExample();
15 | * MainPage = new ComplexLayoutExample();
16 | */
17 |
18 | MainPage = new CodedPopupExample();
19 | }
20 |
21 | protected override void OnStart()
22 | {
23 | // Handle when your app starts
24 | }
25 |
26 | protected override void OnSleep()
27 | {
28 | // Handle when your app sleeps
29 | }
30 |
31 | protected override void OnResume()
32 | {
33 | // Handle when your app resumes
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/CodedPopupExample.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using Xamarin.Forms;
4 |
5 | namespace FormsPopup.Examples
6 | {
7 | public class CodedPopupExample : ContentPage
8 | {
9 | private readonly SwitchCell _closeOnAnyTap;
10 | private readonly SwitchCell _preventShowing;
11 | private readonly SwitchCell _displayTappedSection;
12 | private readonly SwitchCell _showingAnimation;
13 | private readonly Popup _popup1;
14 |
15 |
16 | public CodedPopupExample()
17 | {
18 | _closeOnAnyTap = new SwitchCell {Text = "Close on any tap", On = true};
19 | _preventShowing = new SwitchCell { Text = "Prevent popup from showing" };
20 | _displayTappedSection = new SwitchCell {Text = "Display the tapped section's name"};
21 | _showingAnimation = new SwitchCell { Text = "Turn on 'Showing' animation" };
22 |
23 | var showPopup = new Button {Text = "Show Popup"};
24 |
25 | var closeButton = new Button
26 | {
27 | Text = "Close",
28 | TextColor = Color.FromHex("#D37E00"),
29 | BackgroundColor = Color.White,
30 | };
31 |
32 | _popup1 = new Popup
33 | {
34 | XPositionRequest = 0.5,
35 | YPositionRequest = 0.5,
36 | ContentWidthRequest = 0.8,
37 | ContentHeightRequest = 0.5,
38 |
39 | Header = new ContentView
40 | {
41 | Padding = 10,
42 | BackgroundColor = Color.FromHex("#3399FF"),
43 | Content = new Label
44 | {
45 | FontSize = Device.GetNamedSize(NamedSize.Large, typeof (Label)),
46 | TextColor = Color.White,
47 | Text = "Simple popup"
48 | }
49 | },
50 |
51 | Body = new ContentView
52 | {
53 | Padding = 10,
54 | BackgroundColor = Color.White,
55 | Content = new Label
56 | {
57 | FontSize = Device.GetNamedSize(NamedSize.Medium, typeof (Label)),
58 | TextColor = Color.Gray,
59 | Text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
60 | }
61 | },
62 |
63 | Footer = new ContentView
64 | {
65 | BackgroundColor = Color.White,
66 |
67 | Content = new StackLayout
68 | {
69 | Orientation = StackOrientation.Horizontal,
70 | HorizontalOptions = LayoutOptions.EndAndExpand,
71 | Children = { closeButton }
72 | }
73 | }
74 | };
75 |
76 |
77 | Content = new StackLayout
78 | {
79 | Children =
80 | {
81 | new TableView
82 | {
83 | Intent = TableIntent.Settings,
84 | Root = new TableRoot
85 | {
86 | new TableSection("Coded Popup Example")
87 | {
88 | _closeOnAnyTap,
89 | _preventShowing,
90 | _displayTappedSection,
91 | _showingAnimation
92 | }
93 | },
94 | },
95 |
96 | showPopup
97 | }
98 | };
99 |
100 | // Required to be instantiated before the popup is added to ContentPage.Content
101 | new PopupPageInitializer(this) { _popup1 };
102 |
103 |
104 | _popup1.Tapped += Popup1_Tapped;
105 | _popup1.Showing += Popup1_Showing;
106 | showPopup.Clicked += ShowPopup_Clicked;
107 | closeButton.Clicked += CloseButton_Clicked;
108 | }
109 |
110 |
111 | private async void CloseButton_Clicked(object sender, EventArgs e)
112 | {
113 | await _popup1.HideAsync(async p =>
114 | {
115 | await p.FadeTo(0, 250, Easing.Linear);
116 | p.Opacity = 1;
117 | });
118 | }
119 |
120 |
121 | private void Popup1_Showing(object sender, PopupShowingEventArgs e)
122 | {
123 | if (_preventShowing.On)
124 | {
125 | e.Cancel = true;
126 | }
127 | }
128 |
129 |
130 | private void Popup1_Tapped(object sender, PopupTappedEventArgs e)
131 | {
132 | if (_closeOnAnyTap.On)
133 | {
134 | e.Popup.Hide();
135 | }
136 |
137 | if (_displayTappedSection.On)
138 | {
139 | DisplayAlert("Information", $"{e.Section} tapped.", "OK");
140 | }
141 | }
142 |
143 |
144 | private async void ShowPopup_Clicked(object sender, EventArgs e)
145 | {
146 | if (_showingAnimation.On)
147 | {
148 | double original;
149 |
150 | await _popup1.ShowAsync(async p =>
151 | {
152 | original = p.Scale;
153 |
154 | await Task.WhenAll
155 | (
156 | p.SectionContainer.RelScaleTo(0.05, 100, Easing.CubicOut),
157 | p.SectionContainer.RelScaleTo(-0.05, 105, Easing.CubicOut)
158 | ).ContinueWith(c =>
159 | {
160 | Device.BeginInvokeOnMainThread(() =>
161 | {
162 | p.SectionContainer.Scale = original;
163 | });
164 | });
165 | });
166 | }
167 | else
168 | {
169 | _popup1.Show();
170 | }
171 | }
172 | }
173 | }
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/CodedSimpleExample.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace FormsPopup.Examples
4 | {
5 | public class CodedSimpleExample : ContentPage
6 | {
7 | public CodedSimpleExample()
8 | {
9 | var popup = new Popup
10 | {
11 | XPositionRequest = 0.5,
12 | YPositionRequest = 0.5,
13 | ContentHeightRequest = 0.8,
14 | ContentWidthRequest = 0.8,
15 | Padding = 10,
16 | Body = new ContentView
17 | {
18 | BackgroundColor = Color.White,
19 | Content = new StackLayout
20 | {
21 | Children =
22 | {
23 | new Entry(),
24 | new Label
25 | {
26 | VerticalTextAlignment = TextAlignment.Center,
27 | HorizontalTextAlignment = TextAlignment.Center,
28 | TextColor = Color.Black,
29 | Text = "Hello, World!"
30 | }
31 | }
32 | }
33 | }
34 | };
35 |
36 | popup.Tapped += (sender, args) =>
37 | {
38 | args.Popup.Hide();
39 | };
40 |
41 |
42 | var button = new Button { Text = "Show Popup" };
43 | button.Clicked += (s, e) => popup.Show();
44 |
45 | var stack = new StackLayout
46 | {
47 | Children =
48 | {
49 | new Entry { Text = "Some input..."},
50 | button
51 | }
52 | };
53 |
54 | Device.OnPlatform(() => stack.Padding = new Thickness(0, 25, 0, 0));
55 | Content = stack;
56 | new PopupPageInitializer(this) { popup };
57 | }
58 | }
59 | }
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/ComplexLayoutExample.xaml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/ComplexLayoutExample.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace FormsPopup.Examples
4 | {
5 | public partial class ComplexLayoutExample
6 | {
7 | public ComplexLayoutExample()
8 | {
9 | InitializeComponent();
10 | }
11 |
12 |
13 | private void Button_OnClicked(object sender, EventArgs e)
14 | {
15 | popup1.Show();
16 | }
17 |
18 |
19 | private void Popup1_Tapped(object sender, PopupTappedEventArgs e)
20 | {
21 | popup1.Hide();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/FormsPopup.Examples.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 10.0
6 | Debug
7 | AnyCPU
8 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}
9 | Library
10 | Properties
11 | FormsPopup.Examples
12 | FormsPopup.Examples
13 | v4.5
14 | Profile78
15 | 512
16 | {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
17 | ..\..\
18 | true
19 |
20 |
21 |
22 |
23 | true
24 | full
25 | false
26 | bin\Debug\
27 | DEBUG;TRACE
28 | prompt
29 | 4
30 |
31 |
32 | pdbonly
33 | true
34 | bin\Release\
35 | TRACE
36 | prompt
37 | 4
38 |
39 |
40 |
41 |
42 |
43 |
44 | ComplexLayoutExample.xaml
45 |
46 |
47 |
48 |
49 | XamlPopupExample.xaml
50 |
51 |
52 |
53 |
54 | MSBuild:UpdateDesignTimeXaml
55 | Designer
56 |
57 |
58 |
59 |
60 | {CA22517D-4B83-43F5-A23F-9207229D2024}
61 | FormsPopup
62 |
63 |
64 |
65 |
66 | MSBuild:UpdateDesignTimeXaml
67 | Designer
68 |
69 |
70 |
71 |
72 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Core.dll
73 | True
74 |
75 |
76 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Platform.dll
77 | True
78 |
79 |
80 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Xaml.dll
81 | True
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
92 |
93 |
94 |
95 |
96 |
97 |
104 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/NavigationExample.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace FormsPopup.Examples
4 | {
5 | public class NavigationExample : ContentPage
6 | {
7 | private readonly ContentPage _childPage;
8 | private readonly Popup _popup;
9 |
10 |
11 | public NavigationExample()
12 | {
13 | var btnNavigate = new Button {Text = "Navigate to another Page"};
14 | var btnPopup = new Button {Text = "Show Popup"};
15 |
16 | _popup = new Popup
17 | {
18 | XPositionRequest = 0.5,
19 | YPositionRequest = 0.2,
20 | ContentHeightRequest = 0.1,
21 | ContentWidthRequest = 0.4,
22 | Padding = 10,
23 |
24 | Body = new ContentView
25 | {
26 | BackgroundColor = Color.White,
27 | Content = new Label
28 | {
29 | VerticalTextAlignment = TextAlignment.Center,
30 | HorizontalTextAlignment = TextAlignment.Center,
31 | TextColor = Color.Black,
32 | Text = "Hello, World!"
33 | }
34 | }
35 | };
36 |
37 |
38 | // Initialize event handlers
39 | btnPopup.Clicked += BtnPopup_Clicked;
40 | btnNavigate.Clicked += BtnNavigate_Clicked;
41 | _popup.Tapped += Popup_Tapped;
42 |
43 |
44 | // Notice _popup is not added to this ContentPage
45 | Content = new StackLayout
46 | {
47 | Padding = 15,
48 |
49 | Children =
50 | {
51 | btnNavigate,
52 | btnPopup
53 | }
54 | };
55 |
56 | // Initialize popup view
57 | var _ = new PopupPageInitializer(this) { _popup };
58 |
59 | // Child page that will opened via btnPopup.Clicked
60 | _childPage = new ContentPage
61 | {
62 | Content = new Label
63 | {
64 | Text = "Hello, World!"
65 | }
66 | };
67 | }
68 |
69 |
70 | private void Popup_Tapped(object sender, PopupTappedEventArgs e)
71 | {
72 | _popup.Hide();
73 | }
74 |
75 |
76 |
77 | private void BtnNavigate_Clicked(object sender, System.EventArgs e)
78 | {
79 | App.Current.MainPage.Navigation.PushAsync(_childPage, true);
80 | }
81 |
82 |
83 | private void BtnPopup_Clicked(object sender, System.EventArgs e)
84 | {
85 | _popup.Show();
86 | }
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Resources;
2 | using System.Reflection;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("FormsPopup.Examples")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("FormsPopup.Examples")]
14 | [assembly: AssemblyCopyright("Copyright © 2014")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: NeutralResourcesLanguage("en")]
18 |
19 | // Version information for an assembly consists of the following four values:
20 | //
21 | // Major Version
22 | // Minor Version
23 | // Build Number
24 | // Revision
25 | //
26 | // You can specify all the values or you can default the Build and Revision Numbers
27 | // by using the '*' as shown below:
28 | // [assembly: AssemblyVersion("1.0.*")]
29 | [assembly: AssemblyVersion("1.0.0.0")]
30 | [assembly: AssemblyFileVersion("1.0.0.0")]
31 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/XamlPopupExample.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/XamlPopupExample.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using Xamarin.Forms;
4 |
5 | namespace FormsPopup.Examples
6 | {
7 | public partial class XamlPopupExample
8 | {
9 | public XamlPopupExample()
10 | {
11 | InitializeComponent();
12 | }
13 |
14 |
15 | private void Popup1_Showing(object sender, PopupShowingEventArgs e)
16 | {
17 | if (preventShowing.On)
18 | {
19 | e.Cancel = true;
20 | }
21 | }
22 |
23 |
24 | private void Popup1_Tapped(object sender, PopupTappedEventArgs e)
25 | {
26 | if (closeOnAnyTap.On)
27 | {
28 | e.Popup.Hide();
29 | }
30 |
31 | if (displayTappedSection.On)
32 | {
33 | DisplayAlert("Information", string.Format("{0} tapped.", e.Section), "OK");
34 | }
35 | }
36 |
37 |
38 | private async void Button_OnClicked(object sender, EventArgs e)
39 | {
40 | if (showingAnimation.On)
41 | {
42 | double original;
43 |
44 | await popup1.ShowAsync(async p =>
45 | {
46 | original = p.Scale;
47 |
48 | await Task.WhenAll
49 | (
50 | p.SectionContainer.RelScaleTo(0.05, 100, Easing.CubicOut),
51 | p.SectionContainer.RelScaleTo(-0.05, 105, Easing.CubicOut)
52 | )
53 | .ContinueWith(r => p.SectionContainer.Scale = original);
54 | });
55 | }
56 | else
57 | {
58 | popup1.Show();
59 | }
60 | }
61 |
62 | private async void CloseButton_OnClicked(object sender, EventArgs e)
63 | {
64 | await popup1.HideAsync(async p =>
65 | {
66 | await p.FadeTo(0, 250, Easing.Linear);
67 | p.Opacity = 1;
68 | });
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.Examples/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using FormsPopup.Examples;
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace FormsPopup.iOS
9 | {
10 | // The UIApplicationDelegate for the application. This class is responsible for launching the
11 | // User Interface of the application, as well as listening (and optionally responding) to
12 | // application events from iOS.
13 | [Register("AppDelegate")]
14 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
15 | {
16 | //
17 | // This method is invoked when the application has loaded and is ready to run. In this
18 | // method you should instantiate the window, load the UI into it and then make the window
19 | // visible.
20 | //
21 | // You have 17 seconds to return from this method, or iOS will terminate your application.
22 | //
23 | public override bool FinishedLaunching(UIApplication app, NSDictionary options)
24 | {
25 | global::Xamarin.Forms.Forms.Init();
26 | LoadApplication(new App());
27 |
28 | return base.FinishedLaunching(app, options);
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/FormsPopup.iOS.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | iPhoneSimulator
6 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}
7 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
8 | Exe
9 | FormsPopup.iOS
10 | Resources
11 | FormsPopupiOS
12 |
13 |
14 | ..\..\
15 | true
16 |
17 |
18 | true
19 | full
20 | false
21 | bin\iPhoneSimulator\Debug
22 | DEBUG
23 | prompt
24 | 4
25 | false
26 | i386, x86_64
27 | None
28 | true
29 |
30 |
31 | none
32 | true
33 | bin\iPhoneSimulator\Release
34 | prompt
35 | 4
36 | None
37 | i386, x86_64
38 | false
39 |
40 |
41 | true
42 | full
43 | false
44 | bin\iPhone\Debug
45 | DEBUG
46 | prompt
47 | 4
48 | false
49 | ARMv7, ARM64
50 | iPhone Developer
51 | true
52 | Entitlements.plist
53 |
54 |
55 | none
56 | true
57 | bin\iPhone\Release
58 | prompt
59 | 4
60 | ARMv7, ARM64
61 | false
62 | iPhone Developer
63 | Entitlements.plist
64 |
65 |
66 | none
67 | True
68 | bin\iPhone\Ad-Hoc
69 | prompt
70 | 4
71 | False
72 | ARMv7, ARM64
73 | True
74 | Automatic:AdHoc
75 | iPhone Distribution
76 | Entitlements.plist
77 |
78 |
79 | none
80 | True
81 | bin\iPhone\AppStore
82 | prompt
83 | 4
84 | False
85 | ARMv7, ARM64
86 | Automatic:AppStore
87 | iPhone Distribution
88 | Entitlements.plist
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll
124 | True
125 |
126 |
127 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll
128 | True
129 |
130 |
131 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll
132 | True
133 |
134 |
135 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll
136 | True
137 |
138 |
139 |
140 |
141 |
142 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}
143 | FormsPopup.Examples
144 |
145 |
146 |
147 |
148 |
149 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
150 |
151 |
152 |
153 |
154 |
155 |
156 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIDeviceFamily
6 |
7 | 1
8 | 2
9 |
10 | UISupportedInterfaceOrientations
11 |
12 | UIInterfaceOrientationPortrait
13 | UIInterfaceOrientationLandscapeLeft
14 | UIInterfaceOrientationLandscapeRight
15 |
16 | UISupportedInterfaceOrientations~ipad
17 |
18 | UIInterfaceOrientationPortrait
19 | UIInterfaceOrientationPortraitUpsideDown
20 | UIInterfaceOrientationLandscapeLeft
21 | UIInterfaceOrientationLandscapeRight
22 |
23 | MinimumOSVersion
24 | 6.0
25 | CFBundleDisplayName
26 | FormsPopup
27 | CFBundleIdentifier
28 | com.yourcompany.FormsPopup
29 | CFBundleVersion
30 | 1.0
31 | CFBundleIconFiles
32 |
33 | Icon-60@2x
34 | Icon-60@3x
35 | Icon-76
36 | Icon-76@2x
37 | Default
38 | Default@2x
39 | Default-568h@2x
40 | Default-Portrait
41 | Default-Portrait@2x
42 | Icon-Small-40
43 | Icon-Small-40@2x
44 | Icon-Small-40@3x
45 | Icon-Small
46 | Icon-Small@2x
47 | Icon-Small@3x
48 |
49 | UILaunchStoryboardName
50 | LaunchScreen
51 |
52 |
53 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace FormsPopup.iOS
9 | {
10 | public class Application
11 | {
12 | // This is the main entry point of the application.
13 | static void Main(string[] args)
14 | {
15 | // if you want to use a different Application Delegate class from "AppDelegate"
16 | // you can specify it here.
17 | UIApplication.Main(args, null, "AppDelegate");
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("FormsPopup.iOS")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("FormsPopup.iOS")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default-568h@2x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Default-Portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default-Portrait.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Default-Portrait@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default-Portrait@2x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Default@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default@2x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-60@2x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-60@3x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-76.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-76@2x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small@2x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small@3x.png
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/Resources/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/iTunesArtwork:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/iTunesArtwork
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/iTunesArtwork@2x:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/iTunesArtwork@2x
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup.iOS/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/FormsPopup.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 10.0
6 | Debug
7 | AnyCPU
8 | {CA22517D-4B83-43F5-A23F-9207229D2024}
9 | Library
10 | Properties
11 | FormsPopup
12 | FormsPopup
13 | v4.5
14 | Profile78
15 | 512
16 | {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
17 |
18 |
19 | ..\..\
20 | true
21 |
22 |
23 | true
24 | full
25 | false
26 | bin\Debug\
27 | DEBUG;TRACE
28 | prompt
29 | 4
30 |
31 |
32 | pdbonly
33 | true
34 | bin\Release\
35 | TRACE
36 | prompt
37 | 4
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Core.dll
54 | True
55 |
56 |
57 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Platform.dll
58 | True
59 |
60 |
61 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Xaml.dll
62 | True
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
72 |
73 |
74 |
75 |
76 |
77 |
78 |
85 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/Popup.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using Xamarin.Forms;
4 |
5 | namespace FormsPopup
6 | {
7 | ///
8 | /// Popup view to be displayed over a .
9 | ///
10 | ///
11 | /// No default styles have been created for this view.
12 | ///
13 | public class Popup : ContentView
14 | {
15 | private readonly AbsoluteLayout _popupView = new AbsoluteLayout();
16 | private readonly RelativeLayout _sectionContainer = new RelativeLayout();
17 |
18 | private readonly ContentView _headerSection = new ContentView();
19 | private readonly ContentView _bodySection = new ContentView();
20 | private readonly ContentView _footerSection = new ContentView();
21 |
22 | private readonly BoxView _leftBorder = new BoxView();
23 | private readonly BoxView _rightBorder = new BoxView();
24 | private readonly BoxView _topBorder = new BoxView();
25 | private readonly BoxView _bottomBorder = new BoxView();
26 |
27 | private const double BorderWidth = 1;
28 |
29 |
30 | ///
31 | /// The SecionContainer includes the , , and
32 | ///
33 | public VisualElement SectionContainer => _sectionContainer;
34 |
35 |
36 | #region Events
37 |
38 |
39 | public event EventHandler Tapped;
40 | public event EventHandler Initializing;
41 | public event EventHandler Showing;
42 | public event EventHandler Shown;
43 |
44 | public event EventHandler Hiding;
45 | public event EventHandler Hidden;
46 |
47 |
48 | protected virtual void OnPropertyTapped(PopupTappedEventArgs e)
49 | {
50 | Tapped?.Invoke(this, e);
51 | }
52 |
53 |
54 | protected internal virtual void OnInitializing()
55 | {
56 | Initializing?.Invoke(this, EventArgs.Empty);
57 | }
58 |
59 |
60 | protected virtual PopupShowingEventArgs OnShowing()
61 | {
62 | var args = new PopupShowingEventArgs();
63 | Showing?.Invoke(this, args);
64 | return args;
65 | }
66 |
67 |
68 | protected virtual void OnShown()
69 | {
70 | Shown?.Invoke(this, EventArgs.Empty);
71 | }
72 |
73 |
74 | protected virtual PopupHidingEventArgs OnHiding()
75 | {
76 | var args = new PopupHidingEventArgs();
77 | Hiding?.Invoke(this, args);
78 | return args;
79 | }
80 |
81 |
82 | protected virtual void OnHidden()
83 | {
84 | Hidden?.Invoke(this, EventArgs.Empty);
85 | }
86 |
87 |
88 | #endregion
89 |
90 |
91 | #region Dependency Properties
92 |
93 |
94 | public static readonly BindableProperty HeaderProperty = BindableProperty.Create(nameof(Header), typeof(View), typeof(Popup), null, propertyChanged: OnHeaderPropertyChanged);
95 | public static readonly BindableProperty BodyProperty = BindableProperty.Create(nameof(Body), typeof (View), typeof (Popup), null, propertyChanged: OnBodyPropertyChanged);
96 | public static readonly BindableProperty FooterProperty = BindableProperty.Create(nameof(Footer), typeof (View), typeof (Popup), null, propertyChanged: OnFooterPropertyChanged);
97 |
98 | public static readonly BindableProperty XPositionRequestProperty = BindableProperty.Create(nameof(XPositionRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged);
99 | public static readonly BindableProperty YPositionRequestProperty = BindableProperty.Create(nameof(XPositionRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged);
100 |
101 | public static readonly BindableProperty LeftBorderColorProperty = BindableProperty.Create(nameof(LeftBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnLeftBorderChanged);
102 | public static readonly BindableProperty RightBorderColorProperty = BindableProperty.Create(nameof(RightBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnRightBorderChanged);
103 | public static readonly BindableProperty TopBorderColorProperty = BindableProperty.Create(nameof(TopBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnTopBorderChanged);
104 | public static readonly BindableProperty BottomBorderColorProperty = BindableProperty.Create(nameof(BottomBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnBottomBorderChanged);
105 |
106 |
107 | public static readonly BindableProperty ContentWidthRequestProperty = BindableProperty.Create(nameof(ContentWidthRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged);
108 | public static readonly BindableProperty ContentHeightRequestProperty = BindableProperty.Create(nameof(ContentHeightRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged);
109 |
110 | internal static readonly BindableProperty SectionTypeProperty = BindableProperty.CreateAttached("SectionType", typeof (PopupSectionType), typeof (Popup), PopupSectionType.NotSet);
111 |
112 |
113 | public View Header
114 | {
115 | get { return (View)GetValue(HeaderProperty); }
116 | set
117 | {
118 | SetValue(HeaderProperty, value);
119 | _headerSection.Content = value;
120 | }
121 | }
122 |
123 | public View Body
124 | {
125 | get { return (View)GetValue(BodyProperty); }
126 | set
127 | {
128 | SetValue(BodyProperty, value);
129 | _bodySection.Content = value;
130 | }
131 | }
132 |
133 |
134 | public View Footer
135 | {
136 | get { return (View)GetValue(FooterProperty); }
137 | set
138 | {
139 | SetValue(FooterProperty, value);
140 | _footerSection.Content = value;
141 | }
142 | }
143 |
144 |
145 | public double XPositionRequest
146 | {
147 | get { return (double)GetValue(XPositionRequestProperty); }
148 | set { SetValue(XPositionRequestProperty, value); }
149 | }
150 |
151 |
152 | public double YPositionRequest
153 | {
154 | get { return (double)GetValue(YPositionRequestProperty); }
155 | set { SetValue(YPositionRequestProperty, value); }
156 | }
157 |
158 |
159 | public Color LeftBorderColor
160 | {
161 | get { return (Color)GetValue(LeftBorderColorProperty); }
162 | set { SetValue(LeftBorderColorProperty, value); }
163 | }
164 |
165 |
166 | public Color RightBorderColor
167 | {
168 | get { return (Color)GetValue(RightBorderColorProperty); }
169 | set { SetValue(RightBorderColorProperty, value); }
170 | }
171 |
172 |
173 | public Color TopBorderColor
174 | {
175 | get { return (Color)GetValue(TopBorderColorProperty); }
176 | set { SetValue(TopBorderColorProperty, value); }
177 | }
178 |
179 |
180 | public Color BottomBorderColor
181 | {
182 | get { return (Color)GetValue(BottomBorderColorProperty); }
183 | set { SetValue(BottomBorderColorProperty, value); }
184 | }
185 |
186 |
187 | public double ContentWidthRequest
188 | {
189 | get { return (double)GetValue(ContentWidthRequestProperty); }
190 | set { SetValue(ContentWidthRequestProperty, value); }
191 | }
192 |
193 |
194 | public double ContentHeightRequest
195 | {
196 | get { return (double)GetValue(ContentHeightRequestProperty); }
197 | set { SetValue(ContentHeightRequestProperty, value); }
198 | }
199 |
200 |
201 | #endregion
202 |
203 |
204 | #region Dependency Properties Changing
205 |
206 |
207 | private static void OnHeaderPropertyChanged(BindableObject bindable, object oldValue, object newValue)
208 | {
209 | var popup = (Popup)bindable;
210 | popup.Header = (View)newValue;
211 | }
212 |
213 |
214 | private static void OnBodyPropertyChanged(BindableObject bindable, object oldValue, object newValue)
215 | {
216 | var popup = (Popup)bindable;
217 | popup.Body = (View)newValue;
218 | }
219 |
220 |
221 | private static void OnFooterPropertyChanged(BindableObject bindable, object oldValue, object newValue)
222 | {
223 | var popup = (Popup)bindable;
224 | popup.Footer = (View)newValue;
225 | }
226 |
227 |
228 | private static void OnPositionChanged(BindableObject bindable, object oldvalue, object newvalue)
229 | {
230 | var view = (VisualElement)bindable;
231 | var popup = view.FindParent();
232 |
233 | var rect = new Rectangle(popup.XPositionRequest, popup.YPositionRequest, popup.ContentWidthRequest, popup.ContentHeightRequest);
234 | view.Layout(rect);
235 | AbsoluteLayout.SetLayoutBounds(view, rect);
236 | }
237 |
238 |
239 | private static void OnLeftBorderChanged(BindableObject bindable, object oldvalue, object newvalue)
240 | {
241 | var popup = (Popup)bindable;
242 | if (popup == null) return;
243 |
244 | popup._leftBorder.BackgroundColor = (Color) newvalue;
245 | }
246 |
247 |
248 | private static void OnRightBorderChanged(BindableObject bindable, object oldvalue, object newvalue)
249 | {
250 | var popup = (Popup)bindable;
251 | if (popup == null) return;
252 |
253 | popup._rightBorder.BackgroundColor = (Color) newvalue;
254 | }
255 |
256 |
257 | private static void OnTopBorderChanged(BindableObject bindable, object oldvalue, object newvalue)
258 | {
259 | var popup = (Popup)bindable;
260 | if (popup == null) return;
261 |
262 | popup._topBorder.BackgroundColor = (Color) newvalue;
263 | }
264 |
265 |
266 | private static void OnBottomBorderChanged(BindableObject bindable, object oldvalue, object newvalue)
267 | {
268 | var popup = (Popup)bindable;
269 | if (popup == null) return;
270 |
271 | popup._bottomBorder.BackgroundColor = (Color) newvalue;
272 | }
273 |
274 |
275 | #endregion
276 |
277 |
278 | public Popup()
279 | {
280 | IsVisible = false;
281 | _sectionContainer.BindingContext = this;
282 | _sectionContainer.Padding = 0;
283 | _popupView.Padding = 0;
284 | _bodySection.VerticalOptions = LayoutOptions.FillAndExpand;
285 |
286 |
287 | // Used to identify if the user tapped within the header, body, or footer.
288 | _headerSection.SetValue(SectionTypeProperty, PopupSectionType.Header);
289 | _bodySection.SetValue(SectionTypeProperty, PopupSectionType.Body);
290 | _footerSection.SetValue(SectionTypeProperty, PopupSectionType.Footer);
291 | _popupView.SetValue(SectionTypeProperty, PopupSectionType.Backdrop);
292 |
293 |
294 | // Used to assign border colors
295 | _leftBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.LeftBorderColor));
296 | _rightBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.RightBorderColor));
297 | _bottomBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.BottomBorderColor));
298 | _topBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.TopBorderColor));
299 |
300 |
301 | // Adjust the layout bounds (not the overlay)
302 | _sectionContainer.SetBinding(ContentWidthRequestProperty, Binding.Create((Popup p) => p.ContentWidthRequest));
303 | _sectionContainer.SetBinding(ContentHeightRequestProperty, Binding.Create((Popup p) => p.ContentHeightRequest));
304 | _sectionContainer.SetBinding(XPositionRequestProperty, Binding.Create((Popup p) => p.XPositionRequest));
305 | _sectionContainer.SetBinding(YPositionRequestProperty, Binding.Create((Popup p) => p.YPositionRequest));
306 |
307 |
308 | // sizing section container. The overlay is not sized in this class.
309 | AbsoluteLayout.SetLayoutFlags(_sectionContainer, AbsoluteLayoutFlags.All);
310 | AbsoluteLayout.SetLayoutBounds(_sectionContainer, new Rectangle(0, 0, 1, 1));
311 |
312 | Initializing += OnPopupInitializing;
313 |
314 |
315 | // Create the content
316 | var content = new StackLayout
317 | {
318 | Padding = 0,
319 | Spacing = 0,
320 | Orientation = StackOrientation.Vertical,
321 |
322 | Children =
323 | {
324 | _headerSection,
325 | _bodySection,
326 | _footerSection
327 | }
328 | };
329 |
330 | _popupView.Children.Add(_sectionContainer);
331 |
332 |
333 | // Position content
334 | _sectionContainer.Children.Add(content,
335 | Constraint.Constant(XPositionRequest),
336 | Constraint.Constant(YPositionRequest),
337 | Constraint.RelativeToParent(p => p.Width),
338 | Constraint.RelativeToParent(p => p.Height));
339 |
340 | // Position left border
341 | _sectionContainer.Children.Add(_leftBorder,
342 | Constraint.Constant(0),
343 | Constraint.Constant(0),
344 | Constraint.Constant(BorderWidth),
345 | Constraint.RelativeToParent(p => p.Height));
346 |
347 | // Position right border
348 | _sectionContainer.Children.Add(_rightBorder,
349 | Constraint.RelativeToParent(p => p.Width),
350 | Constraint.Constant(0),
351 | Constraint.Constant(BorderWidth),
352 | Constraint.RelativeToParent(p => p.Height));
353 |
354 | // Position top border
355 | _sectionContainer.Children.Add(_topBorder,
356 | Constraint.Constant(0),
357 | Constraint.Constant(0),
358 | Constraint.RelativeToParent(p => p.Width),
359 | Constraint.Constant(BorderWidth));
360 |
361 | // Position bottom border
362 | _sectionContainer.Children.Add(_bottomBorder,
363 | Constraint.Constant(0),
364 | Constraint.RelativeToParent(p => p.Height),
365 | Constraint.RelativeToParent(p => p.Width),
366 | Constraint.Constant(BorderWidth));
367 |
368 | Content = _popupView;
369 | }
370 |
371 |
372 | ///
373 | /// Show the popup view.
374 | ///
375 | /// The method is passed the VisualElement that contains the body, header, and footer
376 | ///
377 | /// This method is not limited adding animations.
378 | ///
379 | public async Task ShowAsync(Func animation)
380 | {
381 | if (IsVisible)
382 | {
383 | return;
384 | }
385 |
386 | var parent = Parent.FindParent();
387 | parent?.RaiseChild(_popupView);
388 |
389 | var handlerResponse = OnShowing();
390 | if (handlerResponse.Cancel)
391 | {
392 | return;
393 | }
394 |
395 | IsVisible = true;
396 |
397 | if (animation == null)
398 | {
399 | await Task.FromResult(0);
400 | }
401 | else
402 | {
403 | // the overlay is not passed to the caller
404 | await animation(this);
405 | }
406 |
407 | OnShown();
408 | }
409 |
410 |
411 | ///
412 | /// Show the popup view.
413 | ///
414 | public void Show()
415 | {
416 | #pragma warning disable 4014
417 | ShowAsync(null);
418 | #pragma warning restore 4014
419 | }
420 |
421 |
422 | ///
423 | /// Hide the popup view.
424 | ///
425 | /// The method is passed the VisualElement that contains the body, header, and footer
426 | ///
427 | /// This method is not limited adding animations.
428 | ///
429 | public async Task HideAsync(Func animation)
430 | {
431 | if (!IsVisible)
432 | {
433 | return;
434 | }
435 |
436 | var handlerResponse = OnHiding();
437 |
438 | if (handlerResponse.Cancel)
439 | {
440 | return;
441 | }
442 |
443 | if (animation == null)
444 | {
445 | await Task.FromResult(0);
446 | }
447 | else
448 | {
449 | // the overlay is not passed to the caller
450 | await animation(this);
451 | }
452 |
453 | IsVisible = false;
454 |
455 | OnHidden();
456 | }
457 |
458 |
459 | ///
460 | /// Hide the popup view.
461 | ///
462 | public void Hide()
463 | {
464 | #pragma warning disable 4014
465 | HideAsync(null);
466 | #pragma warning restore 4014
467 | }
468 |
469 |
470 | private void OnPopupInitializing(object sender, EventArgs e)
471 | {
472 | Func factory = delegate
473 | {
474 | var closeOnTap = new TapGestureRecognizer();
475 |
476 | var cmd = new Command(obj =>
477 | {
478 | var view = obj as View;
479 |
480 | if (view == null)
481 | {
482 | return;
483 | }
484 |
485 | var evt = PopupTappedEventArgs.Create(this, view);
486 |
487 | OnPropertyTapped(evt);
488 | });
489 |
490 | closeOnTap.Command = cmd;
491 | return closeOnTap;
492 | };
493 |
494 | TapGestureRecognizerVisitor.Visit(_popupView, factory);
495 | }
496 | }
497 | }
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/PopupHidingEventArgs.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace FormsPopup
4 | {
5 | ///
6 | /// Represents the available event data, when the event is invoked.
7 | ///
8 | public class PopupHidingEventArgs : EventArgs
9 | {
10 | ///
11 | /// The event can be stopped, by assigning true to this property.
12 | ///
13 | public bool Cancel { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/PopupPage.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.ObjectModel;
2 | using System.Collections.Specialized;
3 | using Xamarin.Forms;
4 |
5 | namespace FormsPopup
6 | {
7 | ///
8 | /// One of two methods must be taken to utilize the view.
9 | /// 1) The visible page must inherit from
10 | /// 2) The visible page must instantiate an object of in page's constructor
11 | ///
12 | public abstract class PopupPage : ContentPage
13 | {
14 | private readonly PopupPageInitializer _popupInit;
15 | public ObservableCollection Popups { get; protected set; }
16 |
17 |
18 | protected PopupPage()
19 | {
20 | _popupInit = new PopupPageInitializer(this);
21 | Popups = new ObservableCollection();
22 | Popups.CollectionChanged += Popups_CollectionChanged;
23 | }
24 |
25 |
26 | private void Popups_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
27 | {
28 | if (e.Action == NotifyCollectionChangedAction.Add)
29 | {
30 | foreach (Popup item in e.NewItems)
31 | {
32 | _popupInit.Add(item);
33 | }
34 | }
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/PopupPageInitializer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections;
3 | using System.Collections.Generic;
4 | using Xamarin.Forms;
5 |
6 | namespace FormsPopup
7 | {
8 | ///
9 | /// Initialize the views that are shown from a
10 | ///
11 | public sealed class PopupPageInitializer : IEnumerable
12 | {
13 | private readonly List _popups = new List();
14 | private readonly AbsoluteLayout _absContent = new AbsoluteLayout();
15 | private bool _initialized;
16 |
17 | public ContentPage ParentPage { get; set; }
18 | public IEnumerable Popups => _popups;
19 |
20 |
21 | ///
22 | /// Instantiate
23 | ///
24 | /// The page that contains the views
25 | public PopupPageInitializer(ContentPage parentPage)
26 | {
27 | if (parentPage == null) throw new ArgumentNullException(nameof(parentPage));
28 |
29 | ParentPage = parentPage;
30 | parentPage.ChildAdded += ParentPage_ChildAdded;
31 | parentPage.Appearing += ParentPage_Appearing;
32 | }
33 |
34 |
35 | ///
36 | /// This method must be called before the property is set.
37 | ///
38 | /// The popup to be initialized
39 | public void Add(Popup popup)
40 | {
41 | if (popup == null) throw new ArgumentNullException(nameof(popup));
42 | _popups.Add(popup);
43 | }
44 |
45 |
46 | public IEnumerator GetEnumerator()
47 | {
48 | return _popups.GetEnumerator();
49 | }
50 |
51 |
52 | IEnumerator IEnumerable.GetEnumerator()
53 | {
54 | return GetEnumerator();
55 | }
56 |
57 |
58 | private void Initialize()
59 | {
60 | if (_initialized) return;
61 | _initialized = true;
62 |
63 | var oldContent = ParentPage.Content;
64 |
65 | Device.OnPlatform(() => ParentPage.Content = null);
66 |
67 | _absContent.Children.Add(oldContent);
68 |
69 | AbsoluteLayout.SetLayoutFlags(oldContent, AbsoluteLayoutFlags.All);
70 | AbsoluteLayout.SetLayoutBounds(oldContent, new Rectangle(0, 0, 1, 1));
71 |
72 | ParentPage.Content = _absContent;
73 | }
74 |
75 |
76 | private void ParentPage_ChildAdded(object sender, ElementEventArgs e)
77 | {
78 | if (ParentPage is PopupPage) return;
79 |
80 | if (ParentPage.Content == e.Element && e.Element != _absContent)
81 | {
82 | Initialize();
83 | }
84 | }
85 |
86 |
87 | private void ParentPage_Appearing(object sender, EventArgs e)
88 | {
89 | Initialize();
90 |
91 | foreach (var popup in Popups)
92 | {
93 | _absContent.Children.Add(popup, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All);
94 | popup.OnInitializing();
95 | }
96 | }
97 | }
98 | }
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/PopupSectionType.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace FormsPopup
4 | {
5 | ///
6 | /// Used to identify the logical sections of a .
7 | ///
8 | [Flags]
9 | public enum PopupSectionType
10 | {
11 | NotSet,
12 | Border,
13 | Backdrop,
14 | Header,
15 | Body,
16 | Footer
17 | }
18 | }
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/PopupShowingEventArgs.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace FormsPopup
4 | {
5 | ///
6 | /// Represents the available event data, when the event is invoked.
7 | ///
8 | public class PopupShowingEventArgs : EventArgs
9 | {
10 | ///
11 | /// The event can be stopped, by assigning true to this property.
12 | ///
13 | public bool Cancel { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/PopupTappedEventArgs.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Xamarin.Forms;
3 |
4 | namespace FormsPopup
5 | {
6 | ///
7 | /// Represents the available event data, when the event is invoked.
8 | ///
9 | public class PopupTappedEventArgs : EventArgs
10 | {
11 | public PopupSectionType Section { get; set; }
12 | public View ControlTapped { get; set; }
13 | public Popup Popup { get; set; }
14 | public bool IsUserControl { get; set; }
15 |
16 |
17 | ///
18 | /// Instantiate a new
19 | ///
20 | /// The popup that was tapped
21 | /// The view that was tapped
22 | ///
23 | public static PopupTappedEventArgs Create(Popup popup, View view)
24 | {
25 | PopupSectionType housingSectionType;
26 |
27 | var parentView = view.FindParent(ve =>
28 | {
29 | var parentSectionType = ve.GetValue(Popup.SectionTypeProperty);
30 | var currentSection = (PopupSectionType)parentSectionType;
31 |
32 | return currentSection == PopupSectionType.Body
33 | || currentSection == PopupSectionType.Footer
34 | || currentSection == PopupSectionType.Header;
35 | });
36 |
37 |
38 | if (parentView == null)
39 | {
40 | housingSectionType = PopupSectionType.Backdrop;
41 | }
42 | else
43 | {
44 | housingSectionType = (PopupSectionType)parentView.GetValue(Popup.SectionTypeProperty);
45 | }
46 |
47 |
48 | var controlType = (PopupSectionType)view.GetValue(Popup.SectionTypeProperty);
49 | var evt = new PopupTappedEventArgs
50 | {
51 | Popup = popup,
52 | ControlTapped = view,
53 | IsUserControl = controlType == PopupSectionType.NotSet,
54 | Section = housingSectionType
55 | };
56 |
57 | return evt;
58 | }
59 | }
60 | }
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Resources;
2 | using System.Reflection;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("FormsPopup")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("FormsPopup")]
14 | [assembly: AssemblyCopyright("Copyright © 2014")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: NeutralResourcesLanguage("en")]
18 |
19 | // Version information for an assembly consists of the following four values:
20 | //
21 | // Major Version
22 | // Minor Version
23 | // Build Number
24 | // Revision
25 | //
26 | // You can specify all the values or you can default the Build and Revision Numbers
27 | // by using the '*' as shown below:
28 | // [assembly: AssemblyVersion("1.0.*")]
29 | [assembly: AssemblyVersion("1.0.0.0")]
30 | [assembly: AssemblyFileVersion("1.0.0.0")]
31 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/TapGestureRecognizerVisitor.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Xamarin.Forms;
3 |
4 | namespace FormsPopup
5 | {
6 | internal static class TapGestureRecognizerVisitor
7 | {
8 | ///
9 | /// Add a GestureRecognizer to the and any children it may contain.
10 | ///
11 | /// The view to add the behavior to.
12 | /// A method that returns a GestureRecognizer
13 | ///
14 | public static void Visit(View view, Func factoryMethod)
15 | {
16 | var behavior = factoryMethod();
17 | var tapBehavior = behavior as TapGestureRecognizer;
18 |
19 | if (tapBehavior == null)
20 | {
21 | throw new InvalidOperationException("The factoryMethod must return a TapGestureRecognizer");
22 | }
23 |
24 | tapBehavior.CommandParameter = view;
25 | view.GestureRecognizers.Add(behavior);
26 | VisitChildren(view as ILayoutController, factoryMethod);
27 | }
28 |
29 |
30 | private static void VisitChildren(ILayoutController controller, Func factoryMethod)
31 | {
32 | if (controller == null || controller.Children.Count == 0)
33 | {
34 | return;
35 | }
36 |
37 | foreach (var child in controller.Children)
38 | {
39 | /**
40 | * All controls should get a TapGestureRecognizer, in the event they are touched.
41 | */
42 |
43 | if (child is ILayoutController)
44 | {
45 | VisitChildren(child as ILayoutController, factoryMethod);
46 | }
47 |
48 | var view = child as View;
49 | if (view == null)
50 | {
51 | return;
52 | }
53 |
54 | if (view is Button)
55 | {
56 | return;
57 | }
58 |
59 | var behavior = factoryMethod();
60 | var tapBehavior = behavior as TapGestureRecognizer;
61 |
62 | if (tapBehavior != null)
63 | {
64 | tapBehavior.CommandParameter = view;
65 | }
66 |
67 | view.GestureRecognizers.Add(behavior);
68 | }
69 | }
70 | }
71 | }
72 |
73 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/VisualElementExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Xamarin.Forms;
3 |
4 | namespace FormsPopup
5 | {
6 | ///
7 | /// VisualElement utility methods
8 | ///
9 | public static class VisualElementExtensions
10 | {
11 | ///
12 | /// Search the element hierarchy for an ancestor of type and return it.
13 | ///
14 | /// The starting location of the search
15 | public static T FindParent(this Element visual) where T : Element
16 | {
17 | var obj = visual;
18 | while ((obj as T) == null)
19 | {
20 | if (obj.Parent == null)
21 | {
22 | return null;
23 | }
24 |
25 | obj = obj.Parent;
26 | }
27 |
28 | return (T)obj;
29 | }
30 |
31 |
32 | ///
33 | /// Search the element hierarchy for a parent that meets the supplied condition.
34 | ///
35 | /// The starting location of the search
36 | /// The condition that is recursively called for each parent view in the hierarchy
37 | ///
38 | public static Element FindParent(this Element visual, Predicate condition)
39 | {
40 | if (visual.Parent == null)
41 | {
42 | return null;
43 | }
44 |
45 | var current = visual.Parent;
46 |
47 | while (current != null)
48 | {
49 | var result = condition(current);
50 |
51 | if (result)
52 | {
53 | return current;
54 | }
55 |
56 | current = current.Parent;
57 | }
58 |
59 | return null;
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/FormsPopup/FormsPopup/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Michael Davis
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 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Xamarin.Forms Popup View
3 |
4 | This repository houses an example of using the Xamarin.Forms API to create a popup view.
5 | I chose not to use any platform APIs (Xamarin.Android or Xamarin.iOS) while implementing the view, as I wished to experiment with the framework. That said, it's still a fairly *featureful* implementation.
6 |
7 | **Projects**
8 |
9 | * FormsPopup (The `Popup` implementation)
10 | * FormsPopup.Examples
11 | * FormsPopup.Droid
12 | * FormsPopup.iOS
13 |
14 | ## A short note ##
15 |
16 | This project has a few documented issues. They are mostly related to iOS9.
17 |
18 | ## Initializing
19 |
20 | The current implementation requires either one of two conditions be met before you can use a popup view within a `Page`:
21 |
22 | 1. The visible page must extend from the `PopupPage` class.
23 | 2. Any visible page that does not extend from `PopupPage` must instantiate an object of type `PopupPageInitializer` after the page's content has been set. This is easier than it seems:
24 |
25 | **Example**
26 |
27 | ```csharp
28 | public class CodedSimpleExample : ContentPage
29 | {
30 | public CodedSimpleExample()
31 | {
32 | var popup = new Popup
33 | {
34 | XPositionRequest = 0.5,
35 | YPositionRequest = 0.2,
36 | ContentHeightRequest = 0.1,
37 | ContentWidthRequest = 0.4,
38 | Padding = 10,
39 |
40 | Body = new ContentView
41 | {
42 | BackgroundColor = Color.White,
43 | Content = new Label
44 | {
45 | XAlign = TextAlignment.Center,
46 | YAlign = TextAlignment.Center,
47 | TextColor = Color.Black,
48 | Text = "Hello, World!"
49 | }
50 | }
51 | };
52 |
53 | var button = new Button {Text = "Show Popup"};
54 | button.Clicked += (s, e) => popup.Show();
55 |
56 | Content = new StackLayout
57 | {
58 | Children =
59 | {
60 | button
61 | }
62 | };
63 |
64 | // Required for the popup to work. It must come after the Content has been set.
65 | new PopupPageInitializer(this) {popup};
66 | }
67 | }
68 | ```
69 |
70 | Two examples have been added to the `FormsPopup.Examples` project to demonstrate this point. Reference either `CodedPopupExample.cs` or `XamlPopupExample.xaml/XamlPopupExample.cs`.
71 |
72 | ## Sizing and Placement
73 |
74 | The current implementation relies heavily on proportional sizes. For any `Popup` properties that require a location or size, you should pass in a value between 0 and 1.
75 |
76 | **Example**
77 |
78 | ```csharp
79 | var popup = new Popup
80 | {
81 | XPositionRequest = 0.5,
82 | YPositionRequest = 0.5,
83 | ContentWidthRequest = 0.8,
84 | ContentHeightRequest = 0.8
85 | };
86 | ```
87 |
88 | ## Events
89 |
90 | The following events are invoked during various moments in a popup's life cycle. They're availble to all `Popup` views.
91 |
92 | * Initializing (happens once, during the hosting page's `Appearing` event)
93 | * Tapped
94 | * Showing
95 | * Shown
96 | * Hiding
97 | * Hidden
98 |
99 | The `Tapped`, `Showing`, and `Hiding` events can be cancelled by using the event argument property:
100 |
101 | **Example**
102 |
103 | ```csharp
104 | private void Popup1_Showing(object sender, PopupShowingEventArgs e)
105 | {
106 | if (_preventShowing.On)
107 | {
108 | e.Cancel = true;
109 | }
110 | }
111 | ```
112 |
113 | ## Animations
114 |
115 | The `Popup.ShowAsync()` and `Popup.HideAsync()` methods can be used to add animations. If you do not wish to include animations, you can use either `Popup.Show()` or `Popup.Hide()`.
116 |
117 | **Example**
118 |
119 | ```csharp
120 | double original;
121 |
122 | await popup.ShowAsync(async p =>
123 | {
124 | original = p.Scale;
125 |
126 | await Task.WhenAll
127 | (
128 | /**
129 | * Since p is the Popup object, scaling it would also affect the overlay
130 | * behind the popup's body. Although it wouldn't be noticeable in this simple example,
131 | * it would be if the overlay's color was set.
132 | **/
133 |
134 | p.SectionContainer.RelScaleTo(0.05, 100, Easing.CubicOut),
135 | p.SectionContainer.RelScaleTo(-0.05, 105, Easing.CubicOut)
136 | ).ContinueWith(c =>
137 | { // reset popup to original size
138 | p.SectionContainer.Scale = original;
139 | });
140 | });
141 | ```
142 |
143 | ## Styling
144 |
145 | At this moment, there are no default styles for the popup. Your views will inherit whatever styles you have attached to your resource dictionaries.
146 |
147 | ## Miscellaneous Features
148 |
149 | * The left, top, right, and bottom border colors can be individually set
150 | * During the `Tapped` event, you can determine if the user tapped within the header, body, or footer sections.
151 |
152 | ## Screenshots
153 | 
154 | 
155 |
156 |
157 | More screenshots are available in the repository.
158 |
159 | ## FAQ
160 |
161 |
162 | - Q. Can I use XAML to create popup views?
163 | - A. Of course!
164 |
165 | - Q. Can I add control XX in the popup?
166 | - A. I don't see why not. Let me know if you have any problems.
167 |
168 |
--------------------------------------------------------------------------------
/pictures/androidPopup.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/pictures/androidPopup.gif
--------------------------------------------------------------------------------
/pictures/gridlayout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/pictures/gridlayout.png
--------------------------------------------------------------------------------
/pictures/iOSPopup.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/pictures/iOSPopup.gif
--------------------------------------------------------------------------------