Saya ingin membuat penampil gambar sederhana di WPF yang akan memungkinkan pengguna untuk:
- Pan (dengan mouse menyeret gambar).
- Zoom (dengan slider).
- Tampilkan overlay (misalnya pemilihan persegi panjang).
- Tampilkan gambar asli (dengan bilah gulir jika perlu).
Bisakah Anda menjelaskan bagaimana cara melakukannya?
Saya tidak menemukan sampel yang bagus di web. Haruskah saya menggunakan ViewBox? Atau ImageBrush? Apakah saya perlu ScrollViewer?
Jawaban:
Cara saya memecahkan masalah ini adalah menempatkan gambar di dalam Perbatasan dengan properti ClipToBounds yang disetel ke True. RenderTransformOrigin pada gambar kemudian diatur ke 0,5,0,5 sehingga gambar akan mulai memperbesar di tengah gambar. RenderTransform juga diatur ke TransformGroup yang berisi ScaleTransform dan TranslateTransform.
Saya kemudian menangani acara MouseWheel pada gambar untuk menerapkan pembesaran
Untuk menangani panning, hal pertama yang saya lakukan adalah menangani event MouseLeftButtonDown pada gambar, untuk menangkap mouse dan untuk merekam lokasinya, saya juga menyimpan nilai TranslateTransform saat ini, ini yang diperbarui untuk mengimplementasikan panning.
Kemudian saya menangani acara MouseMove untuk memperbarui TranslateTransform.
Akhirnya jangan lupa untuk melepaskan tangkapan mouse.
Sedangkan untuk pemilihan pegangan untuk mengubah ukuran ini dapat dilakukan dengan menggunakan adorner, lihat artikel ini untuk informasi lebih lanjut.
sumber
Setelah menggunakan sampel dari pertanyaan ini, saya telah membuat versi lengkap aplikasi pan & zoom dengan zoom yang tepat relatif terhadap pointer mouse. Semua kode pan & zoom telah dipindahkan ke kelas terpisah yang disebut ZoomBorder.
ZoomBorder.cs
MainWindow.xaml
MainWindow.xaml.cs
sumber
double zoomCorrected = zoom*st.ScaleX; st.ScaleX += zoomCorrected; st.ScaleY += zoomCorrected;
Jawabannya diposting di atas tetapi tidak lengkap. di sini adalah versi yang sudah selesai:
XAML
Kode di Balik
Saya punya contoh proyek wpf lengkap menggunakan kode ini di situs web saya: Mencatat aplikasi catatan tempel .
sumber
Coba Kontrol Zoom ini: http://wpfextensions.codeplex.com
penggunaan kontrol ini sangat sederhana, merujuk pada rakitan wpfextensions daripada:
Bilah gulir tidak didukung saat ini. (Ini akan menjadi rilis berikutnya yang akan tersedia dalam satu atau dua minggu).
sumber
sumber
@Anothen dan @ Number8 - Kelas Vector tidak tersedia di Silverlight, jadi untuk membuatnya bekerja kita hanya perlu menyimpan catatan posisi terakhir yang terlihat terakhir kali acara MouseMove dipanggil, dan membandingkan dua titik untuk menemukan perbedaan ; kemudian sesuaikan transformasinya.
XAML:
Kode di belakang:
Perhatikan juga bahwa Anda tidak memerlukan TransformGroup atau koleksi untuk menerapkan pan dan zoom; sebagai gantinya, CompositeTransform akan melakukan trik dengan lebih mudah.
Saya cukup yakin ini benar-benar tidak efisien dalam hal penggunaan sumber daya, tetapi setidaknya itu bekerja :)
sumber
Untuk memperbesar relatif ke posisi mouse, yang Anda butuhkan adalah:
sumber
@ Merk
Untuk solusi Anda, instal ekspresi lambda Anda dapat menggunakan kode berikut:
kode ini dapat digunakan seperti untuk .Net Frame work 3.0 atau 2.0
Semoga Ini membantu Anda :-)
sumber
Versi lain dari jenis kontrol yang sama. Ini memiliki fungsi yang mirip dengan yang lain, tetapi ia menambahkan:
Penggunaannya sederhana:
Dan kodenya:
sumber
if (image.ActualWidth*(st.ScaleX + zoom) < 200 || image.ActualHeight*(st.ScaleY + zoom) < 200) //don't zoom out too small. return;
diperkecil menjadi kecil sampai kita tidak bisa melakukan apa-apa dan tidak melihat apa-apa. Saya menambahkan sedikit batasan: dalam gambar. Mouse rodaIni akan memperbesar dan memperkecil serta menggeser tetapi menjaga gambar dalam batas wadah. Ditulis sebagai kontrol, jadi tambahkan gaya ke
App.xaml
langsung atau melaluiThemes/Viewport.xaml
.Untuk keterbacaan, saya juga mengunggah ini di intisari dan github
Saya juga mengemas ini di nuget
./Controls/Viewport.cs:
./Themes/Viewport.xaml:
./App.xaml
Pemakaian:
Masalah apa pun, beri aku teriakan.
Selamat coding :)
sumber