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?

¿Fue útil?

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 propiedad Thread.CurrentCulture para los hilos existentes. Sin embargo, los hilos futuros tendrán nuevos valores de propiedad CultureInfo .

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top