WPF RichTextBox 拼写检查 ComException

Posted

技术标签:

【中文标题】WPF RichTextBox 拼写检查 ComException【英文标题】:WPF RichTextBox SpellCheck ComException 【发布时间】:2018-04-19 15:11:29 【问题描述】:

我在尝试在某些 Windows 8.1 机器上启用拼写检查时遇到了一个异常(两者都有最新更新,操作系统语言是俄语,.NET framework 4.7 是俄语)说:

System.Reflection.TargetInvocationException:调用的目标已抛出异常。 ---> System.Runtime.InteropServices.COMException:值无效 注册表(来自 HRESULT 的异常:0x80040153 (REGDB_E_INVALIDVALUE)) 在 System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD) 在 Windows.Data.Text.WordsSegmenter..ctor(字符串语言)---结束 内部异常堆栈跟踪 --- 在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数,签名 sig,布尔构造函数)在 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化) 在 MS.Internal.WindowsRuntime.ReflectionHelper.ReflectionNew[TArg1](类型 类型,TArg1 arg1) 在 MS.Internal.WindowsRuntime.Windows.Data.Text.WordsSegmenter..ctor(字符串 语言)在 MS.Internal.WindowsRuntime.Windows.Data.Text.WordsSegmenter.Create(字符串 语言,布尔值 shouldPreferNeutralSegmenter) 在 System.Windows.Documents.WinRTSpellerInterop.EnsureWordBreakerAndSpellCheckerForCulture(CultureInfo 文化,布尔 throwOnError)在 System.Windows.Documents.WinRTSpellerInterop..ctor() 在 System.Windows.Documents.SpellerInteropBase.CreateInstance() 在 System.Windows.Documents.Speller.EnsureInitialized() 在 System.Windows.Documents.Speller.SetCustomDictionaries(CustomDictionarySources 字典位置,布尔添加)在 System.Windows.Documents.TextEditor.SetCustomDictionaries(布尔添加) 在 System.Windows.Controls.SpellCheck.OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs 吃 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs 吃 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs 参数)在 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,DependencyProperty dp,PropertyMetadata 元数据, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference,布尔 coerceWithCurrentValue, 操作类型操作类型)在 System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, 对象值、PropertyMetadata 元数据、布尔值 coerceWithDeferredReference,布尔 coerceWithCurrentValue, OperationType operationType, Boolean isInternal) at System.Windows.DependencyObject.SetValue(DependencyProperty dp,对象 值)

此代码可用于重现问题:

var richTextBox = new RichTextBox();
InputLanguageManager.SetInputLanguage(richTextBox,CultureInfo.GetCultureInfo("en-US"));
richTextBox.SetValue(SpellCheck.IsEnabledProperty, true);

在调查此问题时,我发现s_WinRTType.ReflectionNew<string>(language); 引发了异常,其中 s_WinRTType 描述了类型“Windows.Data.Text.WordsSegmenter, Windows, ContentType=WindowsRuntime。WordsSegmenter 似乎是 WinRT 组件,所以我看不到它里面发生了什么。我想知道它为什么会抛出 REGDB_E_INVALIDVALUE / 它寻找哪个值以及它应该是什么样子? 谢谢!

更新 1。 我还看到这个组件的密钥存在于注册表中: 所以可能这个组件自己抛出异常

【问题讨论】:

【参考方案1】:

您需要通过控制面板或使用 DISM 安装不同于语言包语言功能。对我来说,这需要 .Net 4.7 并且适用于 Windows 10 build 1709(秋季创作者更新)。我不知道这在 Windows 8 上是否可行。

如果您可以正确访问 Windows 更新(不在 WSUS 之后),您可以尝试安装它

Dism /Online /Add-Capability /CapabilityName:Language.Basic~~~zh-CN~0.0.1.0

要检查已安装的功能,这会显示所有已安装的选项:

dism /online /get-capabilities /limitaccess

背景信息:

https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/add-language-packs-to-windows

https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dism-capabilities-package-servicing-command-line-options

https://blogs.technet.microsoft.com/mniehaus/2015/08/31/adding-features-including-net-3-5-to-windows-10/

最后一个链接解释了另一个版本 2 的按需功能。 对我来说,它解决了一个问题。

使用按需功能 iso(从您的 msdn 订阅中下载):

对于 Windows 10(不知道这是否适用于 Windows 8): en_windows_10_features_on_demand_part_1_version_1709_updated_sept_2017_x64_dvd_100090755 en_windows_10_features_on_demand_part_2_version_1709_updated_sept_2017_x64_dvd_100090754

解压并安装:

dism /online /add-package /packagepath:d:\features\Microsoft-Windows-LanguageFeatures-Basic-en-us-Package.cab

PS:你用谷歌搜索了 REGDB_E_INVALIDVALUE:VSHost crash, REGDB_E_INVALIDVALUE loading Specific Project

示例:

您可以使用以下代码创建 wpf 测试应用程序: 这将读取可以使用的 AvailableInputLanguages。 (对我来说,它不显示 .Net 4 中的 4 种语言,只显示我使用 Dism 安装的语言。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <ComboBox 
          ItemsSource="Binding AvailableLanguages"
          SelectionChanged="OnLanguageSelectionChanged"
          DisplayMemberPath="NativeName"/>
    <TextBox x:Name="textBox" Grid.Row="1"
         AcceptsReturn="True"
         AcceptsTab="True"
         SpellCheck.IsEnabled="True"
         Text="Hello world"/>
</Grid>

public partial class MainWindow : Window

    public MainWindow()
    
        InitializeComponent();

        AvailableLanguages = new ObservableCollection<CultureInfo>();

        foreach (CultureInfo culterInfo in InputLanguageManager.Current.AvailableInputLanguages)
        
            AvailableLanguages.Add(culterInfo);
        

        DataContext = this;
    

    public ObservableCollection<CultureInfo> AvailableLanguages
    
        get  return (ObservableCollection<CultureInfo>)GetValue(AvailableLanguagesProperty); 
        set  SetValue(AvailableLanguagesProperty, value); 
    

    public static readonly DependencyProperty AvailableLanguagesProperty = DependencyProperty.Register("AvailableLanguages", typeof(ObservableCollection<CultureInfo>), typeof(MainWindow));


    private void OnLanguageSelectionChanged(object sender, SelectionChangedEventArgs e)
    
        CultureInfo xmlLanguage = e.AddedItems[0] as CultureInfo;
        textBox.Language = XmlLanguage.GetLanguage(xmlLanguage.Name);
    

【讨论】:

从这里msdn.microsoft.com/en-us/library/… 我读到“在 .NET Framework 4 中,WPF 提供了英语、法语、德语和西班牙语的字典。”那是假的吗? 我必须安装它们。 我会继续调查,给你更多细节,并可能标记你的答案【参考方案2】:

试试这个:启动 cmd(以管理员身份运行)

Dism /online /Add-Capability /capabilityname:Language.Basic~~~en-US~0.0.1.0

【讨论】:

很遗憾,现在我没有 8.1 的机器。文档说:“仅当 WPF 提供默认字典时才支持拼写检查器。在 .NET Framework 4 中,WPF 提供英语、法语、德语和西班牙语的字典。” docs.microsoft.com/en-us/dotnet/api/… 。我想避免在客户的机器上安装任何东西。相反,我想使用 WPF 本身提供的默认字典。

以上是关于WPF RichTextBox 拼写检查 ComException的主要内容,如果未能解决你的问题,请参考以下文章

WPF:在只读文本框上使用拼写检查

Win10中的拼写检查文本框 - 慢

C#/WPF:禁用 RichTextBox 的文本换行

WPF RichTextBox 插入换行 移动光标

WPF RichTextBox 插入回车

WPF richtextbox问题