【问题标题】:WPF RichTextBox SpellCheck ComExceptionWPF RichTextBox 拼写检查 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。 我还看到这个组件的密钥存在于注册表中: 所以可能这个组件自己抛出异常

【问题讨论】:

    标签: c# wpf windows-runtime richtextbox spell-checking


    【解决方案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 本身提供的默认字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多