C# 代码>专用无效btnZoom\U单击(对象发送者,路由目标e) { 列表=新列表(); foreach(gridImageList.Children中的UIElement项) { 边框=(边框)项; Image Image=(Image)border.Child; var imgViewerScaleTransform=(ScaleTransform)(image.layoututtransform); imgViewerScaleTransform.CenterX=0.5; imgViewerScaleTransform.CenterY=0.5; 如果((imgViewerScaleTransform.ScaleX+0.2)>3 | |(imgViewerScaleTransform.ScaleY+0.2)>3) 返回; imgViewerScaleTransform.ScaleX+=0.2; imgViewerScaleTransform.ScaleY+=0.2; image.layoututtransform=imgViewerScaleTransform; border.Child=图像; 列表。添加(边框); } gridImageList.Children.Clear(); foreach(列表中的边框) { gridImageList.Children.Add(边框); } } 私有无效btnZoomOut_单击(对象发送者,路由目标e) { 列表=新列表(); foreach(gridImageList.Children中的UIElement项) { 边框=(边框)项; Image Image=(Image)border.Child; var imgViewerScaleTransform=(ScaleTransform)(image.layoututtransform); imgViewerScaleTransform.CenterX=0.5; imgViewerScaleTransform.CenterY=0.5; if((imgViewerScaleTransform.ScaleX-0.2)
这是ScrollViewer中可伸缩项控件的一个非常简单的版本 它可以在许多方面得到改进。首先,您应该通过将按钮命令属性绑定到视图模型中的ZoomIn和ZoomOut命令来替换处理按钮单击事件(为简洁起见,请省略)C# 代码>专用无效btnZoom\U单击(对象发送者,路由目标e) { 列表=新列表(); foreach(gridImageList.Children中的UIElement项) { 边框=(边框)项; Image Image=(Image)border.Child; var imgViewerScaleTransform=(ScaleTransform)(image.layoututtransform); imgViewerScaleTransform.CenterX=0.5; imgViewerScaleTransform.CenterY=0.5; 如果((imgViewerScaleTransform.ScaleX+0.2)>3 | |(imgViewerScaleTransform.ScaleY+0.2)>3) 返回; imgViewerScaleTransform.ScaleX+=0.2; imgViewerScaleTransform.ScaleY+=0.2; image.layoututtransform=imgViewerScaleTransform; border.Child=图像; 列表。添加(边框); } gridImageList.Children.Clear(); foreach(列表中的边框) { gridImageList.Children.Add(边框); } } 私有无效btnZoomOut_单击(对象发送者,路由目标e) { 列表=新列表(); foreach(gridImageList.Children中的UIElement项) { 边框=(边框)项; Image Image=(Image)border.Child; var imgViewerScaleTransform=(ScaleTransform)(image.layoututtransform); imgViewerScaleTransform.CenterX=0.5; imgViewerScaleTransform.CenterY=0.5; if((imgViewerScaleTransform.ScaleX-0.2),c#,wpf,image,grid,resize,C#,Wpf,Image,Grid,Resize,这是ScrollViewer中可伸缩项控件的一个非常简单的版本 它可以在许多方面得到改进。首先,您应该通过将按钮命令属性绑定到视图模型中的ZoomIn和ZoomOut命令来替换处理按钮单击事件(为简洁起见,请省略) 背后的代码: public partial class MainWindow : Window { private readonly ViewModel viewModel = new ViewModel(); public MainWindow() {
背后的代码:
public partial class MainWindow : Window
{
private readonly ViewModel viewModel = new ViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = viewModel;
foreach (string imageFile in Directory.EnumerateFiles(
@"C:\Users\Public\Pictures\Sample Pictures", "*.jpg"))
{
viewModel.Images.Add(new BitmapImage(new Uri(imageFile)));
}
}
private void ZoomInButtonClick(object sender, RoutedEventArgs e)
{
viewModel.Scale *= 1.1;
}
private void ZoomOutButtonClick(object sender, RoutedEventArgs e)
{
viewModel.Scale /= 1.1;
}
}
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<ImageSource> Images { get; }
= new ObservableCollection<ImageSource>();
private double scale = 1;
public double Scale
{
get { return scale; }
set
{
scale = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Scale)));
}
}
}
公共部分类主窗口:窗口
{
private readonly ViewModel ViewModel=new ViewModel();
公共主窗口()
{
初始化组件();
DataContext=viewModel;
foreach(目录中的字符串imageFile.EnumerateFiles(
@“C:\Users\Public\Pictures\Sample Pictures”,“*.jpg”))
{
添加(新的位图图像(新的Uri(图像文件));
}
}
private void ZoomInButtonClick(对象发送方,路由目标)
{
viewModel.Scale*=1.1;
}
私有void ZoomOutButtonClick(对象发送方,RoutedEventTarget e)
{
viewModel.Scale/=1.1;
}
}
公共类视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
公共可见收集映像{get;}
=新的ObservableCollection();
私人双标度=1;
公共双尺度
{
获取{返回比例;}
设置
{
刻度=数值;
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(nameof(Scale));
}
}
}
要同时缩放所有图像吗?这是可以接受的。我有很长的垂直图像线,我可以上下滚动,所以用户应该能够缩放图像/所有图像。我想效果是一样的。图像查看器的格式发生了变化,所以我搜索了如何缩放栅格元素,但没有找到任何解决方案。谢谢你的时间!不知道什么是可接受的。你的实际目标是什么?如果要缩放单个选定的图像,则应使用列表框(因为它支持选择)并仅缩放选定的图像。也许,应更改我的解决方案。我的目标是创建一个垂直的图像集合,您可以使用滚动条从第一个图像向上/向下滚动到最后一个图像。我有一个按钮,可以缩放整行图像,所以用户可以滚动缩放的图像。当您移动滚动条和PDF页面滚动时,它的工作原理应该与Adobe Acrobat(非广告)中的工作原理相同。如果您需要更多详细信息,请询问。提前谢谢。那你为什么不在ScrollViewer中使用ListBox或者ItemsControl呢?为什么使用StackPanel时网格会简单得多?或者一个列数为1的UniformGrid,以防所有图像大小相同。天哪,你写得这么快,真令人印象深刻!非常感谢您抽出时间,这将帮助我改进代码)多亏了XAML和MVVM,事实上代码并不多。了解这一事实和能够编写工作代码是两码事。我知道这会更好,但我仍然没有使用MVVM和所有XAML功能创建正确的工作代码。所以再次感谢你,你的解决方案真的帮助我理解了,这应该怎么做,在我看来很优雅。我将使用这段代码,并尝试添加图像的旋转。如果所有图像的旋转相同,请将旋转变换应用于图像(或边框)的渲染或布局变换,并通过Angle={Binding DataContext.RotationAngle,RelativeSource={RelativeSource AncestorType=ItemsControl}
绑定到另一个视图模型属性。
public partial class MainWindow : Window
{
private readonly ViewModel viewModel = new ViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = viewModel;
foreach (string imageFile in Directory.EnumerateFiles(
@"C:\Users\Public\Pictures\Sample Pictures", "*.jpg"))
{
viewModel.Images.Add(new BitmapImage(new Uri(imageFile)));
}
}
private void ZoomInButtonClick(object sender, RoutedEventArgs e)
{
viewModel.Scale *= 1.1;
}
private void ZoomOutButtonClick(object sender, RoutedEventArgs e)
{
viewModel.Scale /= 1.1;
}
}
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<ImageSource> Images { get; }
= new ObservableCollection<ImageSource>();
private double scale = 1;
public double Scale
{
get { return scale; }
set
{
scale = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Scale)));
}
}
}