1. ホーム
  2. c#

[解決済み] Windows Phone 7エミュレータでTextBox.TextChangedイベントが2回発生する。

2023-03-06 05:23:29

質問

Windows Phone 7 で遊ぶための、非常に簡単なテスト アプリがあります。私はちょうど TextBoxTextBlock を標準のUIテンプレートに追加します。カスタムコードは以下のものだけです。

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private int counter = 0;

    private void TextBoxChanged(object sender, TextChangedEventArgs e)
    {
        textBlock1.Text += "Text changed " + (counter++) + "\r\n";
    }
}

TextBox.TextChanged イベントは TextBoxChanged に配線されています。

<TextBox Height="72" HorizontalAlignment="Left" Margin="6,37,0,0"
         Name="textBox1" Text="" VerticalAlignment="Top"
         Width="460" TextChanged="TextBoxChanged" />

しかし、エミュレータで実行中にキーを押すたびに (画面上のキーボードでも物理キーボードでも、後者を有効にするためにポーズを押して) カウンタが 2 回増分し、2 行が TextBlock . 私が試したすべてが、イベントが純粋に2回発生していることを示し、私はその理由がわかりません。私は、それが一度だけ登録されていることを確認しました。 MainPage コンストラクタで登録を解除すると、テキストが変更されたときに (テキスト ブロックに) 何も起こりません。

私は通常の Silverlight アプリで同等のコードを試しましたが、そこでは発生しませんでした。今のところ、これを再現するための物理的な電話機は持っていません。Windows Phone 7 では、これが既知の問題であるという記録は見つかりませんでした。

どなたか、何が間違っているのか説明していただけませんか、それともこれをバグとして報告すべきでしょうか。

編集: テキストコントロールが 2 つあることが原因である可能性を減らすために、私は TextBlock を完全に削除し、TextBoxChanged メソッドを に変更してみました。 インクリメント counter . その後、エミュレータで実行し、10文字を入力し と表示されます。 にブレークポイントを置く。 counter++; 行にブレークポイントを設定します (デバッガに侵入することが問題を引き起こしている可能性を排除するためです)。 counter を 20 と表示します。

編集:私は今 を Windows Phone 7 フォーラムで尋ねました。 ... 何が起こるか見てみます。

どのように解決するのですか?

の理由は TextChanged イベントが 2 回発生するのは、WP7 では TextBox が Metro の外観のためにテンプレート化された副作用です。

を編集すると TextBox テンプレートをBlendで編集すると、このテンプレートに副次的な TextBox が含まれていることがわかります。これにより、副作用としてイベントが2回発生することになります。

テンプレートを変更することで、余分な TextBox (および関連する状態) を削除するか、あるいは、無効/読み取り専用状態で別の外観を実現するためにテンプレートを変更し、二次的な TextBox .

これで、イベントは一度だけ発生するようになります。