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