public async Task FlyoutHeaderAdaptsToMinimumHeight() { await RunShellTest(shell => { var layout = new VerticalStackLayout() { new Label() { Text = "Flyout Header" } }; layout.MinimumHeightRequest = 30; shell.FlyoutHeader = layout; shell.FlyoutHeaderBehavior = FlyoutHeaderBehavior.CollapseOnScroll; }, async (shell, handler) => { await OpenFlyout(handler); var flyoutFrame = GetFrameRelativeToFlyout(handler, shell.FlyoutHeader as IView); AssertionExtensions.CloseEnough(flyoutFrame.Height, 30); }); }
public void UpdateRespectsCascadeInputTransparent() { var layout = new VerticalStackLayout() { InputTransparent = true, CascadeInputTransparent = true }; var handler = Substitute.For <IViewHandler>(); layout.Handler = handler; var child0 = new Button() { InputTransparent = false }; layout.Add(child0); var child1 = new Button() { InputTransparent = false }; layout[0] = child1; handler.Received(2).UpdateValue(Arg.Is(nameof(Layout.CascadeInputTransparent))); }
public async Task FlyoutContentRenderersWhenFlyoutBehaviorStartsAsLocked() { SetupBuilder(); var flyoutContent = new VerticalStackLayout() { Children = { new Label() { Text = "Rendered" } } }; var shell = await CreateShellAsync(shell => { shell.CurrentItem = new FlyoutItem() { Items = { new ContentPage() } }; shell.FlyoutContent = flyoutContent; shell.FlyoutBehavior = FlyoutBehavior.Locked; }); await CreateHandlerAndAddToWindow <ShellHandler>(shell, async (handler) => { await OnLayoutPassCompleted(flyoutContent); Assert.NotNull(flyoutContent.Handler); Assert.True(flyoutContent.Frame.Width > 0); Assert.True(flyoutContent.Frame.Height > 0); }); }
public async Task BasicLoadUnloadingWorks() { var behavior = new PlatformBehaviorTest(); var editor = new Editor(); editor.Behaviors.Add(behavior); IView layout = new VerticalStackLayout() { Children = { editor } }; Assert.False(behavior.IsAttached); Assert.Equal(0, behavior.AttachedCount); Assert.Equal(0, behavior.DetachedCount); await CreateHandlerAndAddToWindow <LayoutHandler>(layout, (_) => { Assert.True(behavior.IsAttached); Assert.Equal(1, behavior.AttachedCount); Assert.Equal(0, behavior.DetachedCount); return(Task.CompletedTask); }); Assert.False(behavior.IsAttached); Assert.Equal(1, behavior.AttachedCount); Assert.Equal(1, behavior.DetachedCount); }
public async Task FooterTemplateMeasuresToSetFlyoutWidth() { SetupBuilder(); VerticalStackLayout footer = new VerticalStackLayout() { new Label() { Text = "Hello there" } }; var shell = await CreateShellAsync(shell => { shell.CurrentItem = new FlyoutItem() { Items = { new ContentPage() }, Title = "Flyout Item" }; shell.FlyoutBehavior = FlyoutBehavior.Locked; shell.FlyoutWidth = 20; shell.FlyoutFooter = footer; }); await CreateHandlerAndAddToWindow <ShellRenderer>(shell, async (handler) => { await OnFrameSetToNotEmpty(footer); Assert.True(Math.Abs(20 - footer.Frame.Width) < 1); Assert.True(footer.Frame.Height > 0); }); }
public async Task ContentOffsetsCorrectlyFromAppTitleBar() { SetupBuilder(); var flyoutContent = new VerticalStackLayout() { HorizontalOptions = LayoutOptions.Fill }; var contentPage = new ContentPage() { Content = new VerticalStackLayout() }; var shell = await InvokeOnMainThreadAsync(() => { return(new Shell() { FlyoutContent = flyoutContent, CurrentItem = contentPage, FlyoutBehavior = FlyoutBehavior.Locked }); }); await CreateHandlerAndAddToWindow <ShellHandler>(shell, (handler) => { var rootManager = handler.MauiContext.GetNavigationRootManager(); var position = contentPage.GetLocationRelativeTo(rootManager.AppTitleBar); var distance = rootManager.AppTitleBar.ActualHeight - position.Value.Y; Assert.True(Math.Abs(distance) < 1); return(Task.CompletedTask); }); }
public async Task FlyoutLockedOffsetsCorrectlyFromContent() { SetupBuilder(); var flyoutContent = new VerticalStackLayout() { HorizontalOptions = LayoutOptions.Fill }; var contentPage = new ContentPage() { Content = new VerticalStackLayout() }; var shell = await InvokeOnMainThreadAsync(() => { return(new Shell() { FlyoutContent = flyoutContent, CurrentItem = contentPage, FlyoutBehavior = FlyoutBehavior.Locked }); }); await CreateHandlerAndAddToWindow <ShellHandler>(shell, (handler) => { var position = contentPage.GetLocationRelativeTo(flyoutContent); var distance = position.Value.X - flyoutContent.Width; Assert.True(Math.Abs(distance) < 1); return(Task.CompletedTask); }); }
public async Task FlyoutItemsRenderWhenFlyoutHeaderIsSet() { SetupBuilder(); VerticalStackLayout header = new VerticalStackLayout() { new Label() { Text = "Hello there" } }; var shell = await CreateShellAsync(shell => { shell.CurrentItem = new FlyoutItem() { Items = { new ContentPage() }, Title = "Flyout Item" }; shell.FlyoutHeader = header; }); await CreateHandlerAndAddToWindow <ShellRenderer>(shell, async (handler) => { await Task.Delay(100); var dl = GetDrawerLayout(handler); await OpenFlyout(handler); var flyoutContainer = GetFlyoutMenuReyclerView(handler); Assert.True(flyoutContainer.MeasuredWidth > 0); Assert.True(flyoutContainer.MeasuredHeight > 0); }); }
public async Task ReAssigninListViewInVSLCrashes() { SetupBuilder(); var listView = new ListView() { ItemTemplate = new DataTemplate(() => { return(new ViewCell() { View = new VerticalStackLayout() { new Label() { Text = "Cat" } } }); }) }; var layout = new VerticalStackLayout() { listView }; await CreateHandlerAndAddToWindow <LayoutHandler>(layout, async (handler) => { listView.ItemsSource = Enumerable.Range(1, 1); await Task.Delay(100); ValidatePlatformCells(listView); listView.ItemsSource = Enumerable.Range(1, 2); await Task.Delay(100); ValidatePlatformCells(listView); }); }
void SetupMauiLayout() { var verticalStack = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Colors.Purple, }; verticalStack.Add(new Label { Text = "The content below is brought to you by Blazor!", FontSize = 24, TextColor = Colors.BlanchedAlmond, HorizontalOptions = LayoutOptions.Center }); var bwv = new BlazorWebView { // General properties BackgroundColor = Colors.Orange, HeightRequest = 400, MinimumHeightRequest = 400, VerticalOptions = LayoutOptions.FillAndExpand, // BlazorWebView properties HostPage = @"wwwroot/index.html", }; bwv.RootComponents.Add(new RootComponent { Selector = "#app", ComponentType = typeof(Main) }); verticalStack.Add(bwv); verticalStack.Add(new Label { Text = "Thank you for using Blazor and .NET MAUI!", FontSize = 24, TextColor = Colors.BlanchedAlmond, HorizontalOptions = LayoutOptions.Center }); Content = verticalStack; }
public async Task FlyoutCustomContentMargin(Func <Shell, object, string> shellPart) { var baselineContent = new VerticalStackLayout() { new Label() { Text = "Flyout Layout Part" } }; Rect frameWithoutMargin = Rect.Zero; // determine the location of the templated content on the screen without a margin await RunShellTest(shell => { _ = shellPart(shell, baselineContent); }, async (shell, handler) => { await OpenFlyout(handler); frameWithoutMargin = GetFrameRelativeToFlyout(handler, baselineContent); }); var content = new VerticalStackLayout() { new Label() { Text = "Flyout Layout Part" } }; string partTesting = string.Empty; await RunShellTest(shell => { content.Margin = new Thickness(20, 30, 0, 30); partTesting = shellPart(shell, content); }, async (shell, handler) => { await OpenFlyout(handler); var frameWithMargin = GetFrameRelativeToFlyout(handler, content); var leftDiff = Math.Abs(Math.Abs(frameWithMargin.Left - frameWithoutMargin.Left) - 20); var verticalDiff = Math.Abs(Math.Abs(frameWithMargin.Top - frameWithoutMargin.Top) - 30); AssertionExtensions.AssertWithMessage(() => Assert.True(leftDiff < 0.2), $"{partTesting} Left Margin Incorrect. Frame w/ margin: {frameWithMargin}. Frame w/o marin : {frameWithoutMargin}" ); AssertionExtensions.AssertWithMessage(() => Assert.True(verticalDiff < 0.2), $"{partTesting} Top Margin Incorrect. Frame w/ margin: {frameWithMargin}. Frame w/o marin : {frameWithoutMargin}" ); }); }
public NewContent1() { Content = new VerticalStackLayout { Children = { new Label { HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, Text = "Welcome to .NET MAUI!" } } }; }
public VerticalStackLayoutGallery() { var layout = new VerticalStackLayout(); for (int n = 0; n < 10; n++) { layout.Add(new Label { Text = $"Label {n} in a vertical stack" }); } Content = layout; }
public void IgnoreArrangeWithoutMeasure() { var layout = new VerticalStackLayout(); var view = Substitute.For <IView>(); view.IsMeasureValid.Returns(true); layout.Add(view); (layout as IFrameworkElement).Arrange(new Rectangle(0, 0, 100, 100)); view.DidNotReceive().Arrange(Arg.Any <Rectangle>()); }
public void ArrangeAfterMeasure() { var layout = new VerticalStackLayout(); var view = Substitute.For <IView>(); view.IsMeasureValid.Returns(true); layout.Add(view); var size = (layout as IFrameworkElement).Measure(100, 100); (layout as IFrameworkElement).Arrange(new Rectangle(0, 0, size.Width, size.Height)); view.Received().Arrange(Arg.Any <Rectangle>()); }
public async Task RemovingFirstItemOfListViewDoesntCrash() { SetupBuilder(); ObservableCollection <string> data = new ObservableCollection <string>() { "cat", "dog", "catdog" }; var listView = new ListView() { ItemTemplate = new DataTemplate(() => { return(new ViewCell() { View = new VerticalStackLayout() { new Label() } }); }), ItemsSource = data }; var layout = new VerticalStackLayout() { listView }; await CreateHandlerAndAddToWindow <LayoutHandler>(layout, async (handler) => { await Task.Delay(100); ValidatePlatformCells(listView); data.RemoveAt(0); await Task.Delay(100); ValidatePlatformCells(listView); data.Insert(1, "new"); data.Insert(2, "record"); await Task.Delay(100); ValidatePlatformCells(listView); data.RemoveAt(0); await Task.Delay(100); ValidatePlatformCells(listView); }); }
public async Task FlyoutHeaderCollapsesOnScroll() { await RunShellTest(shell => { Enumerable.Range(0, 100) .ForEach(i => { shell.FlyoutHeaderBehavior = FlyoutHeaderBehavior.CollapseOnScroll; shell.Items.Add(new FlyoutItem() { Title = $"FlyoutItem {i}", Items = { new ContentPage() } }); }); var layout = new VerticalStackLayout() { new Label() { Text = "Header Content" } }; layout.HeightRequest = 250; shell.FlyoutHeader = new ScrollView() { MinimumHeightRequest = 100, Content = layout }; }, async (shell, handler) => { await OpenFlyout(handler); await Task.Delay(10); var initialBox = (shell.FlyoutHeader as IView).GetBoundingBox(); AssertionExtensions.CloseEnough(250, initialBox.Height, 0.3); await ScrollFlyoutToBottom(handler); var scrolledBox = (shell.FlyoutHeader as IView).GetBoundingBox(); AssertionExtensions.CloseEnough(100, scrolledBox.Height, 0.3); }); }
public void ClearUpdatesParent() { var layout = new VerticalStackLayout(); var child0 = new Button(); var child1 = new Button(); layout.Add(child0); layout.Add(child1); Assert.AreEqual(layout, child0.Parent); Assert.AreEqual(layout, child1.Parent); layout.Clear(); Assert.Null(child0.Parent); Assert.Null(child1.Parent); }
public async Task FlyoutHeaderRendersCorrectSizeWithFlyoutContentSet() { SetupBuilder(); VerticalStackLayout header = new VerticalStackLayout() { new Label() { Text = "Flyout Header" } }; var shell = await CreateShellAsync(shell => { shell.CurrentItem = new FlyoutItem() { Items = { new ContentPage() }, Title = "Flyout Item" }; shell.FlyoutHeader = header; shell.FlyoutContent = new VerticalStackLayout() { new Label() { Text = "Flyout Content" } }; shell.FlyoutFooter = new VerticalStackLayout() { new Label() { Text = "Flyout Footer" } }; }); await CreateHandlerAndAddToWindow <ShellRenderer>(shell, async (handler) => { await Task.Delay(100); var headerPlatformView = header.ToPlatform(); var appBar = headerPlatformView.GetParentOfType <AppBarLayout>(); Assert.Equal(appBar.MeasuredHeight, headerPlatformView.MeasuredHeight); }); }
public void BasicContentPage() { var page = new ContentPage() { IsPlatformEnabled = true }; var layout = new VerticalStackLayout() { IsPlatformEnabled = true }; var button = new Button() { IsPlatformEnabled = true }; var expectedSize = new Size(100, 100); var view = Substitute.For <IViewHandler>(); view.GetDesiredSize(default, default).ReturnsForAnyArgs(expectedSize);
public async Task LoadedAndUnloadedFireWhenParentRemoved() { var editor = new Editor(); var layout = new VerticalStackLayout() { editor }; var parentLayout = new VerticalStackLayout() { layout }; int unloaded = 0; int loaded = 0; editor.Loaded += (_, __) => loaded++; editor.Unloaded += (_, __) => unloaded++; var window = new Window() { Page = new ContentPage() { Content = parentLayout } }; parentLayout.Remove(layout); Assert.AreEqual(1, loaded); Assert.AreEqual(1, unloaded); parentLayout.Add(layout); Assert.AreEqual(2, loaded); Assert.AreEqual(1, unloaded); window.Page = null; Assert.AreEqual(2, loaded); Assert.AreEqual(2, unloaded); }
public void UsingIndexUpdatesParent() { var layout = new VerticalStackLayout(); var child0 = new Button(); var child1 = new Button(); Assert.Null(child0.Parent); Assert.Null(child1.Parent); layout.Add(child0); Assert.AreEqual(layout, child0.Parent); Assert.Null(child1.Parent); layout[0] = child1; Assert.Null(child0.Parent); Assert.AreEqual(layout, child1.Parent); }
public async Task LoadedAndUnloadedFireWhenParentRemoved() { var editor = new Editor(); var layout = new VerticalStackLayout() { editor }; var parentLayout = new VerticalStackLayout() { layout }; int unloaded = 0; int loaded = 0; editor.Loaded += (_, __) => loaded++; editor.Unloaded += (_, __) => unloaded++; await CreateHandlerAndAddToWindow <LayoutHandler>(parentLayout, async (handler) => { parentLayout.Remove(layout); await OnUnloadedAsync(layout); await OnUnloadedAsync(editor); Assert.Equal(1, loaded); Assert.Equal(1, unloaded); parentLayout.Add(layout); await OnLoadedAsync(layout); await OnLoadedAsync(editor); Assert.Equal(2, loaded); Assert.Equal(1, unloaded); }); await Task.Delay(1000); Assert.Equal(2, loaded); Assert.Equal(2, unloaded); }
public async Task FlyoutContentSetsCorrectBottomPaddingWhenMinHeightIsSetForFlyoutHeader() { await RunShellTest(shell => { var layout = new VerticalStackLayout() { new Label() { Text = "Flyout Header" } }; layout.MinimumHeightRequest = 30; shell.FlyoutHeader = layout; shell.FlyoutFooter = new Label() { Text = "Flyout Footer" }; shell.FlyoutContent = new VerticalStackLayout() { new Label() { Text = "Flyout Content" } }; shell.FlyoutHeaderBehavior = FlyoutHeaderBehavior.CollapseOnScroll; }, async (shell, handler) => { await OpenFlyout(handler); var headerFrame = GetFrameRelativeToFlyout(handler, (IView)shell.FlyoutHeader); var contentFrame = GetFrameRelativeToFlyout(handler, (IView)shell.FlyoutContent); var footerFrame = GetFrameRelativeToFlyout(handler, (IView)shell.FlyoutFooter); // validate footer position AssertionExtensions.CloseEnough(footerFrame.Y, headerFrame.Height + contentFrame.Height); }); }
public async Task TitleAndTitleViewAreMutuallyExclusive() { var window = new TestWindow(); IToolbarElement toolbarElement = window; var contentPage = new ContentPage() { Title = "Test Title" }; var navigationPage = new NavigationPage(contentPage); window.Page = navigationPage; var titleView = new VerticalStackLayout(); var toolbar = (Toolbar)toolbarElement.Toolbar; Assert.AreEqual("Test Title", toolbar.Title); NavigationPage.SetTitleView(contentPage, titleView); Assert.IsEmpty(toolbar.Title); Assert.AreEqual(titleView, toolbar.TitleView); NavigationPage.SetTitleView(contentPage, null); Assert.AreEqual("Test Title", toolbar.Title); }
public async Task TitleAndTitleViewAreMutuallyExclusive() { var contentPage = new ContentPage() { Title = "Test Title" }; var titleView = new VerticalStackLayout(); TestShell testShell = new TestShell(contentPage); var window = new Window() { Page = testShell }; var toolbar = testShell.Toolbar; Assert.AreEqual("Test Title", toolbar.Title); Shell.SetTitleView(contentPage, titleView); Assert.IsEmpty(toolbar.Title); Assert.AreEqual(titleView, toolbar.TitleView); Shell.SetTitleView(contentPage, null); Assert.AreEqual("Test Title", toolbar.Title); }
public async Task FlyoutHeaderMinimumHeight(FlyoutHeaderBehavior behavior) { await RunShellTest(shell => { var layout = new VerticalStackLayout() { new Label() { Text = "Flyout Header" } }; shell.FlyoutHeader = layout; shell.FlyoutHeaderBehavior = behavior; }, async (shell, handler) => { await OpenFlyout(handler); var flyoutFrame = GetFrameRelativeToFlyout(handler, shell.FlyoutHeader as IView); if (behavior == FlyoutHeaderBehavior.CollapseOnScroll) { // 56 was pulled from the ActionBar height on Android // and then just used across all three platforms for // the min height when using collapse on scroll AssertionExtensions.CloseEnough(56, flyoutFrame.Height); } else { AssertionExtensions.AssertWithMessage(() => Assert.True(flyoutFrame.Height < 56), $"Expected < 56 Actual: {flyoutFrame.Height}" ); } }); }
public async Task AutoSizeInitializesCorrectly(EditorAutoSizeOption option) { var editor = new Editor { AutoSize = option, Text = "Test" }; IView layout = new VerticalStackLayout() { Children = { editor } }; await CreateHandlerAndAddToWindow <LayoutHandler>(layout, (_) => { layout.Arrange(new Graphics.Rect(Graphics.Point.Zero, layout.Measure(1000, 1000))); var initialHeight = editor.Height; editor.Text += Environment.NewLine + " Some new text" + Environment.NewLine; layout.Arrange(new Graphics.Rect(Graphics.Point.Zero, layout.Measure(1000, 1000))); if (option == EditorAutoSizeOption.Disabled) { Assert.Equal(initialHeight, editor.Height); } else { Assert.True(initialHeight < editor.Height); } return(Task.CompletedTask); }); }
public async Task AutoSizeInitializesCorrectly(EditorAutoSizeOption option) { var editor = new Editor { AutoSize = option, Text = "Test" }; IView layout = new VerticalStackLayout() { Children = { editor } }; await InvokeOnMainThreadAsync(() => { _ = CreateHandler <LayoutHandler>(layout); layout.Arrange(new Graphics.Rectangle(Graphics.Point.Zero, layout.Measure(1000, 1000))); var initialHeight = editor.Height; editor.Text += Environment.NewLine + " Some new text" + Environment.NewLine; layout.Arrange(new Graphics.Rectangle(Graphics.Point.Zero, layout.Measure(1000, 1000))); if (option == EditorAutoSizeOption.Disabled) { Assert.Equal(initialHeight, editor.Height); } else { Assert.True(initialHeight < editor.Height); } }); }
void SetupMauiLayout() { const string loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Quisque ut dolor metus. Duis vel iaculis mauris, sit amet finibus mi. " + "Etiam congue ornare risus, in facilisis libero tempor eget. " + "Phasellus mattis mollis libero ut semper. In sit amet sapien odio. " + "Sed interdum ullamcorper dui eu rutrum. Vestibulum non sagittis justo. " + "Cras rutrum scelerisque elit, et porta est lobortis ac. " + "Pellentesque eu ornare tortor. Sed bibendum a nisl at laoreet."; var verticalStack = new VerticalStackLayout() { Spacing = 5, BackgroundColor = Color.AntiqueWhite }; var horizontalStack = new HorizontalStackLayout() { Spacing = 2, BackgroundColor = Color.CornflowerBlue }; verticalStack.Add(CreateSampleGrid()); verticalStack.Add(new Label { Text = " ", Padding = new Thickness(10) }); var label = new Label { Text = "End-aligned text", BackgroundColor = Color.Fuchsia, HorizontalTextAlignment = TextAlignment.End }; label.Margin = new Thickness(15, 10, 20, 15); verticalStack.Add(label); verticalStack.Add(new Label { Text = "This should be BIG text!", FontSize = 24, HorizontalOptions = LayoutOptions.End }); verticalStack.Add(new Label { Text = "This should be BOLD text!", FontAttributes = FontAttributes.Bold, HorizontalOptions = LayoutOptions.Center }); verticalStack.Add(new Label { Text = "This should be a CUSTOM font!", FontFamily = "Dokdo" }); verticalStack.Add(new Label { Text = "This should have padding", Padding = new Thickness(40), BackgroundColor = Color.LightBlue }); verticalStack.Add(new Label { Text = loremIpsum }); verticalStack.Add(new Label { Text = loremIpsum, MaxLines = 2 }); verticalStack.Add(new Label { Text = loremIpsum, LineBreakMode = LineBreakMode.TailTruncation }); verticalStack.Add(new Label { Text = loremIpsum, MaxLines = 2, LineBreakMode = LineBreakMode.TailTruncation }); verticalStack.Add(new Label { Text = "This should have five times the line height!", LineHeight = 5 }); var visibleClearButtonEntry = new Entry() { ClearButtonVisibility = ClearButtonVisibility.WhileEditing, Placeholder = "This Entry will show clear button if has input." }; var hiddenClearButtonEntry = new Entry() { ClearButtonVisibility = ClearButtonVisibility.Never, Placeholder = "This Entry will not..." }; verticalStack.Add(visibleClearButtonEntry); verticalStack.Add(hiddenClearButtonEntry); verticalStack.Add(new Editor { Placeholder = "This is an editor placeholder." }); var paddingButton = new Button { Padding = new Thickness(40), Text = "This button has a padding!!", BackgroundColor = Color.Purple, }; verticalStack.Add(paddingButton); var underlineLabel = new Label { Text = "underline", TextDecorations = TextDecorations.Underline }; verticalStack.Add(underlineLabel); verticalStack.Add(new ActivityIndicator()); verticalStack.Add(new ActivityIndicator { Color = Color.Red, IsRunning = true }); var button = new Button() { Text = _viewModel.Text, WidthRequest = 200 }; var button2 = new Button() { TextColor = Color.Green, Text = "Hello I'm a button", BackgroundColor = Color.Purple, Margin = new Thickness(12) }; horizontalStack.Add(button); horizontalStack.Add(button2); horizontalStack.Add(new Label { Text = "And these buttons are in a HorizontalStackLayout", VerticalOptions = LayoutOptions.Center }); verticalStack.Add(horizontalStack); verticalStack.Add(new CheckBox()); verticalStack.Add(new CheckBox { BackgroundColor = Color.LightPink }); verticalStack.Add(new CheckBox { IsChecked = true, Color = Color.Aquamarine }); verticalStack.Add(new DatePicker()); verticalStack.Add(new Editor()); verticalStack.Add(new Editor { Text = "Editor" }); verticalStack.Add(new Editor { Text = "Lorem ipsum dolor sit amet", MaxLength = 10 }); verticalStack.Add(new Editor { Text = "Predictive Text Off", IsTextPredictionEnabled = false }); verticalStack.Add(new Editor { Text = "Lorem ipsum dolor sit amet", FontSize = 10, FontFamily = "dokdo_regular" }); verticalStack.Add(new Editor { Text = "ReadOnly Editor", IsReadOnly = true }); var entry = new Entry(); entry.TextChanged += (sender, e) => { Debug.WriteLine($"Text Changed from '{e.OldTextValue}' to '{e.NewTextValue}'"); }; verticalStack.Add(entry); verticalStack.Add(new Entry { Text = "Entry", TextColor = Color.DarkRed, FontFamily = "Dokdo" }); verticalStack.Add(new Entry { IsPassword = true, TextColor = Color.Black }); verticalStack.Add(new Entry { IsTextPredictionEnabled = false }); verticalStack.Add(new Entry { Placeholder = "This should be placeholder text" }); verticalStack.Add(new Entry { Text = "This should be read only property", IsReadOnly = true }); verticalStack.Add(new Entry { MaxLength = 5, Placeholder = "MaxLength text" }); verticalStack.Add(new Entry { Text = "This should be text with character spacing", CharacterSpacing = 10 }); verticalStack.Add(new ProgressBar { Progress = 0.5 }); verticalStack.Add(new ProgressBar { Progress = 0.5, BackgroundColor = Color.LightCoral }); verticalStack.Add(new ProgressBar { Progress = 0.5, ProgressColor = Color.Purple }); var searchBar = new SearchBar(); searchBar.CharacterSpacing = 4; searchBar.Text = "A search query"; verticalStack.Add(searchBar); var placeholderSearchBar = new SearchBar(); placeholderSearchBar.Placeholder = "Placeholder"; verticalStack.Add(placeholderSearchBar); var monkeyList = new List <string> { "Baboon", "Capuchin Monkey", "Blue Monkey", "Squirrel Monkey", "Golden Lion Tamarin", "Howler Monkey", "Japanese Macaque" }; var picker = new Picker { Title = "Select a monkey" }; picker.ItemsSource = monkeyList; verticalStack.Add(picker); verticalStack.Add(new Slider()); verticalStack.Add(new Stepper()); verticalStack.Add(new Stepper { BackgroundColor = Color.IndianRed }); verticalStack.Add(new Stepper { Minimum = 0, Maximum = 10, Value = 5 }); verticalStack.Add(new Switch()); verticalStack.Add(new Switch() { OnColor = Color.Green }); verticalStack.Add(new Switch() { ThumbColor = Color.Yellow }); verticalStack.Add(new Switch() { OnColor = Color.Green, ThumbColor = Color.Yellow }); verticalStack.Add(new DatePicker()); verticalStack.Add(new TimePicker()); verticalStack.Add(new TimePicker { Time = TimeSpan.FromHours(8), CharacterSpacing = 6 }); verticalStack.Add(new Image() { Source = "dotnet_bot.png" }); Content = new ScrollView { Content = verticalStack }; }