Mega Code Archive

 
Categories / C# / WPF
 

Use a VisualBrush to magnify a portion of the screen

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    x:Class="Microsoft.Samples.Graphics.UsingVisualBrush.MagnifyingGlassExample"   Background="White">   <Page.Resources>     <Style TargetType="{x:Type Paragraph}">       <Setter Property="Margin" Value="10" />     </Style>     <DrawingBrush x:Key="MyGridBackgroundBrushResource"       Viewport="0,0,10,10" ViewportUnits="Absolute" TileMode="Tile">       <DrawingBrush.Drawing>         <DrawingGroup>           <DrawingGroup.Children>             <GeometryDrawing Brush="White">               <GeometryDrawing.Geometry>                 <RectangleGeometry Rect="0,0,1,1" />               </GeometryDrawing.Geometry>             </GeometryDrawing>             <GeometryDrawing Brush="#E6E8F6"               Geometry="M 0,0 L 0,1 0.1,1 0.1,0.1 1,0.1 1,0 Z" />                                 </DrawingGroup.Children>         </DrawingGroup>       </DrawingBrush.Drawing>     </DrawingBrush>           </Page.Resources>   <Grid>       <ScrollViewer>       <StackPanel Name="magnifiedPanel"          VerticalAlignment="Stretch"         MouseMove="updateMagnifyingGlass"          Background="{StaticResource MyGridBackgroundBrushResource}">                  <FlowDocumentScrollViewer>         <FlowDocument> <Paragraph><Button></Button></Paragraph> <Paragraph><Border BorderBrush="Black" BorderThickness="1"><Image Source="c:\image.jpg" Stretch="None" /></Border></Paragraph> <Paragraph>this is a test</Paragraph>          </FlowDocument>         </FlowDocumentScrollViewer>       </StackPanel>     </ScrollViewer>     <Canvas Name="magnifyingGlassCanvas">       <Ellipse Name="magnifyingGlassEllipse" Width="100" Height="100" Stroke="Black">         <Ellipse.Fill>           <DrawingBrush>             <DrawingBrush.Drawing>               <DrawingGroup>                 <DrawingGroup.Children>                    <GeometryDrawing Brush="White">                     <GeometryDrawing.Geometry>                       <RectangleGeometry Rect="0,0,1,1" />                     </GeometryDrawing.Geometry>                   </GeometryDrawing>                    <GeometryDrawing>                     <GeometryDrawing.Brush>                        <VisualBrush x:Name="myVisualBrush" ViewboxUnits="Absolute"                         Visual="{Binding ElementName=magnifiedPanel}"/>                     </GeometryDrawing.Brush>                     <GeometryDrawing.Geometry>                       <RectangleGeometry Rect="0,0,1,1" />                     </GeometryDrawing.Geometry>                   </GeometryDrawing>                 </DrawingGroup.Children>               </DrawingGroup>             </DrawingBrush.Drawing>           </DrawingBrush>         </Ellipse.Fill>       </Ellipse>     </Canvas>   </Grid> </Page> //File:Window.xaml.cs using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Media; using System.Windows.Input; namespace Microsoft.Samples.Graphics.UsingVisualBrush {     public partial class MagnifyingGlassExample : Page     {         private static readonly double distanceFromMouse = 5;                  public MagnifyingGlassExample()         {         }         private void updateMagnifyingGlass(object sender, MouseEventArgs args)         {             Mouse.SetCursor(Cursors.Cross);             Point currentMousePosition = args.GetPosition(this);             if (this.ActualWidth - currentMousePosition.X > magnifyingGlassEllipse.Width + distanceFromMouse)             {                 Canvas.SetLeft(magnifyingGlassEllipse, currentMousePosition.X + distanceFromMouse);             }             else             {                 Canvas.SetLeft(magnifyingGlassEllipse, currentMousePosition.X - distanceFromMouse - magnifyingGlassEllipse.Width);             }                          if (this.ActualHeight - currentMousePosition.Y > magnifyingGlassEllipse.Height + distanceFromMouse)             {                 Canvas.SetTop(magnifyingGlassEllipse, currentMousePosition.Y + distanceFromMouse);             }             else             {                 Canvas.SetTop(magnifyingGlassEllipse, currentMousePosition.Y - distanceFromMouse - magnifyingGlassEllipse.Height);             }             myVisualBrush.Viewbox = new Rect(currentMousePosition.X - 10, currentMousePosition.Y  - 10, 20, 20);         }     } }