5

RichTextBoxoneと oneを含む Grid で構成される非常に単純な WPF Window を作成しましたComboBox。を使用して、選択ComboBox範囲のフォント サイズを変更および検索します。RichTextBox

私の XAML のコード ビハインド ファイルは次のとおりです。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // Add the font sizes.
        for (var i = 1; i < 72; i++)
        {
            FontSize.Items.Add((double) i);
        }
    }

    private void MyTextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        // If the selection changes, update the font size in the ComboBox.
        FontSize.SelectedValue = (double) MyTextBox.Selection.GetPropertyValue(TextBlock.FontSizeProperty);
    }

    private void FontSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // If the selected size changes, change the size of the selection in the RichTextBox.
        if (FontSize.SelectedItem != null)
            MyTextBox.Selection.ApplyPropertyValue(TextBlock.FontSizeProperty, FontSize.SelectedItem);
    }
}

ここには 2 つのことがあります。

  1. MyTextBox_SelectionChangedComboBox選択範囲のフォント サイズで を更新します。
  2. FontSize_SelectionChanged選択範囲のフォントサイズを変更します。

以下の問題を確認できます。

ここに画像の説明を入力

選択してフォントサイズを変更すると、完全に変更されます。しかし、フォントサイズが異なる別のテキストをクリックすると、元に戻ります。

この動作の原因は何ですか?

編集: XAML ファイルは次のとおりです。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox x:Name="FontSize" HorizontalAlignment="Left" VerticalAlignment="Top" Width="497" Margin="10,10,0,0" SelectionChanged="FontSize_SelectionChanged"/>
        <RichTextBox x:Name="MyTextBox" HorizontalAlignment="Left" Height="273" VerticalAlignment="Top" Width="497" Margin="10,37,0,0" RenderTransformOrigin="0.358,0.48" SelectionChanged="MyTextBox_SelectionChanged">
            <FlowDocument>
                <Paragraph>
                    <Run Text="RichTextBox"/>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>

    </Grid>
</Window>

編集2:デバッグ中に行ったことの簡単な説明は次のとおりです。

  1. MyTextBox_SelectionChangedに 1 つ、に 1 つの 2 つのデバッグ ポイントがありますFontSize_SelectionChanged
  2. フォント サイズを変更するときは、F5 をクリックして続行します。
  3. テキストの別の部分 (デフォルト サイズ) をクリックすると、MyTextBox_SelectionChangedが呼び出されます。はSelection.Text空です。
  4. その後、再び続行し、 への呼び出しで停止しFontSize_SelectionChangedます。しかし、まだSelection.Text空ですが、私の古い選択「リッチ」は古いフォントサイズに戻ります。

編集 3:この問題は、Sams Teach Yourself WPF in 2008 年 7 月の最初の印刷、135 ページ、「テキスト エディターを期待どおりに機能させる」、項目 9 で言及されています。その特定の問題。

4

2 に答える 2

3

クリックして選択をクリアすると、TextBox.SelectionChangedイベント ハンドラ ( MyTextBox_SelectionChanged) が呼び出され、 がSelection空の選択 (つまり、挿入ポイント) を表すように見えます。ハンドラーはSelectedValue、空の選択のフォント サイズを使用して、コンボ ボックスの を設定します。これは、選択が空の場合でも、完全に合理的なことです。(挿入ポイントにはまだフォント サイズがあります。)

SelectedValueもちろんを変更すると、ComboBox.Selectionイベント ハンドラ ( FontSize_SelectionChanged) が実行されます。また、そのイベント ハンドラーには、ユーザーが新しい値を選択したことによって発生したイベントと、コードがプロパティを変更したことによって発生したイベントを区別する簡単な方法がないため、SelectedValue先に進み、選択範囲のフォント サイズを変更しようとします。この特定のケースではやりたくありません。

それでも、選択範囲が空で、フォント サイズを既存のフォント サイズに設定しようとしているだけなので、問題ないと思うでしょう。しかし、奇妙なことApplyPropertyValueに、この空の選択を呼び出すとFontSize、ドキュメント全体に が設定されているように見えます。

したがって、クリックして選択を解除すると、コードはドキュメント全体のフォント サイズを、クリックした場所のフォント サイズに設定します。

ApplyPropertyValue最初に選択したテキストが最初の文字から左から右にドラッグして選択された場合にのみ発生するため、これは のバグであると思われます。もう一度言いますが、空の選択範囲に書式設定を適用した場合の動作がどうなるかは完全には明確ではありません。したがって、おそらくこれは、WPF の明確なバグに遭遇するというよりも、未定義の動作を呼び出すケースにすぎません。

いずれにせよ、これを修正する合理的な方法は、コンボ ボックスの変更ハンドラを変更することです。

if (FontSize.SelectedItem != null && !MyTextBox.Selection.IsEmpty)
{
    MyTextBox.Selection.ApplyPropertyValue(
        TextBlock.FontSizeProperty, FontSize.SelectedItem);
}

これは、選択範囲が空でない場合にのみ、選択範囲のフォント サイズを変更しようとします。

于 2013-04-01T14:32:13.080 に答える
0

テキストを選択し、メニューでサイズを変更すると、選択が表示されなくなってもコードは選択されたままになります。コードを選択すると、MyTextBoxSelection が変更される前に SelectionChanged メソッドが起動します (推測/信じてください、私はかつてそのような問題を抱えていたと思います)。Fontsize を変更すると、更新されていない Selection にアクセスする Fontsize メソッドが起動し、最後の変更が無効になります。

于 2013-03-30T10:41:28.860 に答える