我正在使用WPF并创建了一个自定义形状。我读到我们可以简单地覆盖DefiningGeometry函数来绘制我们的形状..但它对我不起作用,我不明白。只有当我在OnRender()中执行它时它才适用于我。为什么呢?
这将有效:
protected override Geometry DefiningGeometry
{
get { return Geometry.Empty; }
}
protected override void OnRender(DrawingContext drawingContext)
{
FormattedText ft = new FormattedText
(Text, new CultureInfo("ru-ru"),
FlowDirection.LeftToRight,
new Typeface(
new FontFamily("Arial"),
FontStyles.Normal,
FontWeights.Regular,
new FontStretch()),
TextHeight,
new SolidColorBrush(TextColor));
drawingContext.DrawText
(ft, new Point(X, Y));
}
但这不起作用:
protected override Geometry DefiningGeometry
{
get {
FormattedText ft = new FormattedText
(Text, new CultureInfo("ru-ru"),
FlowDirection.LeftToRight,
new Typeface(
new FontFamily("Arial"),
FontStyles.Normal,
FontWeights.Regular,
new FontStretch()),
TextHeight,
new SolidColorBrush(TextColor));
GeometryGroup group = new GeometryGroup();
group.Children.Add(ft.BuildGeometry(new Point(X,Y)));
return group;
}
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
}
答案 0 :(得分:0)
第二个代码应该有效。您认为它不起作用只是因为Stroke
和Fill
是透明的。你必须将它们初始化为一些明确可见的画笔,如下所示:
//the constructor of your own shape
public MyShape(){
Stroke = Brushes.Blue;
Fill = Brushes.Red;
}
第一个代码可能是因为DrawText
方法从FormattedText
获取默认的ForegroundBrush信息来绘制文本,我认为默认画笔不应该是透明的。所以你可以看到绘制的文本。