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