6

前の質問で、ObservableCollection をコントロールにバインドして、すべての文字列を表示し、すべての文字列を選択してコンテンツ コントロールからコピーできるようにする方法を見つけようとしていました。その質問への回答により、次の XAML を使用して、最終的に私が望んでいた外観 (および一見動作) が得られました。(私は FlowDocumentReader と FlowDocumentScrollViewer の両方を試しました - それらは同じように動作します。)

<Grid>
<FlowDocumentScrollViewer>
    <FlowDocument >
        <Paragraph>
            <ItemsControl ItemsSource="{Binding ErrorMessages, Mode=OneWay}" />
            <Run Text="{Binding /, Mode=OneWay}" />
        </Paragraph>
    </FlowDocument>
</FlowDocumentScrollViewer>
</Grid>

ErrorMessagesは、ObservableCollection<string>を返す ViewModel プロパティです。これはItemsSourceに適切にバインドされ、<Run>要素はコレクション内の各文字列にバインドされます。見栄えがよく、長持ちします。これは非常に近かったので、最後の質問に回答済みのマークを付けましたが、まだ問題が 1 つあります。

右クリックすると、[すべて選択]と[コピー]オプションのメニューが表示されます。Select Allを使用すると、実際にすべてのテキストが強調表示され、Copyを選択してもエラーは発生しませんが、メモ帳 (または Word、TextPad など、またはフォーム上の RTB) に移動してテキストを貼り付けようとしても、何も表示されません。WPF の初心者として、私は何か間違ったことをしているのではないかと疑っていますが、それが何であるかはわかりません。「見栄えの悪い」テキストはありませんか?

[編集 - 2011 年 6 月 22 日] 他の理由で、以下に示すように、ItemsControl 内の ItemTemplate を介して TextBlock を使用するようにコードを変更しましたが、まだコピー アンド ペーストできません。

<DataTemplate x:Key="StringCollection">
   <TextBlock TextWrapping="Wrap" Text="{Binding}" TextAlignment="Left"/>
</DataTemplate>
<!--... now down in the ItemsControl-->
<ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}"
      ItemTemplate="{StaticResource StringCollection}" />
4

1 に答える 1

3

<Run>要素は、コレクション内の各文字列にバインドされます。

どちらかといえば、現在の要素にのみバインドする必要があります。

とにかく、ItemsControlしかない場合、ドキュメントには実際にはテキストがまったく含まれていません。なんで?ドキュメント内のUIElementは自動的にBlockUIContainerまたはでラップされ、InlineUIContainerテキストとは見なされなくなるためです。

一般に、コンテンツはXAML、RTF、UnicodeText、およびテキストとしてコピーされます(これらを観察できますが、他の形式もある可能性があります)Runs。ドキュメントにいくつか配置してみてください。テキストは適切にコピーされClipboard.GetText()、コンテンツが返されます。

于 2011-06-26T13:35:30.240 に答える