2011. július 27., szerda

Engedélyezhetetlen WPF control ElementHostban?

Ma volt egy igen kellemetlen debug-maratonom. Ki kellett deríteni, hogy vajon miért nem működik két, szinte teljesen azonos WinForms control, amiben egy ElementHost tartalmazza ugyanazt a WPF control-t. Konkrétan az egyik olyan volt, mintha le lett volna tiltva. Nem fogadott semmilyen inputot, se egér, se billentyűzet. Egyértelműen úgy nézett ki, hogy a control disabled állapotban van.

Azt gondoltam, hogy biztos a controlok engedélyezésével lesz valami gond, de nem. Logikailag minden helyes volt. Az összes control engedélyezve volt a hierarchiában.

Nos, egy kis Google keresgélés után kiderült, hogy nem a programmal van a baj, hanem az ElementHost egyszerűen nem szinkronizálja az engedélyezést. Ha a control létrehozásakor az ElementHost vagy annak valamelyik szülője le van tiltva (Enabled = false) akkor az “örökre” le is lesz tiltva.

A megoldás egyszerű. A Microsoft alábbi knowledgebase cikkéből kiderül a megoldás: csinálni kell egy wrappert, amely szinkronizálja az engedélyezést:

public class MyElementHost : ElementHost
{
    protected override void OnEnabledChanged(EventArgs e)
    {
        SynchChildEnableState();

        base.OnEnabledChanged(e);
    }

    private void SynchChildEnableState()
    {
        IntPtr childHandle = GetWindow(Handle, GW_CHILD);
        if (childHandle != IntPtr.Zero)
        {
            EnableWindow(childHandle, Enabled);
        }
    }

    private const uint GW_CHILD = 5;

    [DllImport("user32.dll")]
    private extern static IntPtr GetWindow(IntPtr hWnd, 
uint uCmd); [DllImport("user32.dll")] private extern static bool EnableWindow(IntPtr hWnd,
bool bEnable); }

Nincsenek megjegyzések:

Megjegyzés küldése