El uso de múltiples cepillos dentro de un solo GeometryDrawing en WPF
-
20-09-2019 - |
Pregunta
¿Es posible utilizar varios cepillos dentro de un solo GeometryDrawing
? Tengo varias geometrías que quiero dibujar con diferentes pinceles, y es bastante detallado a tener que declarar un GeometryDrawing
individual para cada uno. Estoy buscando una manera más concisa para expresar lo siguiente:
<DrawingImage x:Key="SomeDrawingImage">
<DrawingImage.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="{StaticResource SomeGradient}">
<GeometryDrawing.Geometry>
<PathGeometry Figures="{StaticResource SomeFigures}">
<PathGeometry.Transform>
<TransformGroup>
<TranslateTransform X="50" />
</TransformGroup>
</PathGeometry.Transform>
</PathGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>
<GeometryDrawing Brush="{StaticResource SomeOtherGradient}">
<GeometryDrawing.Geometry>
<PathGeometry Figures="{StaticResource SomeOtherFigures}">
<PathGeometry.Transform>
<TransformGroup>
<TranslateTransform X="100" />
</TransformGroup>
</PathGeometry.Transform>
</PathGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
Solución
En la medida de lo entiendo su pregunta, yo diría no es posible tener varios cepillos dentro de un solo GeometryDrawing .
Todo el propósito de un GeometryDrawing es la combinación de un accidente cerebrovascular (con la propiedad Pen) y un relleno (con la propiedad del cepillo) ... con una geometría (con la propiedad geometría).
Para hacer nuestra xaml más concisa, nosotros mismos hemos compartido no sólo los cepillos (que es común), sino también la geometría ... pero tu xaml sugiere que usted está haciendo lo mismo.
Otros consejos
se puede hacer eso en código detrás
var source = image.Source as DrawingImage;
var drawing = source.Drawing as DrawingGroup;
foreach (GeometryDrawing geometryDrawing in drawing.Children)
{
geometryDrawing.Brush = Brushes.Brown;
}
Siempre se puede sobrescribir los recursos de los cepillos cuando se utiliza el GeometryDrawing:
<Image Source="{StaticResource SomeDrawingImage}">
<Image.Resources>
<SolidColorBrush x:Key="SomeGradient" Color="Brown" />
<SolidColorBrush x:Key="SomeOtherGradient" Color="Yellow" />
</Image.Resources>
</Image>
Puede utilizar un VisualBrush para lograr ese
<Grid.Background>
<VisualBrush>
<VisualBrush.Visual>
<Grid
Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type FrameworkElement}}, Mode=OneWay}"
Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type FrameworkElement}}, Mode=OneWay}">
<Rectangle Fill="Blue" />
<Image Source="your image path" Stretch="Uniform" />
</Grid>
</VisualBrush.Visual>
</VisualBrush>
</Grid.Background>