视图模型使用视图调度程序的最佳方法是什么?

时间:2014-08-27 22:23:04

标签: wpf mvvm dispatcher formatted-text

以下代码位于视图模型中:

我正在使用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;的视图,然后使用视图的调度程序来测量渲染的文本?

0 个答案:

没有答案