mit TextFormatter Arbeiten, kam ich accross this article on MSDN, die den folgenden Beispielcode zeigt:Was muss ich tun, um auf CustomTextParagraphProperties zugreifen zu können?
// Create a TextFormatter object.
TextFormatter formatter = TextFormatter.Create();
// Create common paragraph property settings.
CustomTextParagraphProperties customTextParagraphProperties
= new CustomTextParagraphProperties();
// Format each line of text from the text store and draw it.
while (textStorePosition < customTextSource.Text.Length)
{
// Create a textline from the text store using the TextFormatter object.
using (TextLine myTextLine = formatter.FormatLine(
customTextSource,
textStorePosition,
96 * 6,
customTextParagraphProperties,
null))
{
// Draw the formatted text into the drawing context.
myTextLine.Draw(drawingContext, linePosition, InvertAxes.None);
// Update the index position in the text store.
textStorePosition += myTextLine.Length;
// Update the line position coordinate for the displayed line.
linePosition.Y += myTextLine.Height;
}
}
Das Problem Ich habe auch nach System.Windows.Media.TextFormatting
gibt es keine Klasse/Objekt mit CustomTextParagraphProperties
so daß der Leitung wirft einen Fehler Referenzierung (von Natürlich, da es nicht existiert)
Was brauche ich noch, um auf diese Klasse zugreifen zu können?
Dies ist meine using
Liste:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Drawing.Printing;
using System.ComponentModel;
using System.Windows.Media.TextFormatting;
using System.IO;
Und dies ist die Liste meiner Referenzen:
ich TextParagraphProperties
gefunden, aber dies ist eine abstract
Klasse und kann daher nicht erstellt werden mit new
, dh es ist kein Ersatzfall für CustomTextParagraphProperties
, wie das Beispiel zeigt, würde die folgende Zeile nicht funktionieren:
HINWEIS: Ich habe das WPF-Tag hinzugefügt, da dieses Projekt die WPF-Funktionalität erbt, aber dies ist kein WPF-Projekt.
Ich begann ein Kaninchenloch tauchen nach unten, und immer mehr codependant abstract
Klassen zu finden, die Eltern hängen davon ab, und da nicht die new
das Objekt inistialize verwenden kann, muß eine Reihe von Code schreiben, ohne dass ein Ende in Sicht ist dies eher frustrierend:
#region textformatter
class TextRunProperties : System.Windows.Media.TextFormatting.TextRunProperties {
public override Windows.Media.Brush BackgroundBrush { get; set; }
public override Windows.BaselineAlignment BaselineAlignment { get { return base.BaselineAlignment; } }
public override CultureInfo CultureInfo { get; set; }
public override double FontHintingEmSize { get; set; }
public override double FontRenderingEmSize { get; set; }
public override Windows.Media.Brush ForegroundBrush { get; set; }
public override Windows.Media.NumberSubstitution NumberSubstitution { get { return base.NumberSubstitution; } }
public override TextDecorationCollection TextDecorations { get; set; }
public override Windows.Media.TextEffectCollection TextEffects { get; set; }
public override Windows.Media.Typeface Typeface { get; set; }
public override Windows.Media.TextFormatting.TextRunTypographyProperties TypographyProperties { get { return base.TypographyProperties; } }
}
class TextRun : System.Windows.Media.TextFormatting.TextRun {
public override CharacterBufferReference CharacterBufferReference { get; set; }
public override int Length { get; set; }
public override Windows.Media.TextFormatting.TextRunProperties Properties { get; set; }
}
class TextSource : System.Windows.Media.TextFormatting.TextSource {
public override Windows.Media.TextFormatting.TextSpan<CultureSpecificCharacterBufferRange> GetPrecedingText(int textSourceCharacterIndexLimit) {
return new TextSpan<CultureSpecificCharacterBufferRange>(
textSourceCharacterIndexLimit,
new CultureSpecificCharacterBufferRange(
new CultureInfo(0),
Windows.Media.TextFormatting.CharacterBufferRange.Empty
)
);
}
public override int GetTextEffectCharacterIndexFromTextSourceCharacterIndex(int textSourceCharacterIndex) {
return 0;
}
public override Windows.Media.TextFormatting.TextRun GetTextRun(int textSourceCharacterIndex) {
return new TextRun();
}
}
class TextFormatter : System.Windows.Media.TextFormatting.TextFormatter {
public override Windows.Media.TextFormatting.TextLine FormatLine(Windows.Media.TextFormatting.TextSource textSource, int firstCharIndex, double paragraphWidth, TextParagraphProperties paragraphProperties, TextLineBreak previousLineBreak, TextRunCache textRunCache) {
throw new NotImplementedException();
}
public override Windows.Media.TextFormatting.TextLine FormatLine(Windows.Media.TextFormatting.TextSource textSource, int firstCharIndex, double paragraphWidth, TextParagraphProperties paragraphProperties, TextLineBreak previousLineBreak) {
throw new NotImplementedException();
}
public override Windows.Media.TextFormatting.MinMaxParagraphWidth FormatMinMaxParagraphWidth(Windows.Media.TextFormatting.TextSource textSource, int firstCharIndex, TextParagraphProperties paragraphProperties) {
throw new NotImplementedException();
}
public override Windows.Media.TextFormatting.MinMaxParagraphWidth FormatMinMaxParagraphWidth(Windows.Media.TextFormatting.TextSource textSource, int firstCharIndex, TextParagraphProperties paragraphProperties, TextRunCache textRunCache) {
throw new NotImplementedException();
}
}
class TextLine : System.Windows.Media.TextFormatting.TextLine {
public override double Baseline {
get { throw new NotImplementedException(); }
}
public override int DependentLength {
get { throw new NotImplementedException(); }
}
public override double Extent {
get { throw new NotImplementedException(); }
}
public override bool HasCollapsed {
get { throw new NotImplementedException(); }
}
public override bool HasOverflowed {
get { throw new NotImplementedException(); }
}
public override double Height {
get { throw new NotImplementedException(); }
}
public override bool IsTruncated {
get {
return base.IsTruncated;
}
}
public override int Length {
get { throw new NotImplementedException(); }
}
public override double MarkerBaseline {
get { throw new NotImplementedException(); }
}
public override double MarkerHeight {
get { throw new NotImplementedException(); }
}
public override int NewlineLength {
get { throw new NotImplementedException(); }
}
public override double OverhangAfter {
get { throw new NotImplementedException(); }
}
public override double OverhangLeading {
get { throw new NotImplementedException(); }
}
public override double OverhangTrailing {
get { throw new NotImplementedException(); }
}
public override double Start {
get { throw new NotImplementedException(); }
}
public override double TextBaseline {
get { throw new NotImplementedException(); }
}
public override double TextHeight {
get { throw new NotImplementedException(); }
}
public override int TrailingWhitespaceLength {
get { throw new NotImplementedException(); }
}
public override double Width {
get { throw new NotImplementedException(); }
}
public override double WidthIncludingTrailingWhitespace {
get { throw new NotImplementedException(); }
}
// functions
public override Windows.Media.TextFormatting.TextLine Collapse(params TextCollapsingProperties[] collapsingPropertiesList) {
throw new NotImplementedException();
}
public override void Draw(DrawingContext drawingContext, Windows.Point origin, InvertAxes inversion) {
throw new NotImplementedException();
}
public override CharacterHit GetBackspaceCaretCharacterHit(CharacterHit characterHit) {
throw new NotImplementedException();
}
public override CharacterHit GetCharacterHitFromDistance(double distance) {
throw new NotImplementedException();
}
public override double GetDistanceFromCharacterHit(CharacterHit characterHit) {
throw new NotImplementedException();
}
public override IEnumerable<IndexedGlyphRun> GetIndexedGlyphRuns() {
throw new NotImplementedException();
}
public override CharacterHit GetNextCaretCharacterHit(CharacterHit characterHit) {
throw new NotImplementedException();
}
public override CharacterHit GetPreviousCaretCharacterHit(CharacterHit characterHit) {
throw new NotImplementedException();
}
public override IList<TextBounds> GetTextBounds(int firstTextSourceCharacterIndex, int textLength) {
throw new NotImplementedException();
}
public override IList<TextCollapsedRange> GetTextCollapsedRanges() {
throw new NotImplementedException();
}
public override TextLineBreak GetTextLineBreak() {
throw new NotImplementedException();
}
public override IList<TextSpan<Windows.Media.TextFormatting.TextRun>> GetTextRunSpans() {
throw new NotImplementedException();
}
}
#endregion
ich weiß nicht einmal, ob das richtig ist, aber von dem, was es scheint, keine dieser Methoden must override
etwas zurückgeben, also was genau macht diese Klasse tun? Verarbeitet es irgendeinen Code, wie zum Beispiel einen TextEffect, oder ist das alles Zeug, das von Hand geschrieben werden muss - aka, muss ich meine eigenen TextEffects erstellen und sie in diesen Code stecken, egal welche abstrakte Struktur mit mehr Methoden nichts tun ....
Ich schaute nur in das und scheint ein Kaninchenloch mit keinem Ende in Sicht zu sein. Ich aktualisiere meine Frage, um die Implementierung, die ich begonnen habe, einzuschließen, habe aber keine Ahnung. Habe ich recht, wenn ich verstehe, dass 'TextRunProperties' und alle anderen abstrakten Klassen nichts tun - scheint es albern, eine Struktur wie diese zu verlangen, aber eine 'neue' Instanz der Klasse zu verbieten, um die eine Eigenschaft (zB Text) zu setzen) und habe einige Standardeinstellungen anstelle von ... naja ... wirklich LAZY auf MS's Teil XD –
Grundsätzlich möchte ich eine Zeichenfolge an den Konstruktor/Klasse übergeben, und dann lassen Sie es für mich verarbeiten. Wie wenn ich 'richTextBox1.Text =" foo "' mache, konvertiert das Steuerelement diese Zeichenfolge automatisch in und aus dem RTF-Format. Ich muss die Klasse nicht abstrahieren und alles manuell verarbeiten, indem ich die gesamte RTF-Spezifikation schreibe, nur um Text in einer RichTextBox zu setzen. –