Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF RichTextBox拼写检查ComException_C#_Wpf_Windows Runtime_Richtextbox_Spell Checking - Fatal编程技术网

C# WPF RichTextBox拼写检查ComException

C# WPF RichTextBox拼写检查ComException,c#,wpf,windows-runtime,richtextbox,spell-checking,C#,Wpf,Windows Runtime,Richtextbox,Spell Checking,我在尝试在某些Windows 8.1机器上启用拼写检查时遇到了一个异常(这两台机器都有最新的更新,操作系统语言是俄语,.NET framework 4.7是俄语),它说: System.Reflection.TargetInvocationException:调用的目标已引发异常。--> System.Runtime.InteropServices.COMException:的值无效 注册表(HRESULT的例外:0x80040153(REGDB_E_INVALIDVALUE)) 位于Syste

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

System.Reflection.TargetInvocationException:调用的目标已引发异常。--> System.Runtime.InteropServices.COMException:的值无效 注册表(HRESULT的例外:0x80040153(REGDB_E_INVALIDVALUE)) 位于System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pcmd) 在Windows.Data.Text.WordsSegmenter..ctor(字符串语言)--结束 内部异常堆栈跟踪---在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象[]) 参数、签名sig、布尔构造函数)位于 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr,绑定器绑定器,对象[]参数,CultureInfo区域性) 在 MS.Internal.WindowsRuntime.ReflectionHelper.ReflectionNew[TArg1](类型 类型,arg1 arg1)at MS.Internal.WindowsRuntime.Windows.Data.Text.WordsSegmenter..ctor(字符串 语言)在 MS.Internal.WindowsRuntime.Windows.Data.Text.WordsSegmenter.Create(字符串 语言,布尔值应在 System.Windows.Documents.WinRTSpellerInterop.EnsureWordBreakerAndPellCheckerForceCulture(CultureInfo 区域性,布尔值(错误) 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 e) 在 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 在 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)在 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex、DependencyProperty dp、PropertyMetadata、, 有效值条目oldEntry、有效值条目&新条目、布尔值 强制WithDeferredReference,布尔强制WithCurrentValue, 操作类型(操作类型)在 System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, 对象值,属性元数据,布尔值 强制WithDeferredReference,布尔强制WithCurrentValue, 操作类型操作类型,布尔值为内部)位于 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(语言)抛出的其中s\u WinRTType描述了类型“Windows.Data.Text.WordsSegmenter,Windows,ContentType=WindowsRuntime。WordsSegmenter似乎是WinRT组件,所以我看不到它里面发生了什么。我想知道它为什么抛出REGDB\u E\u INVALIDVALUE/它寻找的是哪个值,应该是什么样子?
谢谢大家!

更新1。 我还看到该组件的密钥存在于注册表中:
因此,该组件本身可能引发异常

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

如果您能够正确访问windows update(而不是在WSUS之后),您可以尝试安装它

Dism/Online/Add-Capability/CapabilityName:Language.Basic~~~~en-US~0.0.1.0

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

dism/在线/获取功能/限制访问

背景资料:

最后一个链接解释了features on demand的另一个版本2。 对我来说,它解决了一个问题

使用按需isos功能(从msdn订阅下载):

对于windows 10(不知道这是否在windows 8上可用): en_windows_10_功能_按需_零件_1_版本_1709_更新_2017年9月_x64_dvd_100090755 en_windows_10_功能_按需_零件_2_版本_1709_更新_2017年9月_x64_dvd_100090754

将其解压缩并安装:

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

PS:你在谷歌上搜索过REGDB_E_INVALIDVALUE吗:

例如:

可以使用以下代码创建wpf测试应用程序: 这将读取可用的InputLanguages(对我来说,它不会显示.NET4中的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);
    }
}

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
AvailableLanguages=新的ObservableCollection();
foreach(InputLanguageManager.Current.AvailableInputLanguages中的CultureInfo CultureInfo)
{
可用语言。添加(culterInfo);
}
DataContext=this;
}
公共可观测收集可用语言
{
get{return(ObservableCollection)GetValue(AvailableLanguagesProperty);}
set{SetValue(AvailableLanguagesProperty,value);}
}
公共静态只读DependencyProperty AvailableLanguagesProperty=DependencyProperty.Register(“AvailableLanguages”、typeof(ObservableCollection)、typeof(MainWindow));
private void onLanguage SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
CultureInfo xmlLanguage=e.AddedItems[0]作为CultureInfo;
textBox.Language=XmlLanguage.GetLanguage(XmlLanguage.Name);
}
}
试试这个:start cmd(运行
Dism /online /Add-Capability /capabilityname:Language.Basic~~~en-US~0.0.1.0