いくつかのWPFのアセンブリ(WindowsBaseおよびPresentationCore)へのリンクを受け入れる場合は、カスタムTextBoxを作成してWinForms実装で使用できます。 WPFには、GlyphTypeFace(フォントファイルをロードしてグリフからジオメトリを作成することができます)、GlyphRun(グリフのリスト - テキスト)を描画できるような素敵なクラスがあります。しかし、ここではGlyphRunを使用することはできません。なぜなら、いくつかのグリフのジオメトリを変更できるようにするためです。したがって、ジオメトリを手動で取得して変換する必要があります。ここで
は一例です:
のWinformsコード:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// ElementHost allows Winforms to host WPF visual components
ElementHost host = new ElementHost();
host.Dock = DockStyle.Fill;
host.Child = new MyTextBox();
Controls.Add(host);
}
カスタムテキストボックスコード:
public class MyTextBox: UIElement
{
protected override void OnRender(DrawingContext drawingContext)
{
const string sampleText = "Sample String";
const int sampleEmSize = 30;
GlyphTypeface typeFace = new GlyphTypeface(new Uri("file:///C:/WINDOWS/FONTS/segoeui.ttf"));
GeometryGroup group = new GeometryGroup();
group.FillRule = FillRule.Nonzero;
double x = 0;
double y = sampleEmSize;
for (int i = 0; i < sampleText.Length; i++)
{
ushort glyphIndex = typeFace.CharacterToGlyphMap[sampleText[i]];
Geometry glyphGeometry = typeFace.GetGlyphOutline(glyphIndex, sampleEmSize, sampleEmSize).Clone();
TransformGroup glyphTransform = new TransformGroup();
if (sampleText[i] == 'm') // this is a sample, we just change the 'm' characte
{
const double factor = 2;
glyphTransform.Children.Add(new ScaleTransform(factor, 1));
glyphTransform.Children.Add(new TranslateTransform(x, y));
x += factor * typeFace.AdvanceWidths[glyphIndex] * sampleEmSize;
}
else
{
glyphTransform.Children.Add(new TranslateTransform(x, y));
x += typeFace.AdvanceWidths[glyphIndex] * sampleEmSize;
}
glyphGeometry.Transform = glyphTransform;
group.Children.Add(glyphGeometry);
}
drawingContext.DrawGeometry(Brushes.Black, null, group);
}
}
そして、ここでのWinFormsの結果である:
もちろん、編集をサポートしたい場合はいくつかの作業がありますが、これが始まる可能性があります。
私は実際に、これを行うための他の方法は考えられません。 1つはTextBoxクラスを継承しますが、1つは文字のペイントを制御します。各文字の位置をすでに知っているので、これらのものがどのようにボックスに表示されるかを指定することができます(たとえば、フォントで固定した場合)。 DevExpress、DevComponents、Telerakなどのサードパーティのコントロールを使用することもできます。 –
独自のコントロールを実装し、Graphics.ScaleTransform()+ Graphics.DrawString()を使用する必要があります。文字間隔を正しく取得するのは難しい、Graphics.MeasureCharacterRanges。見栄えを良くすることさえ難しくなります。 –
あなた自身のコントロールを作るという安価なハックは、WebBrowserコントロールを使うことかもしれません。あなたが望むことをするためには、HTMLを生成するだけです。テストされていませんが、うまくいくと思います。もちろん、コントロールに入力することはできません。少なくとも、TextBoxの場合と同じようにWebBrowserを拡張することなく、作業領域と表示領域を分割する必要があります。 –