以下代码位于视图模型中:
我正在使用FormattedText创建一个显示列表。我需要获得在离开创建格式化文本的方法之前显示的最终度量(即,在方法完成时的正常渲染机制之前)。我一直在尝试使用调度员这些线路,但似乎无法获得最终的仪表。无论我如何设置调度程序或如何调用它,StringViewModel的实际formattedtext(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);
请帮忙。如何才能做到这一点?任何想法都会很棒!
StringViewModel:
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);
}
编辑:
以上所有代码都在View Model中,而不是后面的代码,如果我将其更改为
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字符串和theView是对视图的引用,所有工作正确。
那么,没有视图模型的建议方法是什么?#34;知道&#34;的视图,然后使用视图的调度程序来测量渲染的文本?