Comunicacion entre ventanas en proyecto WPF

Moderador: raul338

C#, tambien llamado C Sharp

Comunicacion entre ventanas en proyecto WPF

Notapor rbpkirow » Mié Sep 07, 2011 2:15 am

Hola.
Estoy haciendo un pequeño proyecto casero para aprender a manejar C# y WPF. Para ello tengo una aplicacion con varias ventanas. Para simplificar la pregunta pongamos 2 ventanas: Mainwindow y PuertoSerie

La ventana Mainwindow es la que se ejecuta nada mas iniciar la aplicacion y tiene varios controles. como botones, checkbox y combobox.
Un comboBox lo utilizo para mostrar los puertos series que tiene el PC y mediante el boton, abro el puerto.
Hasta aqui todo bien y funciona correctamente.
Mediante un checkbox abro/cierro la segunda ventana, que simplemente tiene un control de texto para escribir todo lo que recibo a traves del puerto serie.

Para ello, tengo una variable puerto de tipo SerialPort con un evento:
puerto.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

En esta funcion es donde intento escribir el texto que recibo por el puerto serie al textBox de la segunda ventana, pero me devuelve una excepcion:
Código: Seleccionar todo
  1.  

  2. Excepción no controlada del tipo 'System.InvalidOperationException' en WindowsBase.dll

  3.  

  4. Información adicional: El subproceso que realiza la llamada no puede obtener acceso a este objeto porque el propietario es otro subproceso.

  5.  



Alguien me podria decir como hacerlo correctamente?

Pongo el codigo para que podais comprobar como lo estoy haciendo:

PuertoSerie.xaml.cs
Código: Seleccionar todo
  1.  

  2. namespace MyProyecto

  3. {

  4.     /// <summary>

  5.     /// Lógica de interacción para Window1.xaml

  6.     /// </summary>

  7.     public partial class PuertoSerieDlg : Window

  8.     {

  9.         public PuertoSerieDlg()

  10.         {

  11.             InitializeComponent();

  12.         }

  13.  

  14.         public void ActualizarTexto(string Texto)

  15.         {

  16.             SerialPortDlgText.AppendText(Texto);

  17.         }

  18.     }

  19. }

  20.  



MainWindow.xaml.xs
Código: Seleccionar todo
  1.  

  2. namespace MyProyecto

  3. {

  4.     /// <summary>

  5.     /// Lógica de interacción para MainWindow.xaml

  6.     /// </summary>

  7.     public partial class MainWindow : Window

  8.     {

  9.         PuertoSerieDlg myPuertoSerie = new PuertoSerieDlg();

  10.         SerialPort puerto = new SerialPort();

  11.            

  12.        

  13.         public MainWindow()

  14.         {

  15.             InitializeComponent();

  16.             AddSerialPorts();

  17.             InitWindows();

  18.         }

  19.  

  20.  

  21.         private void InitWindows()

  22.         {

  23.                         // Localizacion de la ventana principal

  24.             MainGrid.Width = VentanaPrincipal.Width;

  25.             VentanaPrincipal.Left = 0;

  26.             VentanaPrincipal.Top = 0;

  27.         }

  28.  

  29.         private void AddSerialPorts()

  30.         {

  31.                         // Se insertan los puertos serie en el combobox

  32.             string[] strNamePorts = SerialPort.GetPortNames();

  33.             for(int i = 0; i<strNamePorts.Length; i++)

  34.                 ComboSelCOM.Items.Add(strNamePorts[i]);

  35.         }

  36.  

  37.  

  38.         // *******************************

  39.         // Combo

  40.         // *******************************

  41.         private void ComboSelCOM_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)

  42.         {

  43.                         // Al seleccionar un puerto COM, se activa el boton conectar

  44.             object puertoSeleccionado = ComboSelCOM.SelectedItem;

  45.             if (puertoSeleccionado != null)

  46.             {

  47.                 ConnectCOMButton.IsEnabled = true;

  48.                 puerto.PortName = puertoSeleccionado.ToString();

  49.             }

  50.         }

  51.  

  52.  

  53.         // *******************************

  54.         // Boton conectar-Desconectar

  55.         // *******************************

  56.         private void OnConnectCOMClick(object sender, RoutedEventArgs e)

  57.         {

  58.                         // Conexion con el puerto serie seleccionado

  59.             puerto.BaudRate = 9600;

  60.             puerto.Parity = Parity.None;

  61.             puerto.StopBits = StopBits.One;

  62.             puerto.DataBits = 8;

  63.             puerto.Handshake = Handshake.None;            

  64.             puerto.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

  65.  

  66.             puerto.Open();

  67.             if (puerto.IsOpen)

  68.             {

  69.                 ComboSelCOM.IsEnabled = false;

  70.                 ConnectCOMButton.Visibility = Visibility.Hidden;

  71.                 DisconnectComButton.Visibility = Visibility.Visible;

  72.             }

  73.         }

  74.  

  75.         private void OnDisConnectCOMClick(object sender, System.Windows.RoutedEventArgs e)

  76.         {

  77.             puerto.Close();

  78.             DisconnectComButton.Visibility = Visibility.Hidden;

  79.             ConnectCOMButton.Visibility = Visibility.Visible;

  80.             ComboSelCOM.IsEnabled = true;

  81.         }

  82.  

  83.  

  84.  

  85.         // *******************************

  86.                 // Mostrar y ocultar ventanas

  87.         // *******************************

  88.         private void CB_SerialPort_Checked(object sender, System.Windows.RoutedEventArgs e)

  89.         {

  90.             myPuertoSerie.Visibility = Visibility.Visible;

  91.         }

  92.  

  93.         private void CB_SerialPort_Unchecked(object sender, System.Windows.RoutedEventArgs e)

  94.         {

  95.             myPuertoSerie.Visibility = Visibility.Hidden;

  96.         }

  97.  

  98.  

  99.         // **********************************

  100.         //  RECIBO DATOS DE PUERTO SERIE

  101.         // **********************************

  102.         public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)

  103.         {

  104.             SerialPort sp = (SerialPort)sender;

  105.             string indata = sp.ReadExisting();

  106.             myPuertoSerie.ActualizarTexto(indata);            

  107.         }

  108.     }

  109. }

  110.  

rbpkirow
Usuario Muy Activo
Usuario Muy Activo
 
Mensajes: 82
Registrado: Jue Abr 07, 2005 2:52 am
Ubicación: España


Re: Comunicacion entre ventanas en proyecto WPF

Notapor ivancp » Mié Sep 07, 2011 12:30 pm

Hola,

No he programado mucho en C# pero puedo decirte que me parece que la función SerialDataReceivedEventHandler inicia un nuevo hilo y sería un poco complicado que devuelva un valor.

Código: Seleccionar todo
  1. puerto.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);



Lo primero que debes hacer es intentar obtener el valor antes de hacer operaciones con el puerto.

Nos cuentas como te fue.
Imagen @latindev | Mi Blog
Por favor lee las reglas del foro
Avatar de Usuario
ivancp
Colaborador
Colaborador
 
Mensajes: 680
Registrado: Jue Sep 06, 2007 12:58 pm



    

Volver a C#

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados