private void RenderTextNode(TextNode textNode, GwenRenderContext grc) { if (string.IsNullOrEmpty(textNode.Text)) { return; } // 当需要的时候,先更新 TextNode 的尺寸 Point textSize = grc.Renderer.MeasureText(grc.Font, textNode.Text); if (textNode.RequestedSizeRefreshing) { textNode.Size = new Size( Math.Max(textNode.Size.Width, textSize.X), Math.Max(textNode.Size.Height, textSize.Y)); NodeSGUtil.ClampBounds(textNode); textNode.RequestedSizeRefreshing = false; } Point loc = grc.GetAccumulatedDockedScrolledTranslate(); // 理论上这里我们不应当每帧对每段 Text 都调用 MeasureText() // 不过考察 Gwen.Renderer.Tao.MeasureText() 后我们发现 // 其内部已经 Cache 了一份,把尺寸再缓存一份意义不大 Point internalOffset = TextNodeUtil.CalculateInternalTextOffset(textNode, textSize); loc.Offset(internalOffset); Color c = grc.Renderer.DrawColor; grc.Renderer.DrawColor = textNode.TextColor; grc.Renderer.RenderText(grc.Font, loc, textNode.Text); grc.Renderer.DrawColor = c; }
public bool IsSelectionDraggable() { foreach (var n in m_selection) { if (n.Locked) { return(false); } if (n is RootNode) { RootNode r = n as RootNode; if (r != null && r.IsFullscren) { return(false); } } else if (NodeSGUtil.HasLockedLayoutParent(n)) { return(false); } } return(true); }