<Window x:Class="Chapter05.VisualBrushExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="VisualBrush Example" Height="190" Width="250"> <StackPanel Margin="5" Grid.Column="0"> <TextBlock Text="Original button:" Margin="5" /> <Button Name="Select" ToolTip="Select" Margin="5" Width="40" Height="40"> <Image Width="30" Height="30"> <Image.Source> <DrawingImage> <DrawingImage.Drawing> <GeometryDrawing Brush="LightGray"> <GeometryDrawing.Geometry> <PathGeometry Figures="M250,75 L 50,10 75,75 60,75 20,100 40,100,40,75Z"> <PathGeometry.Transform> RotateTransform CenterX="50" CenterY="50" Angle="45"/> </PathGeometry.Transform> </PathGeometry> </GeometryDrawing.Geometry> <GeometryDrawing.Pen> <Pen Brush="Gray" Thickness="3" /> </GeometryDrawing.Pen> </GeometryDrawing> </DrawingImage.Drawing> </DrawingImage> </Image.Source> </Image> </Button> <TextBlock Text="Copied button:" Margin="5" /> <Button Height="40" Width="40"> <Button.Background> <VisualBrush Visual="{Binding ElementName=Select}" /> </Button.Background> </Button> </StackPanel> </Window>
Windows Presentation Foundation
VisualBrush and TileMode
<Window x:Class="Chapter05.VisualBrushExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="VisualBrush Example" Height="190" Width="250"> <StackPanel Margin="5" Grid.Column="0"> <TextBlock Text="Original button:" Margin="5" /> <Button Name="Select" ToolTip="Select" Margin="5" Width="40" Height="40"> <Image Width="30" Height="30"> <Image.Source> <DrawingImage> <DrawingImage.Drawing> <GeometryDrawing Brush="LightGray"> <GeometryDrawing.Geometry> <PathGeometry Figures="M250,75 L 50,10 75,75 60,75 20,100 40,100,40,75Z"> <PathGeometry.Transform> RotateTransform CenterX="50" CenterY="50" Angle="45"/> </PathGeometry.Transform> </PathGeometry> </GeometryDrawing.Geometry> <GeometryDrawing.Pen> <Pen Brush="Gray" Thickness="3" /> </GeometryDrawing.Pen> </GeometryDrawing> </DrawingImage.Drawing> </DrawingImage> </Image.Source> </Image> </Button> <TextBlock Text="Tiled button:" Margin="5" /> <Button Foreground="Blue" Height="120" Width="120"> <Button.Background> <VisualBrush Visual="{Binding ElementName=Select}" Viewport="0,0,40,40" ViewportUnits="Absolute" TileMode="Tile"> </VisualBrush> </Button.Background> </Button> </StackPanel> </Window>
Create buttons using DrawingImage objects
<Window x:Class="Chapter05.DrawingImageExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DrawingImage Example" Height="130" Width="320"> <Button Name="Select" ToolTip="Select" Margin="5"> <Image Width="80" Height="80"> <Image.Source> <DrawingImage> <DrawingImage.Drawing> <GeometryDrawing Brush="LightGray"> <GeometryDrawing.Geometry> <PathGeometry Figures="M25,75 L 50,0 75,75 60,75 60,100 40,100,40,75Z"> <PathGeometry.Transform> <RotateTransform CenterX="50" CenterY="50" Angle="45" /> </PathGeometry.Transform> </PathGeometry> </GeometryDrawing.Geometry> <GeometryDrawing.Pen> <Pen Brush="Gray" Thickness="3" /> </GeometryDrawing.Pen> </GeometryDrawing> </DrawingImage.Drawing> </DrawingImage> </Image.Source> </Image> </Button> </Window>
Applies a DrawingBrush and DrawingGroup to draw gridlines as a background of a Grid control.
<Window x:Class="DrawingBrushGridline" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Drawing Brush - Gridline" Height="300" Width="300"> <Grid> <Grid.Background> <DrawingBrush Viewport="0,0,50,50" ViewportUnits="Absolute" TileMode="Tile"> <DrawingBrush.Drawing> <DrawingGroup> <DrawingGroup.Children> <GeometryDrawing Geometry="M0,0 L50,0"> <GeometryDrawing.Pen> <Pen Thickness="2" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M0,10 L50,10"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M0,20 L50,20"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M0,30 L50,30"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M0,40 L50,40"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M0,0 L0,50"> <GeometryDrawing.Pen> <Pen Thickness="2" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M10,0 L10,50"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M20,0 L20,50"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M30,0 L30,50"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Geometry="M40,0 L40,50"> <GeometryDrawing.Pen> <Pen Thickness="1" Brush="LightGreen" /> </GeometryDrawing.Pen> </GeometryDrawing> </DrawingGroup.Children> </DrawingGroup> </DrawingBrush.Drawing> </DrawingBrush> </Grid.Background> </Grid> </Window>
Create buttons using DrawingImage and GeometryDrawing
<Window x:Class="Chapter05.DrawingImageExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DrawingImage Example" Height="130" Width="320"> <Button Name="DrawRectangle" Grid.Column="1" ToolTip="Draw Rectangle" Margin="5"> <Image Width="80" Height="80"> <Image.Source> <DrawingImage> <DrawingImage.Drawing> <GeometryDrawing Brush="LightGray"> <GeometryDrawing.Geometry> <RectangleGeometry Rect="0,20,100,60" /> </GeometryDrawing.Geometry> <GeometryDrawing.Pen> <Pen Brush="Gray" Thickness="3" /> </GeometryDrawing.Pen> </GeometryDrawing> </DrawingImage.Drawing> </DrawingImage> </Image.Source> </Image> </Button> </Window>
Draw text to the background of a control by accessing the control's DrawingContext.
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Draw Text to a Control's Background" Background="FloralWhite" Width="800" Loaded="WindowLoaded"> <StackPanel> <Label Name="myLabel" Width="200" Height="36" /> <TextBox Name="myTextBox" MaxLength="25" >Sample Text</TextBox> <Button Name="myButton" Click="OnButtonClick" Width="160" Height="40" /> <Canvas Name="myCanvas" Width ="760" Height="300"/> </StackPanel> </Window> //File:Window.xaml.cs using System; using System.Globalization; using System.Windows; using System.Windows.Media; namespace WpfApplication1 { public partial class Window1 : Window { public Window1() : base() { InitializeComponent(); } private void WindowLoaded(object sender, EventArgs e) { myLabel.Background = new DrawingBrush(DrawMyText("My Custom Label")); myButton.Background = new DrawingBrush(DrawMyText("Display Text")); } private Drawing DrawMyText(string textString) { DrawingGroup drawingGroup = new DrawingGroup(); using (DrawingContext drawingContext = drawingGroup.Open()) { FormattedText formattedText = new FormattedText( textString, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Comic Sans MS Bold"), 48, Brushes.Black ); Geometry textGeometry = formattedText.BuildGeometry(new Point(20, 0)); drawingContext.DrawRoundedRectangle(Brushes.PapayaWhip, null, new Rect(new Size(formattedText.Width + 50, formattedText.Height + 5)), 5.0, 5.0); drawingContext.DrawGeometry(Brushes.Gold, new Pen(Brushes.Maroon, 1.5), textGeometry); return drawingGroup; } } public void OnButtonClick(object sender, EventArgs e) { myCanvas.Background = new DrawingBrush(DrawMyText(myTextBox.Text)); } } }
DrawingGroup and GeometryGroup
<Window x:Class="Workspace.DockExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Workspace" Width="640" Height="480"> <Window.Resources> <DrawingGroup x:Key="myDrawing" > <GeometryDrawing> <GeometryDrawing.Geometry> <GeometryGroup> <LineGeometry StartPoint="0,0" EndPoint="1,1" /> <LineGeometry StartPoint="0,1" EndPoint="1,0" /> </GeometryGroup> </GeometryDrawing.Geometry> <GeometryDrawing.Pen> <Pen Thickness="0.2" Brush="#3366FF" /> </GeometryDrawing.Pen> </GeometryDrawing> <GeometryDrawing Brush="Red" Geometry="M 0.4,0.4 L 0.5,0.2 0.6,0.4 0.5,0.5" /> </DrawingGroup> </Window.Resources> <Rectangle Width="175" Height="90" Stroke="Black"> <Rectangle.Fill> <DrawingBrush Drawing="{StaticResource myDrawing}" Viewport="0,0,0.5,0.5" TileMode="Tile"> <DrawingBrush.RelativeTransform> <RotateTransform CenterX="0.5" CenterY="0.5" Angle="45" /> </DrawingBrush.RelativeTransform> </DrawingBrush> </Rectangle.Fill> </Rectangle> </Window>