1

私は持っています:

  1. Windowsフォームプロジェクトを作成しました。
  2. WPFTextBoxを保持するUserControlを作成しました。
  3. TextBoxのSpellCheckにCustomDictionaryを追加しました。
  4. WindowsフォームにUserControlを追加しました。

XAMLは、WPFテキストボックスをユーザーコントロールに追加するために使用されます。

<UserControl x:Class="TestElementHost.SpellBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="248" d:DesignWidth="250">
    <Grid>
        <TextBox Name="txtWPF" />
    </Grid>
</UserControl>

フォームコード(VSデザイナファイルに追加されたボタン)は次のとおりです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestElementHost
{
    public partial class Form1 : Form
    {
        private System.Windows.Forms.Integration.ElementHost elementHost1;
        private SpellBox spellBox1;
        public Form1()
        {
            InitializeComponent();
            this.elementHost1 = new System.Windows.Forms.Integration.ElementHost();
            this.spellBox1 = new TestElementHost.SpellBox();
            this.elementHost1.Location = new System.Drawing.Point(27, 12);
            this.elementHost1.Name = "elementHost1";
            this.elementHost1.Size = new System.Drawing.Size(269, 296);
            this.elementHost1.TabIndex = 0;
            this.elementHost1.Text = "elementHost1";
            this.elementHost1.Child = this.spellBox1;
            this.Controls.Add(this.elementHost1);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            spellBox1.txtWPF.SpellCheck.IsEnabled = true;
            spellBox1.txtWPF.SpellCheck.CustomDictionaries.Add(new Uri(Application.StartupPath + @"\MyDictionary.lex"));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            spellBox1.txtWPF.Text = "my bbad word."; // bbad is in the CustomDictionary
        }

        private void button2_Click(object sender, EventArgs e)
        {
            spellBox1.txtWPF.IsEnabled = false;
            spellBox1.txtWPF.IsEnabled = true;
           // spellBox1.txtWPF.SpellCheck.IsEnabled = false;
           // spellBox1.txtWPF.SpellCheck.IsEnabled = true;
        }
    }
}

これは非常にうまく機能し、IsEnabled、IsReadOnly、またはVisibilityプロパティを変更しようとするまで、CustomDictionaryの単語は無視されます。たとえば、IsReadOnlyをtrueに設定してから、再びfalseに戻すと、カスタム辞書にある単語が突然レッドライニングされます。

これを回避する方法は、ユーザーがコントロール内のテキストを編集できるようにする必要がある場合に、SpellCheck.IsEnabledをfalseに設定してから、連続する行でtrueに戻すことです。これにより、カスタム辞書が再び機能するようになります。

他の誰かがこの問題を抱えていましたか?これはバグですか、それとも私は何かを見逃しましたか?

4

1 に答える 1

2

「機能」のように見えます(このヨアヒムを確認してくれてありがとう):

カスタム ディクショナリを使用している場合、WPF テキスト ボックスまたはユーザー コントロールの可視性、有効または読み取り専用の属性を変更すると、スペル チェッカーはカスタム ディクショナリを無視します。

これを回避するには、スペル チェックを無効にしてから再度有効にします。

これは dot net runtime v4.0.30319 に適用されます

于 2012-10-23T09:38:50.737 に答える