Tamaño de marcado XAML excesivo en Silverlight RichTextBox

Tengo un control RichTextBox muy simple en una aplicación Silverlight 5.

<RichTextBox x:Name="rtbControl" 
    Height="Auto" 
    ContentChanged="rtbControl_ContentChanged" />

A medida que se modifican los datos, los capturo en una variable local de la siguiente manera:

    private void rtbControl_ContentChanged(object sender, ContentChangedEventArgs e)
    {
        RichTextContent = rtbControl.Xaml;
    }

Todos los trabajos. Sin embargo, si escribo unas pocas palabras y examino el <Paragraph> marcado, es ENORME! Un fragmento está debajo. ¿Hay alguna manera de no tener todas las cosas de tipografía en el marcado? ¿Por qué está ahí y es necesario? ¿Hay un modo de quitarlo?

<Section xml:space="preserve" HasTrailingParagraphBreakOnPaste="False" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Paragraph FontSize="11" FontFamily="Segoe UI" Foreground="#FF000000" FontWeight="Normal" FontStyle="Normal" FontStretch="Normal" 
CharacterSpacing="0" Typography.AnnotationAlternates="0" Typography.EastAsianExpertForms="False" Typography.EastAsianLanguage="Normal" 
Typography.EastAsianWidths="Normal" Typography.StandardLigatures="True" Typography.ContextualLigatures="True" 
Typography.DiscretionaryLigatures="False" Typography.HistoricalLigatures="False" Typography.StandardSwashes="0" Typography.ContextualSwashes="0" 
Typography.ContextualAlternates="True" Typography.StylisticAlternates="0" Typography.StylisticSet1="False" Typography.StylisticSet2="False"
 Typography.StylisticSet3="False" Typography.StylisticSet4="False" Typography.StylisticSet5="False" Typography.StylisticSet6="False" Typography.StylisticSet7="False" 
Typography.StylisticSet8="False" Typography.StylisticSet9="False" Typography.StylisticSet10="False" Typography.StylisticSet11="False" 
Typography.StylisticSet12="False" Typography.StylisticSet13="False" Typography.StylisticSet14="False" Typography.StylisticSet15="False" 
Typography.StylisticSet16="False" Typography.StylisticSet17="False" Typography.StylisticSet18="False" Typography.StylisticSet19="False" 
Typography.StylisticSet20="False" Typography.Capitals="Normal" Typography.CapitalSpacing="False" Typography.Kerning="True" Typography.CaseSensitiveForms="False" 
Typography.HistoricalForms="False" Typography.Fraction="Normal" Typography.NumeralStyle="Normal" Typography.NumeralAlignment="Normal" Typography.SlashedZero="False"
 Typography.MathematicalGreek="False" Typography.Variants="Normal" TextOptions.TextHintingMode="Fixed" TextOptions.TextFormattingMode="Ideal" 
TextOptions.TextRenderingMode="Auto" TextAlignment="Left" LineHeight="0" LineStackingStrategy="MaxHeight"><Run>was it a </Run><Run TextDecorations="Underline">bad 
</Run><Run>blah? or </Run></Paragraph></section>

preguntado el 03 de mayo de 12 a las 15:05

Ouah, eso es grande :( Creo que es necesario para la persistencia para garantizar que obtenga el formato exacto. -

¿Que estás tratando de hacer? ¿Tal vez pueda usar el Texto o las propiedades del texto seleccionado? Mira esto msdn.microsoft.com/fr-fr/library/ff426926%28v=vs.95%29.aspx muestra oficial. -

Estoy dando a los usuarios la capacidad de crear partes de un documento y necesito darles capacidades de formato de texto enriquecido. La entrada de los usuarios se envía a una base de datos. Necesito capturar cualquier formato que hagan. Tal como está ahora, el usuario puede escribir 4 palabras en 3 líneas y ya tiene más de 4000 caracteres de texto. -

Bueno, veo dos formas de reducir el tamaño de las cosas: compresión y análisis del XML para eliminar todos los atributos predeterminados de Paragraph & co. -

Pero no veo una solución integrada, lo siento. -

1 Respuestas

Pensé en compartir mi solución para ayudar a otros... ha estado funcionando durante varios meses y no he visto ningún efecto secundario negativo.

Creé algunos métodos de extensión para ayudar a eliminar los atributos de tipografía.

public static class RichTextBoxExtensions {
        // <summary>
        /// Removes any xml tag with the prefix given from a string
        /// </summary>
        /// <param name="XMLString"></param>
        /// <param name="TagPrefix"></param>
        /// <returns></returns>
        public static string RemoveXMLAttributesFromNode(this string XMLString, string prefix)
        {
            //Match [Prefix][any number of Not =][=]["][any number of Not "]["][ ] <-must have space!!!
            string replace = prefix + "[^\\=]*=\"[^\"]*\" ";
            return Regex.Replace(XMLString, replace, string.Empty);
        }
        /// <summary>
        /// Removes any xml tag with prefixed by an element in unWanted
        /// </summary>
        /// <param name="XMLString"></param>
        /// <param name="TagPrefix"></param>
        /// <returns></returns>
        public static string RemoveXMLAttributesFromNode(this string XMLString, List<string> unWanted)
        {

            foreach (string prefix in unWanted)
            {
                //Match [Prefix][any number of Not =][=]["][any number of Not "]["][ ] <-must have space!!!
                string replace = prefix + "[^\\=]*=\"[^\"]*\" ";
                XMLString = Regex.Replace(XMLString, replace, string.Empty);
            }
            return XMLString;
        }

A continuación, justo antes de guardar mi cadena en la base de datos, elimino los atributos incorrectos de la siguiente manera:

        List<string> badAttributes = new List<string>();
        badAttributes.Add("Typography");
        var ffText = ffi.FreeFormText == null ? null : ffi.FreeFormText.RemoveXMLAttributesFromNode(badAttributes);

No he visto ningún problema al volver a renderizar el RTF después de eliminar estos atributos. ¡Espero que esta solución ayude a alguien!

Respondido el 04 de Septiembre de 12 a las 14:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.