1
votes

Existe-t-il un moyen de créer une fenêtre contextuelle dans des formulaires Xamarin (modèle logiciel - mvvm), sans utiliser de plugins?

J'essaie de générer un pop-up pour rappeler à l'utilisateur de soumettre ou de faire une autre fonctionnalité. Est-ce que quelqu'un a une idée? Merci,


0 commentaires

3 Réponses :


0
votes

Xamarin.Forms vous permet d'afficher des alertes (message simple avec bouton ok), des feuilles d'action (choisir entre différentes options) et des invites (pour la saisie de texte). Voici la documentation .

Si vous souhaitez créer et afficher votre propre vue avec un modèle de vue associé, vous devrez utiliser une bibliothèque tierce. Rg.Plugins.Popup semble être le choix le plus populaire à mon avis.


0 commentaires

0
votes

Pour mes applications, j'utilise la classe App.xaml.cs , voici un exemple que j'utilise pour afficher un ContentView au-dessus d'un ContentPage strong> si le contenu direct de la ContentPage est un AbsoluteLayout: convenient

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="CALogin.Views.LoginPage"
             xmlns:vm="clr-namespace:CALogin.ViewModels">
    <ContentPage.BindingContext>
        <vm:LoginViewModel/>
    </ContentPage.BindingContext>
    <ContentPage.Content>
        <AbsoluteLayout x:Name="MasterLayout" VerticalOptions="FillAndExpand"
                    HorizontalOptions="FillAndExpand" Padding="0">
            <Grid x:Name="MasterGrid" BackgroundColor="Gray">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <!-- Place all of your normal page content here, inside this "MasterGrid" -->
                <!-- When you call ShowPopup(), WaitPopup will be added as the 2nd child of the AbsoluteLayout -->
                <!-- WaitPopup will fill and expand the entire screen, overlapping MasterGrid -->
            </Grid>
        </AbsoluteLayout>
    </ContentPage.Content>
</ContentPage>

WaitPopUp.cs , j'aime créer le Popup en utilisant c #, mais vous pouvez créer un nouveau fichier .xaml et le montrer à la place si vous le souhaitez.

public class WaitPopup : ContentView
    {
        public WaitPopup()
        {
            /* We assume we are adding this to an AbsoluteLayout */
            AbsoluteLayout.SetLayoutBounds(this, new Rectangle(0, 0, 1, 1));
            AbsoluteLayout.SetLayoutFlags(this, AbsoluteLayoutFlags.All);
            /*I add opacity so that it looks more like a popup,change background to Transparent if you want this to look more like a true pop up */
            BackgroundColor = Color.White;
            Opacity = 0.77;
            /* All of this content is optional, apply whatever you wish to your PopUp */
            Content = new StackLayout
            {
                /* */
                VerticalOptions = LayoutOptions.Center,
                HorizontalOptions = LayoutOptions.Center,
                /* */
                Children = {
                    /* */
                    new Image {
                        Source = "logo.png",
                        Aspect = Aspect.AspectFill,
                        Margin = new Thickness(100,30,100,20)
                    },
                    /* */
                    new Label {
                        Text = "Espera...",
                        TextColor = Color.Black,
                        HorizontalOptions = LayoutOptions.Center,
                        VerticalOptions = LayoutOptions.Center,
                        VerticalTextAlignment = TextAlignment.Center
                    },
                }
            };
            //Optional, do not use if you do not understand animations
            RotateLogo();
        }
        private void RotateLogo()
        {
            //uint duration = 10 * 60 * 1000;
            var sLayout = this.Content as StackLayout;
            var logo = sLayout.Children[0] as Image;
            logo.RotateYTo(4 * 360, 10000);
        }
    }

Exemple de fichier .xaml qui fonctionnera avec WaitPopup, rappelez-vous, techniquement, vous pouvez rendre cette fenêtre compatible avec n'importe quelle mise en page, mais pour cet exemple, nous supposons que chaque La page a un AbsoluteLayout comme contenu, et que lorsque nous ajoutons WaitPopUp.cs, c'est le deuxième enfant du tableau Children d'AbsoluteLayout:

        public static void ShowPopup()
        {
            //Get current Page, we assume it's a ContentPage
            var mainPage = App.Current.MainPage as ContentPage;
            //Get the content of that Page, we assume it's an AbsoluteLayout
            var current = mainPage.Content as AbsoluteLayout;
            //Add WaitPopup.cs as a child
            current.Children.Add(new WaitPopup());
            //Re-load the view
            mainPage.Content = current;
        }

        public static void RemovePopup()
        {
            //Get current Page, we assume it's a ContentPage
            var mainPage = Current.MainPage as ContentPage;
            //Get the content of that Page, we assume it's an AbsoluteLayout
            var current = mainPage.Content as AbsoluteLayout;
            //Remove the child from the AbsoluteLayout, in this example it will be WaitPopup
            current.Children.RemoveAt(1);
            //Re-load the view
            mainPage.Content = current;
        }

Si vous voulez ajouter un ViewModel, vous pouvez le faire sans problème avec BindingContext dans WaitPopup.CS

Cheers!


0 commentaires

0
votes

Selon votre description, vous souhaitez créer un popup sans utiliser de plugins, j'utilise Collectionview pour créer un popup personnalisé, et définissez isvisible comme faux par défaut, vous pouvez jeter un œil:

MainPage.xaml:

< pre> XXX

Voici la capture d'écran:

entrez la description de l'image ici

Vous pouvez utiliser Collectionview pour créer différents popup dans page de contenu différente.


3 commentaires

J'aime cela lorsque cela est possible, bien que cette fenêtre contextuelle ne puisse être affichée que dans la même page qu'elle existe.


@LISA, quelque chose à jour? Si ma réponse vous aide, n'oubliez pas de marquer ma réponse comme réponse, merci.


@ CherryBu-MSFT Voulez-vous dire ContentView ou CollectionView?