类在MainPage.xaml.cs上实例化2次

时间:2019-05-23 08:27:42

标签: c# xaml uwp

我有一个问题。我在UWP应用程序中工作,我不知道如何在mainpage.xaml.cs上使用另一个类(外部类_ViewModel)。 _vienmodel类已经在代码的开头实例化(来自App.xaml.cs类)。

在我做的过程中,我来到了_viewmodel类的构造函数3次:S

因此,当我进入MainPage.xmal.cs类时,变量bras.Com.IsConnectionOk的值为false。但实际上,我的变量处于真实状态。

类主页:

namespace IHM_UWP
{
    /// <summary>
    /// Une page vide peut être utilisée seule ou constituer une page de destination au sein d'un frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public bool open = false;
        public bool close = false;
        /*public bool upAct = false;
        public bool downAct = false;
        public bool leftAct = false;
        public bool rightAct = false;*/

        private _ViewModel view = new _ViewModel(); // cette classe n'est pas bien implementé 
        private Brush colorButton = new SolidColorBrush();

        public MainPage()
        {
            this.InitializeComponent();
            colorButton = Up.Background;

        }

        private void KeyDown_detect(object sender, KeyRoutedEventArgs e)
        {

            // si la connexion est établie alors on peut envoyer les trames pour les touches de direction
            if (view.Bras.Com.IsConnectionOk == true)
            {
                if (e.Key == Windows.System.VirtualKey.Up)
                {
                    // Effet visuel pour indiquer que l'on a cliqué sur la touche UP 
                    Up.Background = new SolidColorBrush(Windows.UI.Colors.Green);
                    Down.Background = colorButton;
                    Left.Background = colorButton;
                    Right.Background = colorButton;
                    view.Bras.MoveArmUp();
                }
                if(e.Key == Windows.System.VirtualKey.Down)
                {
                    // Effet visuel pour indiquer que l'on a cliqué sur la touche DOWN
                    Down.Background = new SolidColorBrush(Windows.UI.Colors.Green);
                    Up.Background = colorButton;
                    Left.Background = colorButton;
                    Right.Background = colorButton;
                    view.Bras.MoveArmDown();
                }
                if (e.Key == Windows.System.VirtualKey.Right)
                {
                    // Effet visuel pour indiquer que l'on a cliqué sur la touche DOWN
                    Right.Background = new SolidColorBrush(Windows.UI.Colors.Green);
                    Up.Background = colorButton;
                    Left.Background = colorButton;
                    Down.Background = colorButton;
                    view.Bras.MoveArmRight();
                }
                if (e.Key == Windows.System.VirtualKey.Left)
                {
                    // Effet visuel pour indiquer que l'on a cliqué sur la touche DOWN
                    Left.Background = new SolidColorBrush(Windows.UI.Colors.Green);
                    Up.Background = colorButton;
                    Down.Background = colorButton;
                    Right.Background = colorButton;
                    view.Bras.MoveArmLeft();

                }
            }
        }
    }
}

Class _ViewModel.cs:

namespace IHM_UWP
{
    public class _ViewModel : INotifyPropertyChanged
    {
        private GestionBras bras= new GestionBras(); //On peut ajouter cet instance dans la classe App.Xaml.cs?

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged([CallerMemberName] string str = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(str));
            }
        }

        public _ViewModel()
        {

        }

        /// <summary>
        /// Commande pour lancer la connexion au bras
        /// </summary>
        private ICommand connect;


        public ICommand Connect
        {
            get
            {
                if (this.connect == null)
                    this.connect = new RelayCommand(() => this.Bras.ConnectAsync());
                return this.connect;
            }
        }


        /// <summary>
        /// Commande pour ouvrir la pince
        /// </summary>
        private ICommand ouvrirPince;


        public ICommand OuvrirPince
        {
            get
            {
                if (this.ouvrirPince == null)
                    this.ouvrirPince = new RelayCommand(() => this.Bras.OuvrirPince());
                return this.ouvrirPince;
            }
        }

        /// <summary>
        /// Commande pour fermer la pince
        /// </summary>
        private ICommand fermerPince;


        public ICommand FermerPince
        {
            get
            {
                if (this.fermerPince == null)
                    this.fermerPince = new RelayCommand(() => this.Bras.FermerPince());
                return this.fermerPince;
            }
        }

        // Class intermedaire pour la gestion de binding 
        public GestionBras Bras { get => bras; set => bras = value; }


    }
}

EnvCoord.xaml.cs类:


namespace IHM_UWP
{
    /// <summary>
    /// Une page vide peut être utilisée seule ou constituer une page de destination au sein d'un frame.
    /// </summary>
    public sealed partial class EnvCoord : Page
    {
        string xcoord = string.Empty;
        string ycoord = string.Empty;
        string zcoord = string.Empty;

        private _ViewModel view = new _ViewModel();

        public EnvCoord()
        {
            this.InitializeComponent();
        }

        private void CloseWindow(object sender, RoutedEventArgs e)
        {
            Frame.Navigate(typeof(MainPage));
        }

        private void EnvoyerCoord_Click(object sender, RoutedEventArgs e)
        {
            xcoord = CoordX.Text;
            ycoord = CoordY.Text;
            zcoord = CoordZ.Text;

            view.Bras.SendCoorGeom(xcoord, ycoord, zcoord);

            Frame.Navigate(typeof(MainPage));

        }

    }
}

App.xaml.cs类:

namespace IHM_UWP
{
    /// <summary>
    /// Fournit un comportement spécifique à l'application afin de compléter la classe Application par défaut.
    /// </summary>
    sealed partial class App : Application
    {
        public IHM_UWP._ViewModel view = new IHM_UWP._ViewModel();

        /// <summary>
        /// Initialise l'objet d'application de singleton.  Il s'agit de la première ligne du code créé
        /// à être exécutée. Elle correspond donc à l'équivalent logique de main() ou WinMain().
        /// </summary>
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

        /// <summary>
        /// Invoqué lorsque l'application est lancée normalement par l'utilisateur final.  D'autres points d'entrée
        /// seront utilisés par exemple au moment du lancement de l'application pour l'ouverture d'un fichier spécifique.
        /// </summary>
        /// <param name="e">Détails concernant la requête et le processus de lancement.</param>
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            // Ne répétez pas l'initialisation de l'application lorsque la fenêtre comporte déjà du contenu,
            // assurez-vous juste que la fenêtre est active
            if (rootFrame == null)
            {
                // Créez un Frame utilisable comme contexte de navigation et naviguez jusqu'à la première page
                rootFrame = new Frame();

                rootFrame.NavigationFailed += OnNavigationFailed;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: chargez l'état de l'application précédemment suspendue
                }

                // Placez le frame dans la fenêtre active
                Window.Current.Content = rootFrame;
            }

            if (e.PrelaunchActivated == false)
            {
                if (rootFrame.Content == null)
                {
                    // Quand la pile de navigation n'est pas restaurée, accédez à la première page,
                    // puis configurez la nouvelle page en transmettant les informations requises en tant que
                    // paramètre
                    rootFrame.Navigate(typeof(MainPage), e.Arguments);
                }
                // Vérifiez que la fenêtre actuelle est active
                Window.Current.Activate();
            }
        }

        /// <summary>
        /// Appelé lorsque la navigation vers une page donnée échoue
        /// </summary>
        /// <param name="sender">Frame à l'origine de l'échec de navigation.</param>
        /// <param name="e">Détails relatifs à l'échec de navigation</param>
        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
        }

        /// <summary>
        /// Appelé lorsque l'exécution de l'application est suspendue.  L'état de l'application est enregistré
        /// sans savoir si l'application pourra se fermer ou reprendre sans endommager
        /// le contenu de la mémoire.
        /// </summary>
        /// <param name="sender">Source de la requête de suspension.</param>
        /// <param name="e">Détails de la requête de suspension.</param>
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            // Remettre tous les moteurs à leur position initial
            for (int i = 0; i < view.Bras.Moteur.Length; i++)
            {
                view.Bras.InitialPosition(view.Bras.Moteur[i].Num_pin);
            }

            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: enregistrez l'état de l'application et arrêtez toute activité en arrière-plan

            deferral.Complete();
        }
    }
}

如何从我的App.xaml.cs恢复_ViewModel类(具有所有更新的变量值)?我需要在Envcoord.xaml.cs和mainpage.xaml.cs上使用_viewmodel

预先感谢:)

1 个答案:

答案 0 :(得分:0)

您应该使用已经在MainPage中创建的实例,而不是在EnvCoordApp.xaml.cs中创建新实例。您可以使用App.Current属性访问它:

public sealed partial class EnvCoord : Page
{
    string xcoord = string.Empty;
    string ycoord = string.Empty;
    string zcoord = string.Empty;

    private readonly _ViewModel view;

    public EnvCoord()
    {
        this.InitializeComponent();
        view = (App.Current as App).view;
        DataContext = view;
    }

    private void CloseWindow(object sender, RoutedEventArgs e)
    {
        Frame.Navigate(typeof(MainPage));
    }

    private void EnvoyerCoord_Click(object sender, RoutedEventArgs e)
    {
        xcoord = CoordX.Text;
        ycoord = CoordY.Text;
        zcoord = CoordZ.Text;

        view.Bras.SendCoorGeom(xcoord, ycoord, zcoord);

        Frame.Navigate(typeof(MainPage));

    }
}