LightSwitchでのIME制御

現バージョンのLightSwitchではTextBoxに対してIMEの設定を行うことができません。しかし日本ではIME制御したいケースは普通に考えられます。Silverlight自体はIME制御できるのでヘルパーを作成してカスタムコードで対処することを考えました。

public static class IContentItemProxyExtention
{
    public static void SetTextBoxIme(this IContentItemProxy @this, bool enabled, 
                                     InputMethodState state, ImeConversionModeValues mode)
    {
        @this.ControlAvailable += delegate(object sender, ControlAvailableEventArgs e)
        {
            var txt = (TextBox)e.Control;
            InputMethod.SetIsInputMethodEnabled(txt, enabled);
            InputMethod.SetPreferredImeState(txt, state);
            InputMethod.SetPreferredImeConversionMode(txt, mode);
        };
    }
    public static void SetTextBoxIme(this IContentItemProxy @this, bool enabled)
    {
        @this.ControlAvailable += delegate(object sender, ControlAvailableEventArgs e)
        {
            var txt = (TextBox)e.Control;
            InputMethod.SetIsInputMethodEnabled(txt, enabled);
        };
    }
}

ヘルパーはCreatedのタイミングでFindControlした結果に対して指定します。

partial void OrdersListDetail_Created()
{
    this.FindControl("ShipName1")
      .SetTextBoxIme(true, InputMethodState.On, ImeConversionModeValues.Katakana);
    this.FindControl("ShipAddress1")
      .SetTextBoxIme(true, InputMethodState.On, 
                 ImeConversionModeValues.FullShape | ImeConversionModeValues.Native);
    this.FindControl("ShipCity1").SetTextBoxIme(false);
}