Controles WPF en WinForms

En el anterior Post vimos como utilizar controles WinForms en WPF, ahora vamos a ver como utilizar controles WPF en aplicaciones Winforms, de esta manera podemos enriquecer nuestras antiguas aplicaciones WinForms e incluso poder realizar una migración paso a paso.

Al igual que en WPF en WinForms debemos de añadir una referencia a un assembly, en este caso a WindowsFormIntegration

image

Para añadir el control de WPF elegiremos Add New item en nuestro proyecto, eligiendo un control de WPF

 

image

El XAML de nuestro control será

 

  1. <UserControl x:Class=»WindowsFormsWPFInterop.UserControl1″
  2.    xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation»
  3.    xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml»
  4.    Height=»300″ Width=»300″>    <Grid>        <ComboBox>            <ComboBoxItem Margin=»2″>                <Ellipse Width=»20″ Height=»20″ Stroke=»Black» />            </ComboBoxItem>            <ComboBoxItem Margin=»2″>                <Path Stroke=»Black» Data=»M 0,0 L 20,0 L 10,20 Z» />            </ComboBoxItem>            <ComboBoxItem Margin=»2″>                <Rectangle Stroke=»Black» Width=»20″ Height=»20″ />            </ComboBoxItem>        </ComboBox>    </Grid>UserControl>
  5. </

 

 

 

Ahora en nuestro WinForm debemos de añadir el control ElementHost que se encuentra dentro de la categoría WPF Interoperability

 

image

Una vez introducido en el Form debemos de indicarle que control de WPF queremos hostear

 

image

Ahora si ejecutamos la aplicación obtenemos un combo muy fácil den WPF que sería bastante mas complicado de realizar en WinForm

image

Fácilx de realizar no?

Controles Winform en WPF

De vuelta de vacaciones, empezamos de nuevo a escribir sobre WPF, como siempre que me voy de vacaciones vuelvo con cientos de correos, llamadas telefónicas y problemas, parecen que te castigan si te vas de vacaciones y que cuando vuelves intentan hacerte lo mas dura posible la vuelta, intentaremos seguir escribiendo un post diario pero me temo que este mes va a ser un poco difícil.

Una de las características que al principio no le di mucha importancia pero que luego me ha resultado útil es la de poder hostear controles Winforms dentro de mis aplicaciones de WPF y al revés controles WPF dentro de mis antiguas aplicaciones de WinForm.

Para hostear un control Winform dentro de mis aplicaciones WPF el FrameWork nos provee de la clase WindowsFormsHost que nos va a permitir realizar un hosting de un control WinForm dentro de nuestras aplicaciones de WPF.

Para utilizarlo debemos de incluir la referencia al assembly System.Windows.Forms y a WindowsFormsIntegration

 

image

Como ejemplos vamos a utilizar un DataGrid dentro de nuestra aplicación, el XAML seria

 

  1. <Window x:Class=»WpfWinFormsInterop.Window1″
  2.    xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation»
  3.    xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml»
  4.    xmlns:WinForms=»clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms»
  5.    Title=»Window1″ Height=»300″ Width=»300″>
  6.     <Grid x:Name=»root»>
  7.         <Grid.RowDefinitions>
  8.             <RowDefinition Height=»*»></RowDefinition>
  9.             <RowDefinition Height=»20″></RowDefinition>
  10.         </Grid.RowDefinitions>
  11.         <WindowsFormsHost Grid.Row=»0″>
  12.             <WinForms:DataGridView x:Name=»_MyDataGrid»>
  13.             </WinForms:DataGridView>
  14.         </WindowsFormsHost>
  15.         <Button Grid.Row=»1″ Click=»Button_Click» HorizontalAlignment=»Right»>
  16.            Limpiar Filas
  17.         </Button>
  18.     </Grid>
  19. </Window>

En el XAMl vemos como referenciamos al assembly winforms pudiendo insertar el DataGrid dentro de nuestra aplicación WPF.

 

Ahora podemos utilizar el DataGrid desde el código c# como cualquier control.

  1. public partial class Window1 : Window
  2.     {
  3.         public Window1()
  4.         {
  5.             InitializeComponent();
  6.             System.Windows.Forms.DataGridViewColumn col;
  7.             col = new System.Windows.Forms.DataGridViewColumn();
  8.             col.CellTemplate = new System.Windows.Forms.DataGridViewTextBoxCell();
  9.             col.Name = «Columna 1»;
  10.             _MyDataGrid.Columns.Add(col);
  11.             col = new System.Windows.Forms.DataGridViewColumn();
  12.             col.CellTemplate = new System.Windows.Forms.DataGridViewTextBoxCell();
  13.             col.Name = «Columna 2»;
  14.             _MyDataGrid.Columns.Add(col);
  15.             _MyDataGrid.Rows.Add(new object[] { «Oscar», «Alvarez» });
  16.             _MyDataGrid.Rows.Add(new object[] { «Jorge», «Elorza» });
  17.         }
  18.         private void Button_Click(object sender, RoutedEventArgs e)
  19.         {
  20.             _MyDataGrid.Rows.Clear();
  21.         }
  22.     

 

El resultado seria

 

image

 

Fácil de utilizar y que nos servirá para reutilizar controles complejos que tengamos hechos en Winforms mientras los trasladamos a WPF