2016-07-19 29 views
-1

我创建了一个自定义Shape,它由RectangleText构成。下面是代码:自定义形状将不同的颜色设置为包含的几何图形wpf

protected override Geometry DefiningGeometry 
    { 
     get 
     { 
      var formattedText = new FormattedText(Text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Verdana"), 14, Brushes.Transparent); 
      var chosenTextPoint = new Point 
      { 
       X = ((Location.X < BottomRight.X) ? Location.X : BottomRight.X) + 5, 
       Y = ((Location.Y < BottomRight.Y) ? Location.Y : BottomRight.Y) + 5 
      }; 

      Stroke = Brushes.ForestGreen; 
      StrokeThickness = (IsSelected) ? HighlightedValue : HighlightedValue/2; 

      Rectangle = new Rect(Location, BottomRight); 

      var rectangleGeometry = new RectangleGeometry(Rectangle); 
      var textGeometry = formattedText.BuildGeometry(chosenTextPoint); 

      var combinedGeometry = new CombinedGeometry 
      { 
       GeometryCombineMode = GeometryCombineMode.Xor, 
       Geometry1 = rectangleGeometry, 
       Geometry2 = textGeometry 
      }; 

      combinedGeometry.Geometry1.SetValue(FillProperty, Brushes.Blue); 
      combinedGeometry.Geometry1.InvalidateProperty(FillProperty); 
      Fill = (IsSelected) ? Brushes.Transparent : null; 

      return combinedGeometry; 
     } 
    } 

combinedGeometry是我最近添加了,在那之前我用PathGeometry。在这两种情况下,RectangleText都以相同的颜色着色,并且“遭受”相同的形状效果。

我有两种方法可以将两者分开吗?通过分离,我的意思是它们都将是Shape中的单个元素,我可以自由修改它们中的任何一个或两者都一起?

+1

您无法在几何上设置填充属性。一个形状总是有一个填充和一个单独的笔画。如果您需要不同的填充/笔划,请使用两个形状。 – Clemens

回答

-1

A Geometry没有颜色 - 这正是它的名字所暗示的。 Shape用填充和笔触画出单个几何图形。

您可以:

  • 使用多个形状。这可能是昂贵的,因为每一个Shape是一个全面的控制,可以接受输入,渲染等
  • 使用一个Drawing,它可以包含有多个刷子多个几何形状,并随后使用DrawingImage(一种类型的ImageSource使其)Image控件或DrawingBrushBrush的一种)作为其他控件(例如Rectangle)的填充/背景。请注意,Blend(Visual Studio附带的工具)可以将一组控件转换为DrawingBrush(工具>制作笔刷)。
  • 从零开始创建一个控件,继承自FrameworkElement,并通过覆盖OnRender来自己渲染它。