6

En un previous question estaba intentando averiguar cómo vincular un ObservableCollection a un control para poder ver todas las cadenas y seleccionar todas las cadenas y copiarlas desde el control de contenido. Las respuestas a esa pregunta finalmente me dieron la apariencia (y aparentemente el comportamiento) que quería usando el siguiente XAML. (He intentado tanto un FlowDocumentReader y FlowDocumentScrollViewer - se comportan de la misma.)¿Por qué no puedo pegar texto copiado desde WPF FlowDocumentScrollViewer o Reader?

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

ErrorMessages es mi propiedad modelo de vista que devuelve un ObservableCollection < cadena>. Se une correctamente al ItemsSource y el < Ejecutar> elemento se une a cada cadena de la colección. Se ve bien, dura mucho tiempo. Esto estuvo tan cerca que marqué mi última pregunta como respondida, pero todavía tengo un problema.

botón derecho del ratón y un menú aparece con la Seleccionar Todos y opciones de copia. Utilizando Seleccionar todo, de hecho resaltar todo el texto, seleccionando Copia no hay errores, pero cuando voy a Bloc de notas (o Word, o TextPad etc. o un RTB en el formulario) y trato de pegar el texto, nada aparece alguna vez Como recién llegado a WPF, sospecho que estoy haciendo algo mal, pero no sé qué es. No existe el texto "sin sentido".

[Editar -junio 22 2011] Por otras razones he cambiado el código para usar un bloque de texto a través de una plantilla de elemento dentro de ItemsControl como se muestra a continuación, pero todavía no puedo copiar y pegar.

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

Puede inspeccionar el portapapeles (hay una clase ['Clipboard'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.aspx) en .Net) justo después * Copiar * y comprobar si contiene texto y qué otros tipos de datos se copiaron. –

+0

OK - Cuando capturo GetFormats(), muestra Xaml, ApplicationTrust, Text, UnicodeText, System.String, Rich Text Format. Cuando compruebo GetDataPresent (DataFormats.Text) y me aparece, aparece el mensaje "Got Text:" seguido del texto real del portapapeles en una variable clip_text seguido del clip_text.Length() Got Text: 4 donde no había nada entre Tengo texto: y el 4 estaba en la siguiente línea. ¿Qué significa eso? 4 caracteres no visualizables, uno de los cuales es una nueva línea?Los datos reales seleccionados y copiados fueron las tres cadenas Fake Error 1 Fake Error 2 Se agregó manualmente en InstrumentViewModel. – Tod

Respuesta

3

<Run> elemento se une a cada cadena en la colección.

Solo debe enlazar al elemento actual si acaso.

De todos modos, su documento, de hecho, no contiene ningún texto si todo lo que tiene es ItemsControl. ¿Por qué? Porque los elementos UIE dentro del documento se envuelven automáticamente en un BlockUIContainer o InlineUIContainer y ya no se consideran texto.

En general el contenido se copia como XAML, RTF, UnicodeText & texto (que pude observar esos, pero puede haber otros formatos), se puede tratar de colocar un poco de Runs en el documento, el texto debe ser copiada correctamente y Clipboard.GetText() debe devolver sus contenidos.

+0

No entiendo, cuando dice "su documento, de hecho, no contiene ningún texto". Parece que tiene texto. Puedo verlo y puedo seleccionarlo. En caso de que no lo hayas notado en la segunda iteración utilicé un TextBlock pero el comportamiento fue el mismo. De todos modos, no estoy seguro de lo que sugieres que haga. Originalmente tenía un y eso no funcionó. ¿Cómo va a ayudar a colocar más Runs? Tengo un número potencialmente cambiante de mensajes y quiero mostrarlos (trabajando como se muestra) pero también quiero copiarlos al portapapeles. ¿Qué debería cambiar? – Tod

+1

De alguna manera su mensaje se perdió en mi bandeja de entrada. De todos modos, TextBlocks tampoco son texto, también son UIElements que se envuelven en contenedores y no se tratan como texto. Te sugiero que tomes un enfoque completamente diferente a esto, como concatenar las cadenas como sugerí en [mi respuesta a tu pregunta anterior] (http://stackoverflow.com/posts/6339441/edit), luego puedes usar un ' Ejecutar' para mostrar ese texto. –

+0

Además, incluso si los elementos de ItemsControl fueran [contenido de flujo] (http://msdn.microsoft.com/en-us/library/ms753113.aspx) (lo cual no es posible), aún tendría el propio ItemsControl que estaría envuelto en un contenedor haciendo que esos esfuerzos no tengan sentido. –

Cuestiones relacionadas