Este documento presenta tres lecciones sobre mejorar la funcionalidad y usabilidad de aplicaciones. La primera lección cubre la integración de controles WinForms y WPF. La segunda lección trata sobre la implementación de Drag and Drop. La tercera lección cubre la globalización, localización y accesibilidad.
1. Mejorando la funcionalidad
y usabilidad de las
aplicaciones
D A N A E A G U I L A R G U Z M Á N .
M C T , M C P , M C T S
D A N A E A G U I L A R @ G M A I L . C O M
2. Contenido del Módulo
Lección 1. Integrando controles WinForms y WPF.
Lección 2. Implementando Drag and Drop.
Lección 3. Globalización, localización y accesibilidad.
4. 1.Usando ElementHosts en
Windows Forms
1. Agregando ElementHost
2. Controles WPF en WinForms:
System.Windows.Controls.Expander expander =
new System.Windows.Controls.Expander();
expander.Header = "WPF Expander";
expander.Content = "Contenido";
elementHost1.Child = expander;
5. 2. Usando ControlHosts en WPF
Agregando controles Winforms en WPF desde C#:
1. Agregar referencia a System.Windows.Forms
2. Declarar e inicializar los controles:
3. Usarlos normalmente:
System.Windows.Forms.OpenFileDialog dialogo =
new System.Windows.Forms.OpenFileDialog();
System.Windows.Forms.DialogResult resultado;
resultado = dialogo.ShowDialog();
if (resultado == System.Windows.Forms.DialogResult.OK)
{
MessageBox.Show(dialogo.FileName);
}
6. 2. Usando ControlHosts en WPF
Agregando controles Winforms en WPF en XAML:
1. Referenciar System.Windows.Forms.Integration
2. Referenciar el namespace System.Windows.Forms
xmlns:my="clr-
namespace:System.Windows.Forms.Integration;
assembly=WindowsFormsIntegration"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
7. 2. Usando ControlHosts en
WPF
Agregando controles Winforms en WPF en XAML:
3. Agregar WindowsFormsHost y los controles WinForms dentro.
* Los controles WinForms tomarán el tamaño del WindowsFormsHost
<my:WindowsFormsHost Margin="48,106,30,56" Name="winFormsHost1">
<wf:Button Text="Un Botón Windows Forms" />
</my:WindowsFormsHost>
11. 2. Drag and Drop entre
aplicaciones
El sistema soporta por defecto Drag & Drop entre aplicaciones .NET
Condiciones:
El control destino debe permitir uno de los drag Effects especificados
en la llamada a DoDragDrop
El control destino debe aceptar los datos en el formato especificado
en la llamada a DoDragDrop
12. Lección 3. Globalización,
localización y accesibilidad
1. Manejo de recursos locales
2. Usando configuraciones de culturas en validadores y conversores.
3. Usando archivos de recursos para localización.
4. Configuraciones regionales.
5. Implementando características de accesibilidad.
13. 1. Manejo de recursos locales
Cultura de la aplicacion:
en indica el idioma inglés
es indica el idioma español
de indica el idioma alemán
Cultura específica:
en-CA indica el idioma inglés y la region de Canada
af-ZA indica el idioma africano y la region de Sud Africa
es-ES indica el idioma español y la region de España
14. 1. Manejo de recursos locales
• Modificando la cultura de la aplicación en Application.Startup:
(CurrentCulture y CurrentUICulture)
• Especificando la cultura neutra en WPF:
System.Threading.Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("es-ES");
[assembly: NeutralResourcesLanguage("en-US",
UltimateResourceFallbackLocation.Satellite)]
15. 1. Manejo de recursos locales
Localizando la aplicación:
1. Agregar el atributo UICulture al proyecto
Al compilar se generan los subdirectorios para las culturas
2. Marcar las propiedades localizables con el atributo Uid (para cada
archivo XAML)
<UICulture>es-ES</UICulture>
<Button x:Uid="Button_1" Name="Button1">Un botón</Button>
16. 1. Manejo de recursos locales
2. Marcar las propiedades localizables con el atributo Uid (para cada
archivo XAML)
3. Extraer el contenio localizable
4. Traducir
5. Crear los assemblies Satelite
msbuild /t:updateuid miAplicacion.csproj
locbaml /generate es-ESmiAplicacion.resources.dll
/trans:miAplicacion.resources.FrenchCan.csv /cul:fr-CA /out:fr-CA
17. 3. Usando configuraciones de culturas
en validadores y conversores.
1. Agregar un traductor a nuestros conversores:
[ValueConversion(typeof(string), typeof(string))]
public class LanguageConverter : IValueConverter
{
Traductor _traductor = new Traductor();
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
string cadena = (string)value;
switch (culture.ToString())
{
case "fr-FR":
return _traductor.EspaniolAFrances(cadena);
case "de-DE":
return _traductor.EspaniolAAleman(cadena);
default:
return cadena;
}
}
18. 3. Usando configuraciones de culturas
en validadores y conversores.
1. Agregar un traductor a nuestros conversores (ConvertBack):
public object ConvertBack(object value, Type targetType, object
parameter, System.Globalization.CultureInfo culture)
{
string cadena = (string)value;
switch (culture.ToString())
{
case "fr-FR":
return _traductor.FrancesAEspaniol(cadena);
case "de-DE":
return _traductor.AlemanAEspaniol(cadena);
default:
return cadena;
}
}
19. 4. Usando archivos de
recursos para localización.
1. Agregar un folder de Recursos
2. Agregar archivos resx (Resource.de-DE.resx, Resource.en-US.resx,
Resources.resx)
20. 4. Usando archivos de
recursos para localización.
3. Cambiar el modificador de acceso del archivo resx a public
4. Agregar el namespace del recurso en nuestra ventana:
5. Agregar un Binding a la propiedad deseada:
xmlns:resx="clr-namespace:WpfApplication1.Resources"
<TextBlock Text="{x:Static resx:Resource.CadenaSaludo}" />
21. 5. Configuraciones regionales.
1. Se aplican al cambiar la cultura de la aplicación
2. Los datos que sin formato no serán afectados por un cambio de
cultura.
3. Aplicar formatos a los datos como fechas, cantidades monetarias
4. Usar IFormatProvider en los metodos Convert
DateTime.Now.ToString(CultureInfo.CurrentCulture);
22. 5. Configuraciones regionales.
5. Validar con CODE_ANALYSIS en VS o con FxCop
6. Para datos que no se muestran al usuario usar InvariantCulture
DateTime.Now.ToString(CultureInfo.InvariantCulture);
23. 6. Implementando características
de accesibilidad.
• WPF usa el nuevo API de accesibilidad UIA (UI Automation)
• UIA expone programáticamente información a usuarios de tecnologías
asistidas (AT).
24. 6. Implementando características
de accesibilidad.
Propiedades requeridas para la accesibilidad:
•Name
• Debe ser claro. No usar notación húngara.
•Alt Text
• Cuando el texto no es visible o se usan imágenes
•Automation ID
• Identifica al elemento UIA como único
<ListBox AutomationProperties.Name = "Estados"/>
25. 6. Implementando características
de accesibilidad.
Navegación por teclado:
• Toda la aplicación debe ser navegable usando solo el teclado
•Especificar el orden de tabulación
•Especificar teclas de acceso directo.
26. 6. Implementando características
de accesibilidad.
Navegación por teclado:
•Las teclas de navegación deben ser funcionales:
• TAB, SHIFT+TAB, CTRL+TAB, CTRL+SHIFT+TAB, UPARROW, DOWNARROW,
LEFTARROW, y RIGHTARROW.
•Se puede cambiar la navegación:
Menu menuNavegable = new Menu();
/*...*/
KeyboardNavigation.SetTabNavigation(menuNavegable,
KeyboardNavigationMode.Cycle);
27. 6. Implementando características
de accesibilidad.
DPI alto:
• WPF es dpi-aware pero:
• Evitar hardcodear layouts, tamaños o fuentes,
• Usar porcentajes donde sea posible.
28. 6. Implementando características
de accesibilidad.
Contraste Alto:
•El modo de contraste alto debe:
• Remover animaciones flasheantes
• Remover o reducir animaciones de transición
• Omitir imágenes no funcionales, gradientes o patrones detrás del texto.
•No se debe hardcodear colores.
•Se debe tener iconos de color alternativo para alto contraste.
29. 6. Implementando características
de accesibilidad.
Validar la accesibilidad de nuestra aplicación:
• UI Accessibility Checker:
• http://acccheck.codeplex.com/