Почему я не могу вставить текст, скопированный из WPF FlowDocumentScrollViewer или Reader? - PullRequest
6 голосов
/ 15 июня 2011

В предыдущем вопросе я пытался выяснить, как привязать ObservableCollection к элементу управления, чтобы я мог видеть все строки, выбирать все строки и копировать их из элемента управления контентом.Ответы на этот вопрос в конечном итоге дали мне тот вид (и, казалось бы, поведение), который я хотел получить, используя следующий XAML.(Я пробовал и FlowDocumentReader и FlowDocumentScrollViewer - они ведут себя одинаково.)

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

ErrorMessages - это мое свойство ViewModel, которое возвращает ObservableCollection .Он правильно связывается с ItemsSource , а элемент связывается с каждой строкой в ​​коллекции.Выглядит хорошо, длится долго.Это было так близко, что я пометил свой последний вопрос как ответ, но у меня все еще есть одна проблема.

Я щелкаю правой кнопкой мыши, и появляется меню с параметрами Выбрать все и Копировать .Использование Выбрать все действительно выделяет весь текст, выбор Копировать не вызывает ошибок, но когда я иду в Блокнот (или Word, или TextPad и т. Д. Или RTB в форме)и попробуйте вставить текст, ничего не появляется.Как новичок в WPF, я подозреваю, что я делаю что-то не так, но я не знаю, что это такое.Там нет такого понятия, как «безгласный» текст?

[Edit -June 22 2011] По другим причинам я изменил код для использования TextBlock через ItemTemplate внутри ItemsControl, как показано ниже, но явсе еще не может скопировать и вставить.

<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}" />

1 Ответ

3 голосов
/ 26 июня 2011

<Run> элемент привязывается к каждой строке в коллекции.

Он должен связываться только с текущим элементом, если он есть.

В любом случае, ваш документ на самом деле не содержит никакого текста, если у вас есть только ItemsControl. Зачем? Поскольку все элементы UIE внутри документа автоматически переносятся в BlockUIContainer или InlineUIContainer и больше не считаются текстовыми.

Как правило, содержимое копируется в формате XAML, RTF, UnicodeText & Text (я мог бы наблюдать их, но могут быть и другие форматы), вы можете попытаться поместить некоторые Runs в документ, их текст должен быть скопирован правильно и Clipboard.GetText() должен вернуть их содержимое.

...