You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中BlazorWebView通过EventCallback设置CurrentInputLanguage失效求助

问题原因分析与解决思路

核心原因:WebView2的焦点与输入语言接管逻辑

你遇到的问题本质是BlazorWebView的EventCallback触发后,WebView2控件会重新接管焦点,并通过自身的输入框架覆盖WPF的输入语言设置,具体拆解:

  1. 焦点流转差异:

    • Button点击事件触发时,焦点始终停留在WPF原生控件上,修改InputLanguageManager.Current.CurrentInputLanguage后,系统不会自动覆盖该设置。
    • EventCallback由Blazor组件触发,事件执行完毕后,焦点会自动回到WebView2内部的HTML元素。WebView2有独立的输入语言管理逻辑,会根据自身页面配置(如HTML的lang属性)、系统默认语言或Blazor应用的Culture设置,强制同步输入语言,直接覆盖你通过Dispatcher设置的值,最终回到Invariant Culture。
  2. 线程与上下文冲突:
    虽然你用Application.Current.Dispatcher确保代码在WPF UI线程执行,但WebView2的渲染进程和WPF UI进程是分离的。WebView2的输入语言同步是异步操作,会在你的设置完成后,通过跨进程消息触发输入语言重置,导致你的修改仅在短时间内生效,随后被覆盖。


可行解决办法

  • 强制转移焦点到WPF控件:
    在设置输入语言后,主动将焦点切换到一个WPF原生控件(比如隐藏的TextBox),阻止WebView2重新接管焦点:

    public async Task SetCurrentLanguageAsync(CultureInfo inputLanguage)
    {
        await Application.Current?.Dispatcher.InvokeAsync(() => 
        {
            InputLanguageManager.Current.CurrentInputLanguage = inputLanguage;
            // 假设你有一个名为hiddenFocusBox的隐藏TextBox
            hiddenFocusBox.Focus();
        });
    }
    
  • 同步WebView2与WPF的输入语言设置:
    不要只修改WPF侧的输入语言,同时通过WebView2的API设置页面的输入语言。例如,通过CoreWebView2.PostWebMessageAsString给Blazor页面发送语言切换指令,让页面设置自身的lang属性,同时同步WPF侧的设置:

    public async Task SetCurrentLanguageAsync(CultureInfo inputLanguage)
    {
        await Application.Current?.Dispatcher.InvokeAsync(() => 
        {
            InputLanguageManager.Current.CurrentInputLanguage = inputLanguage;
            // 发送消息给Blazor页面切换语言
            blazorWebView.CoreWebView2?.PostWebMessageAsString(inputLanguage.Name);
        });
    }
    

    然后在Blazor页面中监听这个消息,设置页面语言:

    @inject IJSRuntime JSRuntime
    @code {
        protected override async Task OnInitializedAsync()
        {
            await JSRuntime.InvokeVoidAsync("listenLanguageChange");
        }
    }
    

    对应的JS代码:

    window.listenLanguageChange = () => {
        chrome.webview.addEventListener('message', event => {
            document.documentElement.lang = event.data;
        });
    };
    
  • 订阅输入语言变更事件并修正:
    订阅InputLanguageManager.InputLanguageChanged事件,当检测到输入语言被WebView2重置为Invariant Culture时,重新设置目标语言:

    // 在应用初始化时订阅事件
    private CultureInfo _targetCulture;
    public void InitializeLanguageWatcher(CultureInfo targetCulture)
    {
        _targetCulture = targetCulture;
        InputLanguageManager.Current.InputLanguageChanged += OnInputLanguageChanged;
    }
    
    private void OnInputLanguageChanged(object sender, InputLanguageEventArgs e)
    {
        if (InputLanguageManager.Current.CurrentInputLanguage == CultureInfo.InvariantCulture)
        {
            InputLanguageManager.Current.CurrentInputLanguage = _targetCulture;
        }
    }
    

内容的提问来源于stack exchange,提问作者NullReference

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:27:35