<Window x:Class="WpfApp132.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp132"
mc:Ignorable="d"
WindowState="Maximized"
MouseDown="Window_MouseDown"
MouseMove="Window_MouseMove"
MouseWheel="Window_MouseWheel"
MouseUp="Window_MouseUp"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListBox x:Name="lbx" Grid.Column="0"
ItemsSource="{Binding ImgsList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectionChanged="lbx_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Content,RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
Width="200" Height="500" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ContentControl Grid.Column="1" ClipToBounds="True">
<Viewbox x:Name="viewBox"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" >
<Image x:Name="img" Source="{Binding SelectedItem,ElementName=lbx}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="scaler"/>
<TranslateTransform x:Name="translater"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
</Viewbox>
</ContentControl>
</Grid>
</Window>
//cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
namespace WpfApp132
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
InitImgsList();
this.DataContext = this;
}
private void InitImgsList()
{
string fullDir = System.IO.Path.GetFullPath(@"..\..\Images");
if (Directory.Exists(fullDir))
{
var files = System.IO.Directory.GetFiles(fullDir, "*", System.IO.SearchOption.AllDirectories);
ImgsList = new ObservableCollection<string>(files);
lbx.SelectedIndex = 0;
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
private ObservableCollection<string> imgsList;
public ObservableCollection<string> ImgsList
{
get
{
return imgsList;
}
set
{
if (value != imgsList)
{
imgsList = value;
OnPropertyChanged(nameof(ImgsList));
}
}
}
private bool isMoving = false;
public bool IsMoving
{
get
{
return isMoving;
}
set
{
if (value != isMoving)
{
isMoving = value;
OnPropertyChanged(nameof(IsMoving));
}
}
}
Point previousPoint;
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
previousPoint = e.GetPosition(this);
}
private void Window_MouseMove(object sender, MouseEventArgs e)
{
IsMoving = true;
}
private void Window_MouseWheel(object sender, MouseWheelEventArgs e)
{
Point pt = e.GetPosition(this);
if (e.Delta > 0)
{
scaler.ScaleX *= 1.2;
scaler.ScaleY *= 1.2;
}
else
{
scaler.ScaleX /= 1.2;
scaler.ScaleY /= 1.2;
}
scaler.CenterX = pt.X;
scaler.CenterY = pt.Y;
this.Title = $"ZoomLevel:{scaler.ScaleX},X:{scaler.CenterX},Y:{scaler.CenterY}";
}
private void Window_MouseUp(object sender, MouseButtonEventArgs e)
{
if (IsMoving && e.ButtonState == MouseButtonState.Released && e.ChangedButton == MouseButton.Left)
{
Point newPoint = e.GetPosition(this);
double deltaX = newPoint.X - previousPoint.X;
double deltaY = newPoint.Y - previousPoint.Y;
translater.X += deltaX;
translater.Y += deltaY;
this.Title = $"ZoomLevel:{scaler.ScaleX},X:{translater.X},Y:{translater.Y}";
}
}
private void lbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
scaler.ScaleX = 1.0;
scaler.ScaleY = 1.0;
translater.X = 0;
translater.Y = 0;
}
}
}
![]()
![]()
![]()