Пользовательская форма, устанавливающая различные цвета для включенной геометрии wpf

Я создал кастом Shape построен из Rectangle и Text внутри него. Вот код:

    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, В обоих случаях оба Rectangle и Text окрашены в один и тот же цвет и "страдают" одинаковыми эффектами формы.

Есть ли способ разграничить их? Под разделением я подразумеваю, что они оба будут отдельными элементами внутри ShapeЧто я могу свободно изменить любой из них или оба вместе?

1 ответ

Geometry не имеет цвета - это только то, что подразумевает название. Shapes нарисовать единую геометрию с помощью заливки и мазка кистью.

Вы также можете:

  • Используйте несколько форм. Это может быть дорогостоящим, так как каждый Shape это полноценный элемент управления, который может принимать ввод, визуализацию и т. д.
  • Использовать Drawing, который может содержать несколько геометрий с несколькими кистями, а затем визуализировать его с помощью DrawingImage (тип ImageSource) в Image контроль или DrawingBrush (тип Brush) в качестве заливки / фона какого-либо другого элемента управления (например, Rectangle). Обратите внимание, что Blend (инструмент, который поставляется с Visual Studio) может преобразовать группу элементов управления в DrawingBrush (Инструменты> Сделать кисть).
  • Создать элемент управления с нуля, наследуя от FrameworkElement и сделать это самостоятельно, переопределив OnRender,
Другие вопросы по тегам