Загрузка данных
// MainWindow.xaml.cs
using Microsoft.Win32;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Media;
namespace PuzzleApp
{
public partial class MainWindow : Window
{
private BitmapImage? originalImage;
private const int GridSize = 4;
private readonly Duration animationDuration =
new Duration(TimeSpan.FromMilliseconds(200));
public MainWindow()
{
InitializeComponent();
}
private void CreatePuzzle(BitmapImage img)
{
PuzzleGrid.Children.Clear();
int tileWidth = img.PixelWidth / GridSize;
int tileHeight = img.PixelHeight / GridSize;
for (int y = 0; y < GridSize; y++)
{
for (int x = 0; x < GridSize; x++)
{
Int32Rect rect = new Int32Rect(
x * tileWidth,
y * tileHeight,
tileWidth,
tileHeight);
var cropped = new CroppedBitmap(img, rect);
Image piece = new Image
{
Source = cropped,
Tag = (y * GridSize + x).ToString(),
Margin = new Thickness(1),
Cursor = Cursors.Hand
};
piece.MouseMove += Img_MouseMove;
piece.Drop += Img_Drop;
piece.DragEnter += Img_DragEnter;
piece.DragLeave += Img_DragLeave;
piece.AllowDrop = true;
PuzzleGrid.Children.Add(piece);
}
}
}
private void AnimateSwap(Image img)
{
var scale = new DoubleAnimation(1.1, 1.0, animationDuration);
img.RenderTransform = new ScaleTransform(1.0, 1.0);
img.RenderTransform.BeginAnimation(
ScaleTransform.ScaleXProperty, scale);
img.RenderTransform.BeginAnimation(
ScaleTransform.ScaleYProperty, scale);
}
private void ShuffleBtn_Click(object sender, RoutedEventArgs e)
{
if (PuzzleGrid.Children.Count == 0)
{
return;
}
Random random = new Random();
var shuffled = PuzzleGrid.Children
.Cast<Image>()
.OrderBy(_ => random.Next())
.ToList();
PuzzleGrid.Children.Clear();
foreach (var piece in shuffled)
{
PuzzleGrid.Children.Add(piece);
}
}
private void Img_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed &&
sender is Image img)
{
DragDrop.DoDragDrop(img, img, DragDropEffects.Move);
}
}
private void Img_DragEnter(object sender, DragEventArgs e)
{
if (sender is Image img)
{
img.Opacity = 0.6;
img.RenderTransform = new ScaleTransform(1.1, 1.1);
}
}
private void Img_DragLeave(object sender, DragEventArgs e)
{
if (sender is Image img)
{
img.Opacity = 1.0;
img.RenderTransform = new ScaleTransform(1.0, 1.0);
}
}
private void Img_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetData(typeof(Image)) is Image draggedImage &&
sender is Image targetImage)
{
int draggedIndex =
PuzzleGrid.Children.IndexOf(draggedImage);
int targetIndex =
PuzzleGrid.Children.IndexOf(targetImage);
if (draggedIndex == targetIndex)
{
return;
}
PuzzleGrid.Children.RemoveAt(
Math.Max(draggedIndex, targetIndex));
PuzzleGrid.Children.RemoveAt(
Math.Min(draggedIndex, targetIndex));
if (draggedIndex < targetIndex)
{
PuzzleGrid.Children.Insert(
draggedIndex, targetImage);
PuzzleGrid.Children.Insert(
targetIndex, draggedImage);
}
else
{
PuzzleGrid.Children.Insert(
targetIndex, draggedImage);
PuzzleGrid.Children.Insert(
draggedIndex, targetImage);
}
AnimateSwap(draggedImage);
AnimateSwap(targetImage);
targetImage.Opacity = 1.0;
targetImage.RenderTransform =
new ScaleTransform(1.0, 1.0);
}
}
private void LoadBtn_Click(object sender, RoutedEventArgs e)
{
var dlg = new OpenFileDialog
{
Filter = "Images|*.png;*.bmp;*.jpg;*.jpeg|All files|*.*"
};
if (dlg.ShowDialog() == true)
{
originalImage =
new BitmapImage(new Uri(dlg.FileName));
CreatePuzzle(originalImage);
}
}
}
}