DataTable Dtcompany=new DataTable();
var countryList= Dtcompany.Rows.Cast
List
DataTable Dtcompany=new DataTable();
var countryList= Dtcompany.Rows.Cast
List
MouseLeftButtonDown
, MouseLeftButtonUp
, and MouseMove
events. The following features are included: Deep zooming is a pretty straightforward functionality and is done with the ScaleTransform
property. Panning is done by setting the offset X and Y of the content. Silverlight 3 has a MultiscaleImage
control for zooming multi-resolution images. It has a Source
property to set multiple images.
In this article, I have created a custom zoom control for zooming and panning single images with animation for smooth panning.
First, create a class for zoom and pan which inherits from ContentControl
and implements the IScrollInfo
interface to move the thumb image within the area. This class contains Rectangle properties and animation methods for setting the content offset in X,Y coordinates with point zooming. It overrides the Size
method to change the image size and scale of images. It has a Generic Style
for setting the Template for the control with properties. This style is imported to the class.
In the Silverlight application, create an enum to handle the mouse modes.
public enum MouseHandlingMode
{
None,
DraggingRectangles,
Panning,
Zooming,
DragZooming,
}
Create a class having Dependency Properties for setting the scale, width, height, offset etc., and implement the InotifyPropertyChanged
interface to change the property value.
public class DataModel : INotifyPropertyChanged
{
private ObservableCollection rectangles =
new ObservableCollection();
private double contentScale = 1;
public static DataModel Instance
{
get{return instance; }
}
public ObservableCollection Rectangles
{
get{return rectangles; }
}
public double ContentScale
{
get{return contentScale; }
set
{
contentScale = value;
OnPropertyChanged("ContentScale");
}
}
. . . . .
}
Create a Converter class to convert the scale value to percent for the Slider
control:
public class ScaleToPercentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
return (double)(int)((double)value * 100.0);
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
return (double)value / 100.0;
}
}
Create a class for drawing the rectangle.
<ZoomAndPan:ZoomAndPanControl Grid.Row="0"
x:Name="zoomAndPanControl"
ContentScale= "{Binding Source={StaticResource
TypeProvider}, Path=Instance.ContentScale, Mode=TwoWay}"
ContentOffsetX= "{Binding Source={StaticResource
TypeProvider}, Path=Instance.ContentOffsetX, Mode=TwoWay}"
ContentOffsetY= "{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentOffsetY, Mode=TwoWay}"
ContentViewportWidth="{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentViewportWidth, Mode=TwoWay}"
ContentViewportHeight= "{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentViewportHeight, Mode=TwoWay}"
Background="{StaticResource pageBackground}"
MouseMove="zoomAndPanControl_MouseMove"
MouseWheel="zoomAndPanControl_MouseWheel"
MouseLeftButtonDown="zoomAndPanControl_MouseLeftButtonDown"
MouseLeftButtonUp="zoomAndPanControl_MouseLeftButtonUp">
.
.
.
</ZoomAndPan:ZoomAndPanControl>
<Button x:Name="btnZoomOut"
Grid.Column="8"
Click="btnZoomOut_Click">-</Button>
<Slider Grid.Column="10"
x:Name="changeSlider"
Minimum="{Binding MinPercentage}"
Maximum="{Binding MaxPercentage}"
Value= "{Binding ElementName=zoomAndPanControl,
Path=ContentScale, Converter={StaticResource
scaleToPercentConverter},Mode=TwoWay}" />
<Button x:Name="btnZoomIn"
Grid.Column="12"
Click="btnZoomIn_Click">+</Button>
<Popup x:Name="MyPOP"
MouseLeftButtonDown="MyPOP_MouseLeftButtonDown"
IsOpen="False">
<StackPanel Width="200" Height="200">
<ZoomAndPan:ZoomAndPanControl x:Name="overview"
Width="200" Height="200"
Background="{StaticResource popupBackground}"
SizeChanged="overview_SizeChanged"
Opacity="0.9">
<Grid Width="{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentWidth,Mode=TwoWay}"
Height="{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentHeight,Mode=TwoWay}"
SizeChanged="overview_SizeChanged">
<Image x:Name="content2" Source="{Binding ImgSource}"
VerticalAlignment="Center" HorizontalAlignment="Center"></Image>
<Canvas>
<Thumb x:Name="overviewZoomRectThumb"
Canvas.Left="{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentOffsetX, Mode=TwoWay}"
Canvas.Top="{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentOffsetY, Mode=TwoWay}"
Width="{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentViewportWidth, Mode=TwoWay}"
Height="{Binding Source={StaticResource TypeProvider},
Path=Instance.ContentViewportHeight, Mode=TwoWay}"
DragDelta="overviewZoomRectThumb_DragDelta"
Opacity="0.5">
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<Border BorderBrush="Black"
BorderThickness="3" Background="Yellow"
CornerRadius="3" />
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Canvas>
</Grid>
</ZoomAndPan:ZoomAndPanControl>
</StackPanel>
</Popup>
MouseMove
, LeftButtonDown
, LeftButtonUp
, and DoubleClcik
. The MouseDoubleClick
event is not available in Silverlight so you can use MouseLeftButtonDown
instead to count clicks.For example:
DispatcherTimer _timer;
private static int INTERVAL = 200;
public HAEZoomingControl()
{
InitializeComponent();
_timer = new DispatcherTimer();
zoomAndPanControl.ContentOffsetY = 200;
_timer.Interval = new TimeSpan(0, 0, 0, 0, INTERVAL);
_timer.Tick += new EventHandler(_timer_Tick);
}
void _timer_Tick(object sender, EventArgs e)
{
_timer.Stop();
}
MouseLeftButtonDown
event of the control use, times to check for double click.private void zoomAndPanControl_MouseLeftButtonDown(
object sender, MouseButtonEventArgs e)
{
if (zoomAndPanControl.ContentScale <= (MaxPercentage / 100))
btnZoomIn.IsEnabled = true;
if (zoomAndPanControl.ContentScale >= (MinPercentage / 100))
btnZoomOut.IsEnabled = true;
if (_timer.IsEnabled)
{
if (zoomAndPanControl.ContentScale <= (MaxPercentage / 100))
{
_timer.Stop();
sb = new Storyboard();
DoubleAnimation db = new DoubleAnimation();
sb.Children.Add(db);
sb.Completed += new EventHandler(sb_Completed);
db.To = zoomAndPanControl.ContentScale + 0.2;
db.Duration = new Duration(TimeSpan.FromSeconds(0.3));
Storyboard.SetTarget(db, zoomAndPanControl);
Storyboard.SetTargetProperty(db,
new PropertyPath("ContentScale"));
sb.Begin();
}
else
{
btnZoomIn.IsEnabled = false;
}
}
else
{
_timer.Start();
if (zoomAndPanControl.ContentScale >= (MinPercentage / 100))
{
origZoomAndPanControlMouseDownPoint =
e.GetPosition(zoomAndPanControl);
origContentMouseDownPoint = e.GetPosition(content);
mouseHandlingMode = MouseHandlingMode.Panning;
if (mouseHandlingMode != MouseHandlingMode.None)
{
zoomAndPanControl.CaptureMouse();
e.Handled = true;
}
}
}
}
OUTPUT
In the image below, you can see a zoomed image and a small image on the bottom-right side of the canvas to see the offset position of the zoomed image using the yellow thumb marker.
Download Source Code : Silverlight Zoom And Pan - 1.74 MB