Почему я не могу вставить текст, скопированный из WPF FlowDocumentScrollViewer или Reader?

В предыдущем вопросе я пытался выяснить, как привязать 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 ‹string>. Он правильно привязывается к ItemsSource, а элемент ‹Run> привязывается к каждой строке в коллекции. Хорошо смотрится, долго держится. Это было так близко, что я пометил свой последний вопрос как ответ, но у меня все еще есть одна проблема.

Я щелкаю правой кнопкой мыши, и появляется меню с параметрами Выбрать все и Копировать. Использование Выбрать все действительно выделяет весь текст, выбор Копировать не вызывает ошибок, но когда я перехожу в Блокнот (или Word, или TextPad и т. Д., Или RTB на form) и попробуйте вставить текст, ничего не появляется. Как новичок в 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}" />

comment
Вы можете проверить буфер обмена (есть _1 _ в .Net) сразу после Copy и проверьте, содержит ли он текст и какие другие типы данных были скопированы.   -  person DK.    schedule 15.06.2011
comment
ОК - когда я захватываю GetFormats (), он показывает Xaml, ApplicationTrust, Text, UnicodeText, System.String, Rich Text Format. Когда я проверяю GetDataPresent (DataFormats.Text), и он проходит, я отображал Got Text: с последующим фактическим текстом из буфера обмена в переменной clip_text, за которым следует clip_text.Length () Got Text: 4, где ничего не было между Got Text: и 4 был на следующей строчке. Что это означает? 4 неотображаемых символа, один из которых - новая строка? Фактически выбранными и скопированными данными были три строки Fake Error 1 Fake Error 2, вручную добавленные в InstrumentViewModel.   -  person Tod    schedule 15.06.2011


Ответы (1)


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

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

В любом случае, ваш документ на самом деле вообще не содержит текста, если все, что у вас есть, - это ItemsControl. Почему? Поскольку любые элементы UIElements внутри документа автоматически заключаются в BlockUIContainer < / a> или InlineUIContainer и больше не являются считается текстом.

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

person H.B.    schedule 26.06.2011
comment
Я не понимаю, когда вы говорите, что ваш документ вообще не содержит текста. Похоже, там есть текст. Я это вижу и могу выбрать. Если вы не заметили во второй итерации, я использовал TextBlock, но поведение было таким же. Несмотря на это, я не уверен, что вы предлагаете мне сделать. Изначально у меня был ‹Run›, но он не работал. Как может помочь выполнение большего количества пробежек? У меня есть потенциально изменяющееся количество сообщений, и я хочу отображать их (работая, как показано), но я также хочу скопировать их в буфер обмена. Что мне изменить? - person Tod; 27.06.2011
comment
Как-то ваше сообщение потерялось в моем почтовом ящике. В любом случае, TextBlocks - это тоже не текст, это также UIElements, которые обертываются в контейнеры и не обрабатываются как текст. Я предлагаю вам использовать совершенно другой подход к этому, например, объединить строки, как я предлагал в моем ответе на ваш предыдущий вопрос, тогда вы можете использовать один Run для отображения этого текста. - person H.B.; 30.06.2011
comment
Кроме того, даже если элементы ItemsControl были потоковым контентом (который невозможно), у вас все равно будет сам ItemsControl, который будет заключен в контейнер, что сделает эти усилия бессмысленными. - person H.B.; 30.06.2011
comment
Хорошо спасибо. Думаю, теперь я понимаю, позвольте мне перефразировать и посмотреть, согласны ли вы. Я должен заменить то, что находится внутри моего элемента ‹Paragraph›, одним элементом ‹Run›. Затем я должен написать конвертер для преобразования моей ObservableCollection ‹string› в один текстовый элемент (надеюсь, с переводом строки - чтобы сохранить текущий вид) и поместить результаты в этот элемент ‹Run›. Тогда я получу такой же вид, НО добавлю возможность копировать то, что есть. Правильный? - person Tod; 30.06.2011
comment
@Tod: Звучит правильно, да. Могут быть и другие способы, но это один из самых простых. Вы также можете подключиться к команде копирования и вручную скопировать сообщения в буфер обмена. - person H.B.; 30.06.2011