1

VS2012 が Windows ストア アプリの Common フォルダーに挿入する RichTextColumns コントロールを使用して、RichTextBlock のテキストを複数の列に表示しています。テキストは、段落、ラン、およびスパンでマークアップできる節に分割されています。

ユーザーがどの節 (またはテキストのセクション) をタップしたかを特定して、節をマーク (背景色の変更) し、アプリがその特定の節にリンクされているメディアを読み込めるようにする必要があります。

デスクトップ アプリでは、Run クラスから継承し、VerseIndex プロパティを挿入することができました。次に、Click イベントをキャッチし、x、y 座標を使用して、その境界内にある Run を見つけました。WinRt では Run クラスが封印されているため、そこから継承することはできず、配置に使用した他の呼び出しの一部も欠落しています。

タップされた詩を特定し、そのデータに反応するには、どの方法を使用できますか (ユーザーの強調表示とカット/ペーストに必要なテキスト選択以外に)?

これは、私が使用している RichTextColumns 表示の例です。

    <ScrollViewer x:Name="ChapterScrollViewer" Margin="0,0,0,40"
                  Style="{StaticResource HorizontalScrollViewerStyle}" Background="White" >
        <StackPanel Orientation="Horizontal" Margin="0,0,20,20" >
            <common:RichTextColumns x:Name="richTextColumnsChapter" VerticalAlignment="Top">
                <common:RichTextColumns.ColumnTemplate>
                    <DataTemplate>
                        <RichTextBlockOverflow Width="400" Margin="50,0,0,0"/>
                    </DataTemplate>
                </common:RichTextColumns.ColumnTemplate>
                <RichTextBlock x:Name="mainRichTextBlockChapter" Margin="0,0,0,0" 
                               IsTextSelectionEnabled="True" 
                               IsTapEnabled="True"
                               FontWeight="Light" Width="400" Foreground="Black" VerticalAlignment="Top" FontSize="20">
                    <Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat</Paragraph>

                </RichTextBlock>
            </common:RichTextColumns>
        </StackPanel>
    </ScrollViewer>
4

1 に答える 1

0

よくあることですが、時間をかけて問題を説明することで、考えられる解決策を新たに見直すことができる場合があります。これが私が理解したものです。うまくいけば、これは他の人を助けるでしょう。

Run クラスは封印されていますが、Span クラスは封印されていません。VerseIndex プロパティを含む Span から継承した独自の DocVerse クラスを追加しました。

私のビューでは、RichTextColumns コントロールの Tapped イベントを処理し、GetPosition を使用して、タップされた正しい Run を特定できます。次に、DocVerse クラスを検索して、どのクラスにその Run が含まれているかを確認し、Tapped の「詩」を取得できます。

GetPositionFromPoint 呼び出しに関連する RichTextColumns クラスに問題があります。最初の列は RichTextBlock で表され、次のオーバーフロー列は RichTextBlockOverflow コントロールです。Tapped の「詩」を見つけて FontWeight を変更する Tapped ハンドラを次に示します。

    private void RichTextColumns_Tapped(object sender, TappedRoutedEventArgs e)
    {
        RichTextColumns control = sender as RichTextColumns;

        Point pTapped = e.GetPosition(e.OriginalSource as UIElement);
        TextPointer tp = null;

        if (e.OriginalSource is RichTextBlock) // tapped in the 1st column
        {
            tp = control.RichTextContent.GetPositionFromPoint(pTapped);
        }
        else if (e.OriginalSource is RichTextBlockOverflow) // tapped in an overflow column
        {
            tp = (e.OriginalSource as RichTextBlockOverflow).GetPositionFromPoint(pTapped);
        }

        if (tp != null)
        {
            // find out which DocVerse (inherits from Span) contains the Run that was tapped
            Run r = tp.Parent as Run;
            foreach (DocVerse v in control.Verses)
            { 
                if (v.Inlines.Contains(r))
                {
                    v.FontWeight = FontWeights.Bold;
                    Debug.WriteLine(v.VerseIndex);
                }
            }
        }
    }
于 2013-06-03T12:32:09.393 に答える