none
TableCell内のRunオブジェクトのテキスト色を一部変更する方法 RRS feed

  • 質問

  • お世話になります。

    わからないことがありますので質問させてください。(VS2012Pro)

    FlowDocumentで、Tableを利用し、セルにRunを配置して表を作っております。

    表の文字の一部の色を変えたいと思い、Run.TextEffectを利用したのですが、

    TableCell内では、なぜか色が変わりませんでした。

    TextBlockで囲ってやると、きちんと色は変わるのですが、クリップボードが利用できなくなってしまいます。

    また、TableCellの外では色が変わりました。

    どのようにすればTableCell内で、クリップボードを利用できる状態で、

    Runオブジェクトの文字色を一部変えることができるのでしょうか?

     
    <Window x:Class="WpfSampleApplication.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="400" Width="500">
    
    
            <FlowDocument>
            <!-- FlowDocumentの直下で、TextEffectsは動作する -->
            <Paragraph>
                <Run Text="12345678">
                    <Run.TextEffects>
                        <TextEffect PositionStart="1" PositionCount="3" Foreground="Red" />
                    </Run.TextEffects>
                </Run>
            </Paragraph>
    
            <Table>
    
                <Table.Columns>
                    <TableColumn/>
                    <TableColumn/>
                </Table.Columns>
    
                <TableRowGroup>
                    <TableRow Background="lightgray">
                        <!-- TableCellの前にTextBlockをつけるとTextEffectsは動作する -->
                        <TableCell>
                            <Paragraph >
                                <TextBlock>                            
                                    <Run Text="12345678">
                                        <Run.TextEffects>
                                            <TextEffect PositionStart="1" PositionCount="3" Foreground="Red" />
                                        </Run.TextEffects>
                                    </Run>
                                </TextBlock>
                            </Paragraph>
                        </TableCell>
                        
                        <!-- TableCellのなかにあるRunはTextEffectsが動作しない -->
                        <TableCell>
                            <Paragraph>
                                <Run Text="12345678">
                                    <Run.TextEffects>
                                        <TextEffect PositionStart="1" PositionCount="3" Foreground="Red" />
                                    </Run.TextEffects>
                                </Run>
                            </Paragraph>
                        </TableCell>                    
                    </TableRow>
                </TableRowGroup>
            </Table>
        </FlowDocument>
    </Window>

    2014年2月19日 10:14

回答

  • PositionStartはParagraphのようなBlockの始まり(終わり)なども位置として数える必要があるようです。
    TextBlock内ではTextBlock内で完結しているのでRunの先頭から文字数を数えるだけで済みます。
    #このことが書かれている資料は見つかりませんでした。

    PositionStartの数え方と基準位置が判り難いので判り易くしてみる。

    <FlowDocument>
        <!--0--><Paragraph>
            <!--1--><Run Text="0123456789">
                <Run.TextEffects>
                    <TextEffect PositionStart="3" PositionCount="3" Foreground="Red" />
                </Run.TextEffects>
            <!--12--></Run>
        <!--13--></Paragraph>
    
        <!--14--><Table>
    
            <Table.Columns>
                <TableColumn/>
                <TableColumn/>
            </Table.Columns>
    
            <!--15--><TableRowGroup>
                <!--16--><TableRow Background="lightgray">
                    <!--17--><TableCell>
                        <!--18--><Paragraph >
                            <!-- TextBlockが混ざると数え難いのでコメントアウト-->
                            <!--<TextBlock>                            
                                <Run Text="0123456789" >
                                    <Run.TextEffects>
                                        <TextEffect PositionStart="1" PositionCount="3" Foreground="Red" />
                                    </Run.TextEffects>
                                </Run>
                            </TextBlock>-->
                        <!--19--></Paragraph>
                    <!--20--></TableCell>
    
                    <!--21--><TableCell>
                        <!--22--><Paragraph>
                            <!--23--><Run Text="0123456789">
                                <Run.TextEffects>
                                    <TextEffect PositionStart="30" PositionCount="2" Foreground="Green" />
                                </Run.TextEffects>
                            <!--34--></Run>
                        <!--35--></Paragraph>
                    <!--36--></TableCell>
                <!--37--></TableRow>
            <!--38--></TableRowGroup>
        <!--39--></Table><!--40-->
    </FlowDocument>


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 編集済み gekkaMVP 2014年2月19日 14:26
    • 回答としてマーク sasagaki 2014年2月19日 23:48
    2014年2月19日 14:21

すべての返信

  • PositionStartはParagraphのようなBlockの始まり(終わり)なども位置として数える必要があるようです。
    TextBlock内ではTextBlock内で完結しているのでRunの先頭から文字数を数えるだけで済みます。
    #このことが書かれている資料は見つかりませんでした。

    PositionStartの数え方と基準位置が判り難いので判り易くしてみる。

    <FlowDocument>
        <!--0--><Paragraph>
            <!--1--><Run Text="0123456789">
                <Run.TextEffects>
                    <TextEffect PositionStart="3" PositionCount="3" Foreground="Red" />
                </Run.TextEffects>
            <!--12--></Run>
        <!--13--></Paragraph>
    
        <!--14--><Table>
    
            <Table.Columns>
                <TableColumn/>
                <TableColumn/>
            </Table.Columns>
    
            <!--15--><TableRowGroup>
                <!--16--><TableRow Background="lightgray">
                    <!--17--><TableCell>
                        <!--18--><Paragraph >
                            <!-- TextBlockが混ざると数え難いのでコメントアウト-->
                            <!--<TextBlock>                            
                                <Run Text="0123456789" >
                                    <Run.TextEffects>
                                        <TextEffect PositionStart="1" PositionCount="3" Foreground="Red" />
                                    </Run.TextEffects>
                                </Run>
                            </TextBlock>-->
                        <!--19--></Paragraph>
                    <!--20--></TableCell>
    
                    <!--21--><TableCell>
                        <!--22--><Paragraph>
                            <!--23--><Run Text="0123456789">
                                <Run.TextEffects>
                                    <TextEffect PositionStart="30" PositionCount="2" Foreground="Green" />
                                </Run.TextEffects>
                            <!--34--></Run>
                        <!--35--></Paragraph>
                    <!--36--></TableCell>
                <!--37--></TableRow>
            <!--38--></TableRowGroup>
        <!--39--></Table><!--40-->
    </FlowDocument>


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 編集済み gekkaMVP 2014年2月19日 14:26
    • 回答としてマーク sasagaki 2014年2月19日 23:48
    2014年2月19日 14:21
  • gekka様

     ご回答ありがとうございました。

     また、丁寧にソースにカウント番号を記載頂きありがとうございました。

     このような仕様だとは知りませんでした。

     改めて見返してみれば、

     同じ条件で文字色を変えていたのに、

     Tableの外で色を変えた文字が2文字しか赤くなっていないのに、

     TextBlock内の文字が3文字赤くなっているのもおかしかったです。

     ご回答ありがとうございました。


    • 編集済み sasagaki 2014年2月19日 23:50
    2014年2月19日 23:48