2009-11-12 7 views
5

Quiero iniciar una nueva aplicación en WPF. La nueva interfaz de usuario en WPF necesita Control DataGridView y PropertyGrid Control. Pero parece que estos dos controles no existirán en WPF y quiero alojar estos dos controles usando WindowsFormsHost.Limitaciones de uso de controles .NET 2.0 (Windows Forms) en WPF?

Sin embargo, si hago eso, ¿hay alguna limitación que alguien pueda prever con este enfoque?

Respuesta

5

La principal limitación es que usted suelta todas las potentes funciones de WPF: Data binding, ControlTemplates y DataTemplates, de tamaño infinito, zooms/Rotaciones, Opacity, Attached Properties, sólo para nombrar unos pocos. ¡Eso es mucho para rendirse! Tendrá que programar estos controles utilizando las viejas técnicas tediosas y propensas a errores de WinForms, y tratar nuevamente con todas las limitaciones que se liberó de hace años.

DataGridView

NET Framework 3.5 SP1 tiene un DataGrid que pueden hacer el trabajo, y hay varios de controles de terceros para este como el de Xceed. El uso de una cuadrícula basada en WPF permite el enlace de datos completo, la creación de plantillas y el estilo dentro de la grilla, lo que no sería posible si utiliza DataGridView de WinForms.

PropertyGrid

La razón de WPF no viene con un PropertyGrid es que es tan fácil de recrear usando WPF lo que ya se le da: Un cuadro de lista sencillo va a hacer, adecuadamente diseñado, con sólo unas pocas líneas de código detrás.

La belleza en el uso de una implementación WPF PropertyGrid es que puede usar plantillas para presentar las propiedades que está editando, y lo más importante es que puede agregar nuevos editores de propiedades simplemente expresándolos en XAML con algunos enlaces. Por ejemplo, algunas de las propiedades en una de nuestras cuadrículas de propiedad están configuradas con controles deslizantes, y solo fueron cinco líneas de XAML para que eso ocurriera.

Aquí hay un código que ilustran los conceptos clave detrás de la implementación de un PropertyGrid en WPF:

public class PropertyGrid 
{ 
    ... 
    public static readonly DependencyProperty SelectedObjectProperty = ... 
    { 
    PropertyChangedCallback = (obj, e) => 
    { 
     PropertyItems = 
     from pi in SelectedObject.GetType().GetProperties() 
     select new PropertyGridItem { Object = SelectedObject, PropertyInfo = pi }; 
    } 
    } 
} 

public class PropertyInfo 
{ 
    public object Object; 
    public PropertyInfo PropertyInfo; 
    public object Value 
    { 
    get { return PropertyInfo.GetValue(Object); } 
    set { PropertyInfo.SetValue(Object, value); } 
    } 
    public string Category 
    { 
    get 
    { 
     return (
     from attrib in PropertyInfo.GetCustomAttributes().OfType<CategoryAttribute>() 
     select attrib.Name 
    ).FirstOrDefault(); 
    } 
    } 
} 

Con esto es muy rápido y fácil de replicar todo el aspecto y la sensación de PropertyGrid con unas pocas líneas de código XAML: Solo use un ListBox con agrupamiento por categoría, y un ItemTemplate que consiste en un DockPanel que contiene un ancho fijo TextBlock vinculado al nombre de la propiedad y un ContentPresenter para imprimir el editor de propiedades.

+0

Aunque esbocé el PropertyGrid de fabricación propia que utilizamos, es posible que también desee consultar el de CodePlex que menciona Franci Penov. –

2

En primer lugar, hay terceros property grids y datagrids para WPF, y estos suelen apoyará las capacidades de estilo adicionales de WPF y encajar en más idiomáticamente con aplicaciones WPF. Por lo tanto, no es necesario volver a WinForms, y probablemente no debería hacerlo, a menos que los controles de terceros o del conjunto de herramientas no sean una opción.

Si tiene que regresar a WinForms, la principal limitación a tener en cuenta es la "regla del espacio aéreo": no puede tener controles WinForms y WPF superpuestos entre sí. Además, por supuesto, los controles de WinForms no pueden participar en el enlace de datos de WPF y deberán abordarse utilizando el código de procedimiento old-skool, aunque podría encapsularlos en controles de usuario para evitar esto. Además, si está tratando de crear efectos visuales sofisticados, es posible que no funcionen muy bien con los controles de WinForms: es probable que la regla del espacio aéreo lo muerda con fuerza si está realizando transformaciones o animaciones en las proximidades de un control WinForms. Pero para aplicaciones visualmente simples deberían funcionar bien.

Cuestiones relacionadas