# Open the Spell Check Dialog

> Open the spell check dialog for a WPF RichTextBox with Check and Show(Window), and write corrections back into the FlowDocument in IncorrectWordChanging.

- **Product:** TX Spell .NET for WPF
- **Section:** Documentation
- **Kind:** Topic
- **Path:** TX Spell .NET for WPF > Getting Started > RichTextBox > Open the Spell Check Dialog
- **1874 words**
- **Web URL:** https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/richtextbox/dialog/
- **LLMs URL:** https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/richtextbox/dialog/llms.txt
- **LLMs-Full URL:** https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/richtextbox/dialog/llms-full.txt

---

The spell check dialog of TX Spell .NET works with any control, not only with TX Text Control. For a `RichTextBox`, the dialog walks through the misspelled words and the user picks a correction, while a short event handler writes each correction back into the document. You add this to the application of [Check Spelling as You Type](https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/richtextbox/as-you-type/llms-full.txt).

### Prerequisites

- The application of [Check Spelling as You Type](https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/richtextbox/as-you-type/llms-full.txt): a window with a `RichTextBox` called *richTextBox1*, a `TXSpellChecker` resource with the key *txSpellChecker1*, and the methods `GetRange` and `GetTextPointerAtOffset`, in a project with the package `TXTextControl.TXSpell.WPF.SDK`.

### How the Dialog Works With a RichTextBox

A `RichTextBox` knows nothing about the spell checker, so the work is split in two:

1. Your code passes the text of the document to [Check](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-wpf-proofing/txspellchecker/check-method/llms-full.txt). The spell checker finds the incorrect words and keeps them in [IncorrectWords](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-wpf-proofing/txspellchecker/incorrectwords-property/llms-full.txt).
2. [Show](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-wpf-proofing/spellcheckdialog/show-method/llms-full.txt) opens the dialog with these words. Each time the user changes or deletes a word, the spell checker raises [IncorrectWordChanging](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-wpf-proofing/txspellchecker/incorrectwordchanging-event/llms-full.txt), and your handler makes the same change in the document.

### Add the Button

In *MainWindow.xaml*, add a `Button` to the `DockPanel`, before the `RichTextBox`, so that it is docked at the bottom and the `RichTextBox` fills the rest:

```xml
<DockPanel>
    <Button x:Name="buttonSpelling" DockPanel.Dock="Bottom" Content="Spell Check Dialog..."
            Click="buttonSpelling_Click" />
    <RichTextBox x:Name="richTextBox1" TextChanged="richTextBox1_TextChanged" />
</DockPanel>
```

### Write the Code

1. In the constructor of *MainWindow.xaml.cs*, attach the handler after `FindResource`:

```csharp
txSpellChecker1.IncorrectWordChanging += txSpellChecker1_IncorrectWordChanging;
```

1. Add the handler of the button and the handler of the event to the class:

```csharp
private void buttonSpelling_Click(object sender, RoutedEventArgs e)
{
    FlowDocument document = richTextBox1.Document;

    // Find the incorrect words, then walk through them in the dialog
    txSpellChecker1.Check(new TextRange(document.ContentStart, document.ContentEnd).Text);
    txSpellChecker1.SpellCheckDialog.Show(this);
}

private void txSpellChecker1_IncorrectWordChanging(object sender, IncorrectWordChangingEventArgs e)
{
    // Keep the TextChanged handler from checking while the dialog is open
    isColoring = true;

    TextRange range = GetRange(richTextBox1.Document, e.IncorrectWord);

    if (e.Type == TXSpell.ChangeType.Replace)
    {
        range.Text = e.CorrectedWord;
    }
    else if (e.Type == TXSpell.ChangeType.Delete)
    {
        range.Text = "";
    }

    isColoring = false;
}
```

#### What the Code Does

- [SpellCheckDialog](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-wpf-proofing/txspellchecker/spellcheckdialog-property/llms-full.txt) returns the dialog of the spell checker. `Show(this)` opens it with the words of the last `Check`, owned by the window.
- [Type](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-proofing/incorrectwordchangingeventargs/type-property/llms-full.txt) says what the user did: `Replace`, `Delete` or `Ignore`, values of [TXSpell.ChangeType](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-proofing/txspell-changetype/enumeration/llms-full.txt). An ignored word needs no change in the text.
- [IncorrectWord](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-proofing/incorrectwordchangingeventargs/incorrectword-property/llms-full.txt) is the word being changed. `GetRange` from [Check Spelling as You Type](https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/richtextbox/as-you-type/#write-the-code) finds its `TextRange` in the document, and setting the `Text` of the range replaces it.
- [CorrectedWord](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-proofing/incorrectwordchangingeventargs/correctedword-property/llms-full.txt) is the suggestion the user chose. Read it only when `Type` is `Replace`: for other types, it throws an exception.
- Changing the document raises `TextChanged`, and its handler would call `Check` while the dialog is open, which throws an exception. The `isColoring` flag makes the handler skip these changes; the colors are updated again when the user types.

### Run the Application

Press **F5**, type a sentence with a few mistakes, and click **Spell Check Dialog...**. The dialog opens with the first misspelled word in its sentence:

![The Spelling dialog over a RichTextBox: the sentence with the misspelled word "sampke" in red, the language line "No language set", the suggestions and the buttons Ignore Once, Ignore All, Add To Dictionary, Change, Change All, Options and Cancel.](https://docs.textcontrol.com/assets/img/tx-spell-dotnet-wpf/richtextbox-spelling-dialog.aaaa3b4d.webp)

Select a suggestion and click **Change**: the word is replaced in the `RichTextBox`, and the dialog moves on to the next one. **Ignore Once** and **Ignore All** skip words, and **Cancel** ends the check. The dialog shows "No language set" because the text of a `RichTextBox` carries no language information.

### Offer Suggestions in the Context Menu

The same words can also be corrected with a right-click. The [GetMenuItems](https://docs.textcontrol.com/tx-spell-dotnet-wpf/reference/txtextcontrol-wpf-proofing/txspellchecker/getmenuitems-method/llms-full.txt) method returns ready-made menu items for an incorrect word, with suggestions and the commands of the dialog, to put into a `ContextMenu`:

![The context menu of a misspelled word in a RichTextBox, with five suggestions, Ignore, Ignore All, Add To Dictionary, Spell Check Dialog and Options.](https://docs.textcontrol.com/assets/img/tx-spell-dotnet-wpf/richtextbox-context-menu.e10b1dc8.webp)

[Context Menus](https://docs.textcontrol.com/tx-spell-dotnet-wpf/user-interface/context-menus/llms-full.txt) builds this menu step by step.

### Next Steps

- [Checking on Demand](https://docs.textcontrol.com/tx-spell-dotnet-wpf/spell-checking/on-demand/llms-full.txt): the two dialogs, and how a check ends.
- [Checking Multiple Controls](https://docs.textcontrol.com/tx-spell-dotnet-wpf/spell-checking/multiple-controls/llms-full.txt): check several controls in one dialog.
- [Events](https://docs.textcontrol.com/tx-spell-dotnet-wpf/spell-checking/events/llms-full.txt): everything the arguments of `IncorrectWordChanging` carry.

---

## Nearby

- **Previous:** [Check Spelling as You Type](https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/richtextbox/as-you-type/llms-full.txt)
- **Next:** [Checking Text in Code](https://docs.textcontrol.com/tx-spell-dotnet-wpf/getting-started/in-code/llms-full.txt)
