Mega Code Archive

 
Categories / C# / WPF
 

Create a Zoomable Canvas Control

<Window x:Class="WpfApplication1.Window1"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     xmlns:WpfApplication1="clr-namespace:WpfApplication1;assembly="    Title="WPF" Height="300" Width="300" >     <Window.Resources>         <Style TargetType="Button">             <Setter Property="Width" Value="Auto" />             <Setter Property="Height" Value="24" />         </Style>     </Window.Resources>     <DockPanel>         <Slider DockPanel.Dock="Bottom" x:Name="zoomSlider" Minimum="0.1" Maximum="5" Value="1"/>         <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">             <WpfApplication1:ZoomableCanvasControl x:Name="zoomControl">                 <Canvas.LayoutTransform>                     <ScaleTransform ScaleX="{Binding Path=Value, ElementName=zoomSlider}"                                     ScaleY="{Binding Path=Value, ElementName=zoomSlider}"/>                 </Canvas.LayoutTransform>                 <Rectangle Canvas.Top="0" Canvas.Left="0" StrokeThickness="2" Stroke="Red" Width="50" Height="50"/>                 <Rectangle Canvas.Top="50" Canvas.Left="50" StrokeThickness="2" Stroke="Blue" Width="150" Height="150"/>                 <Rectangle Canvas.Top="200" Canvas.Left="200" StrokeThickness="2" Stroke="Green" Width="200" Height="200"/>             </WpfApplication1:ZoomableCanvasControl>         </ScrollViewer>     </DockPanel> </Window> //File:Window.xaml.cs using System.Windows; using System; using System.Windows; using System.Windows.Controls; namespace WpfApplication1 {     public partial class Window1 : Window     {         public Window1()         {             InitializeComponent();         }     }     public class ZoomableCanvasControl : Canvas     {         static ZoomableCanvasControl()         {             DefaultStyleKeyProperty.OverrideMetadata(typeof(ZoomableCanvasControl),new FrameworkPropertyMetadata(typeof(ZoomableCanvasControl)));         }         protected override Size MeasureOverride(Size constraint)         {             double bottomMost = 0d;             double rightMost = 0d;             foreach(object obj in Children)             {                 FrameworkElement child = obj as FrameworkElement;                 if(child != null)                 {                     child.Measure(constraint);                     bottomMost = Math.Max(bottomMost,GetTop(child) +child.DesiredSize.Height);                     rightMost = Math.Max(rightMost,GetLeft(child) +child.DesiredSize.Width);                 }             }             return new Size(rightMost, bottomMost);         }     } }