private async void User_OnMessageStatusReceivedCallback(Message message)
 {
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         if (message.StatusType == StatusType.Connected)
         {
             ChatField.Items.Add(new StatusMessage(message.Name, "Connected"));
         }
         else if (message.StatusType == StatusType.Disconnected)
         {
             ChatField.Items.Add(new StatusMessage(message.Name, "Disconnected"));
         }
         if (message.StatusType == StatusType.Disconnecting)
         {
             user.Close();
             client.Close();
             user = null;
             client.Dispose();
             connected = false;
             Frame.Navigate(typeof(MainPage));
         }
         else if (message.StatusType == StatusType.ErrorDisconnect)
         {
             user.Close();
             client.Close();
             user = null;
             client.Dispose();
             connected = false;
             Frame.Navigate(typeof(MainPage));
         }
     });
 }
        public ChatUI()
        {
            this.InitializeComponent();
            this.NavigationCacheMode = NavigationCacheMode.Enabled;

            Color = NColor.GenerateRandomColor();

            Window.Current.Closed += (s, e) =>
            {
                if (user != null)
                {
                    user.CreateStatus(StatusType.Disconnecting);
                }
            };

            Loaded += async(s, e) =>
            {
                if (!connected)
                {
                    client = new TcpClient();
                    await client.ConnectAsync(Address, Port);

                    NetworkStream stream   = client.GetStream();
                    Message       secure   = MessageHelpers.GetMessage(stream);
                    string        password = "";
                    if (secure.Name == "locked")
                    {
                        PasswordDialog pd = new PasswordDialog();
                        if (await pd.ShowAsync() == ContentDialogResult.Primary)
                        {
                            password = pd.Password;
                        }
                        else
                        {
                            if (Frame.CanGoBack)
                            {
                                Frame.GoBack();
                            }
                        }
                    }

                    if (secure.Content != "")
                    {
                        SslStream ssl = new SslStream(stream);
                        ssl.AuthenticateAsClient(secure.Content);
                        user = new User(Username, ssl);
                        user.Init(password);
                    }
                    else
                    {
                        user = new User(Username, stream);
                        user.Init(password);
                    }

                    user.OnMessageReceivedCallback             += User_OnMessageReceivedCallback;
                    user.OnMessageStatusReceivedCallback       += User_OnMessageStatusReceivedCallback;
                    user.OnMessageTransferReceivedCallback     += User_OnMessageTransferReceivedCallback;
                    user.OnMessageWhisperReceivedCallback      += User_OnMessageWhisperReceivedCallback;
                    user.OnMessageInitReceivedCallback         += User_OnMessageInitReceivedCallback;
                    user.OnMesssageInformationReceivedCallback += User_OnMesssageInformationReceivedCallback;
                    user.OnErrorCallback += (d) => { Debug.WriteLine(d.Message); };
                    connected             = true;
                }
            };
        }