¿Evento de cambio de cultura .NET?
Pregunta
Tengo un control personalizado .NET que muestra información de una manera dependiente de la cultura. Para mejorar el rendimiento, guardo cierta información dentro del control en lugar de generarla cada vez. Necesito saber si la cultura ha cambiado para poder regenerar esta información interna según corresponda.
¿Hay algún evento al que me haya conectado? ¿O tengo que probar la configuración de la cultura cada vez que pinto para ver si ha cambiado?
Solución
Puede manejar SystemEvents.UserPreferenceChanged
evento:
SystemEvents.UserPreferenceChanged += (sender, e) =>
{
// Regional settings have changed
if (e.Category == UserPreferenceCategory.Locale)
{
// .NET also caches culture settings, so clear them
CultureInfo.CurrentCulture.ClearCachedData();
// do some other stuff
}
};
Windows también transmite el WM_SETTINGSCHANGE
mensaje a todos los formularios. Puede intentar detectarlo anulando WndProc, para que se vea así:
// inside a winforms Form
protected override void WndProc(ref Message m)
{
const int WM_SETTINGCHANGE = 0x001A;
if (m.Msg == WM_SETTINGCHANGE)
{
// .NET also caches culture settings, so clear them
CultureInfo.CurrentCulture.ClearCachedData();
// do some other stuff
}
base.WndProc(ref m);
}
Tenga en cuenta que probablemente también desee llamar a CultureInfo.CurrentCulture.ClearCachedData ()
para invalidar la información cultural de los hilos recién creados, pero tenga en cuenta que CurrentCulture
para los hilos existentes no se actualizará, como se menciona en MSDN:
El método
ClearCachedData
no actualiza la información en la propiedadThread.CurrentCulture
para los hilos existentes. Sin embargo, los hilos futuros tendrán nuevos valores de propiedadCultureInfo
.
Otros consejos
Sospecho que podría hacer esto haciendo que su código cambie la cultura a través de una propiedad central que en sí hace algo como generar un evento; pero tenga mucho cuidado: los eventos estáticos son una manera muy fácil de mantener una loca cantidad de objetos atascados en la memoria (es decir, GC los trata como vivos). Si opta por este enfoque, es posible que desee ver cosas como WeakReference
...