次のコードはビュー モデルにあります。
FormattedText を使用して表示リストを作成しています。書式設定されたテキストを作成したメソッドを終了する前に (つまり、メソッドが完了したときの通常のレンダリング メカニズムの前に)、表示がどうなるかの最終的なメトリックを取得する必要があります。私はディスパッチャーを使用してこれらの線に沿って何かを試してきましたが、最終的な測定値を取得できないようです. StringViewModel の実際のフォーマット済みテキスト ft は、ディスパッチャーの設定方法や呼び出し方法に関係なく、常に null です。ディスパッチャーがレンダリングを行う前にアクションが実行されていることを収集しています。(ネット4.0)
Action<StringViewModel> action = delegate(StringViewModel sv)
{
// do stuff to UI, e.g.
var Height = sv.ft.Height;
};
svm.Dispatcher.BeginInvoke(DispatcherPriority.Render, action, svm);
助けてください。これはどのように行うことができますか?どんなアイデアも素晴らしいでしょう!
文字列ビューモデル:
public class StringViewModel : FrameworkElement
{
public StringViewModel(
Point topleft,
string text,
double fontsizediu,
SolidColorBrush brush,
Func<FormattedText,FormattedText> f,
double lineheight)
{
this.text = text;
this.emSize = fontsizediu;
this.color = brush;
this.topleft = topleft;
this.lineheight = lineheight;
this.f = f;
}
protected override void OnRender(DrawingContext dc)
{
ft = new FormattedText(
text,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(new FontFamily("Segoe Script"), FontStyles.Italic, FontWeights.Normal, FontStretches.Normal),
emSize,
color);
ft.TextAlignment = TextAlignment.Left;
if (lineheight == null)
ft.LineHeight = 1.25 * FontSize;
ft = f(ft);
dc.DrawText(ft, topleft);
}
編集:
上記のコードはすべて、コードビハインドではなくビューモデルにあります。
StringViewModel svm = new StringViewModel(p, r, FontSizeDIU, b, stringstyle, LineHeight);
Strings.Add(svm);
this.theView.Dispatcher.BeginInvoke(
DispatcherPriority.Background, new DispatcherOperationCallback(delegate(Object state)
{
var size = svm.DesiredSize;
return null;
}
), null);
ここで、ObservableCollection Strings と theView はビューへの参照であり、すべて正しく機能します。
では、ビューモデルにビューを「認識」させずに、ビューのディスパッチャを使用してレンダリングされたテキストを測定するための推奨される方法は何ですか?