2

長年のリスナー、初めての発信者。WinRT C#/XAML の TextBox で奇妙な問題が発生しています。誰かが私を助けてくれることを願っています。

基本的に、同じ Text を表示したり、同じ Selected Text を表示したりするなど、2番目の TextBox を最初のコピーにする必要があるカスタムコントロールの作成に取り組んでいます。明らかに、Text 要件については、最初の TextBox の TextChanged イベントに応答し、2 番目の TextBox の Text を最初の TextBox の Text に設定するだけで、うまく機能します。

選択したテキストの要件については、同様のソリューションから始めました。このためのコードは次のとおりです。

    void TextBox1_SelectionChanged(object sender, RoutedEventArgs e)
    {
        this.TextBox2.Select(this.TextBox1.SelectionStart, this.TextBox1.SelectionLength);
    }

マウスで最初に使用したとき、これはかなりうまくいくように見えました:

マウスを使用したスクリーン キャップ

しかし、 Touchでテキストを選択するときに問題が発生します。Touch の場合と同様に、TextBox 内をダブルタップして最初の「アンカー」を作成し、ドラッグして選択を開始します。しかし、選択が停止する前に、通常は1文字しか選択できません。TextBox は正確にフォーカスを失うわけではありませんが、動作はそれに似ています。選択アンカーが消え、もう一度ダブルタップして新しい選択を開始しない限り、何も選択し続けることができません。TextBox2 でテキストを選択するコードを削除すると、TextBox1 でタッチ選択が完全に動作します。

私はしばらくこれを修正しようとしてきましたが、WinRT TextBoxes で目的の動作を得ることができるかどうかわかりません。誰にもアイデアはありますか?または、この動作で 2 つの TextBoxes を使用してソリューションを実装する別の方法でしょうか?

どうもありがとう。

4

2 に答える 2

0

したがって、これは答えにはほど遠いですが、あなたや他の人が潜在的な回避策を考え出すのに役立つかもしれないいくつかのことを発見しました. これらがあなたがすでに見たり指摘したりしたものである場合は、お詫び申し上げます。

まず、それ自体が問題なのは TextBox2.Select() の呼び出しではありません。たとえば、これは私にとってはうまくいきます

    private void txt1_SelectionChanged(object sender, RoutedEventArgs e)
    {
        var start =  TextBox1.SelectionStart;
        var length = TextBox1.SelectionLength;
        TextBox2.Select(3, 5);
    }

残念ながら、ハードコードされた 3 および 5startlength比較して、次のように使用しても機能しません。

    private void txt1_SelectionChanged(object sender, RoutedEventArgs e)
    {
        var start =  TextBox1.SelectionStart;
        var length = TextBox1.SelectionLength;
        TextBox2.Select(start, length);
    }

また、最後から開始すると 2 つの文字を選択できることもわかりましたが、最初からは 1 つしか選択できませんでした。そのため、2 番目の選択を設定するための呼び出しをディスパッチすることを考えました。

    private void txt1_SelectionChanged(object sender, RoutedEventArgs e)
    {
        var start =  TextBox1.SelectionStart;
        var length = TextBox1.SelectionLength;
        Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, 
            () => TextBox2.Select(start, length));
    }

これで、前から 2 つ、後ろから 3 つ、場合によっては 4 つを選択できます。さらに一歩進んで、非常に速いスワイプで 6 つまたは 7 つまで選択できるようになりました。

    private void txt1_SelectionChanged(object sender, RoutedEventArgs e)
    {
        var start =  TextBox1.SelectionStart;
        var length = TextBox1.SelectionLength;
        Dispatcher.RunIdleAsync((v) => Highlight());
    }

    public void Highlight()
    {
        TextBox2.Select(TextBox1.SelectionStart, TextBox1.SelectionLength);
    }

これを回避する秘訣は、TextBox1 の SelectionChanged イベントの痕跡が完了するまで TextBox2 を設定しないことです。

これはConnectに登録する価値があるかもしれません。

于 2013-04-11T06:49:01.723 に答える