图片框如何居中
How to centre picture box
我正在尝试将 this plugin 用于 C#,效果很好。但是,放大时我很难让图像居中。默认情况下,无论何时缩放,图片框都会聚焦在左上角。我希望它集中在中心。
有什么想法吗?我进行了广泛的搜索,但找不到在此插件中执行此操作的示例。
好的,这越来越复杂了,所以我会写下完整的答案:
插件未以您可以挂接缩放事件的方式打开。实际上,您可以做的(因为您有开源)是 "hack" 内部 - 更改源代码并根据您的需要进行调整。
选项:
1.更改内部实现:
进入文件 ScalablePictureBoxImp.cs
,找到方法 ScalePictureBoxToFit()
,并在行后添加代码:
//some previous code
this.pictureBox.Left = left;
this.pictureBox.Top = top;
this.AutoScroll = true;
// add this line under:
this.AutoScrollPosition = new Point(this.Width / 2, this.Height / 2);
现在您可以像以前一样简单地使用该组件,它只需在中间调整它们的大小即可完成所有操作(可能需要更多数学运算才能正确适合屏幕)。
2。更改外部实现:
作者正在为内部实现使用包装器,他正在连接事件而您只是在使用包装的对象(这就像按下鼠标上的按钮而不是将一根电线与其他电线连接)。
在文件 ScalablePictureBox.cs
中编辑构造函数并添加以下实现:
public ScalablePictureBox()
{
//some code ...
this.pictureTracker.ScrollPictureEvent += new PictureTracker.ScrollPictureEventHandler(this.scalablePictureBoxImp.OnScrollPictureEvent);
this.pictureTracker.PictureTrackerClosed += new PictureTracker.PictureTrackerClosedHandler(this.pictureTracker_PictureTrackerClosed);
//Enter the line below to hook on event
this.scalablePictureBoxImp.ZoomRateChangedEvent += ScalablePictureBoxImp_ZoomRateChangedEvent;
}
现在你已经勾上了缩放事件,你只需要调整滚动:
private void ScalablePictureBoxImp_ZoomRateChangedEvent(int zoomRate, bool isFullPictureShown)
{
this.scalablePictureBoxImp.AutoScrollPosition = new Point(this.Width / 2, this.Height / 2);
}
ScalablePictureBox 的内部实现正在调用事件 ZoomRateChangedEvent
-> 一旦缩放发生变化,您将获得 window 的大小并将滚动按钮移动到中间位置。这可以按您需要的任何方式进行调整。
我相信,最初的作者只想写 ScalablePictureBoxImp
并且添加包装只是为了 test/simply 案例目的。这完全取决于您自己编写还是调整 -> 正确的方法应该是使用外部实现。
我正在尝试将 this plugin 用于 C#,效果很好。但是,放大时我很难让图像居中。默认情况下,无论何时缩放,图片框都会聚焦在左上角。我希望它集中在中心。
有什么想法吗?我进行了广泛的搜索,但找不到在此插件中执行此操作的示例。
好的,这越来越复杂了,所以我会写下完整的答案:
插件未以您可以挂接缩放事件的方式打开。实际上,您可以做的(因为您有开源)是 "hack" 内部 - 更改源代码并根据您的需要进行调整。
选项:
1.更改内部实现:
进入文件 ScalablePictureBoxImp.cs
,找到方法 ScalePictureBoxToFit()
,并在行后添加代码:
//some previous code
this.pictureBox.Left = left;
this.pictureBox.Top = top;
this.AutoScroll = true;
// add this line under:
this.AutoScrollPosition = new Point(this.Width / 2, this.Height / 2);
现在您可以像以前一样简单地使用该组件,它只需在中间调整它们的大小即可完成所有操作(可能需要更多数学运算才能正确适合屏幕)。
2。更改外部实现:
作者正在为内部实现使用包装器,他正在连接事件而您只是在使用包装的对象(这就像按下鼠标上的按钮而不是将一根电线与其他电线连接)。
在文件 ScalablePictureBox.cs
中编辑构造函数并添加以下实现:
public ScalablePictureBox()
{
//some code ...
this.pictureTracker.ScrollPictureEvent += new PictureTracker.ScrollPictureEventHandler(this.scalablePictureBoxImp.OnScrollPictureEvent);
this.pictureTracker.PictureTrackerClosed += new PictureTracker.PictureTrackerClosedHandler(this.pictureTracker_PictureTrackerClosed);
//Enter the line below to hook on event
this.scalablePictureBoxImp.ZoomRateChangedEvent += ScalablePictureBoxImp_ZoomRateChangedEvent;
}
现在你已经勾上了缩放事件,你只需要调整滚动:
private void ScalablePictureBoxImp_ZoomRateChangedEvent(int zoomRate, bool isFullPictureShown)
{
this.scalablePictureBoxImp.AutoScrollPosition = new Point(this.Width / 2, this.Height / 2);
}
ScalablePictureBox 的内部实现正在调用事件 ZoomRateChangedEvent
-> 一旦缩放发生变化,您将获得 window 的大小并将滚动按钮移动到中间位置。这可以按您需要的任何方式进行调整。
我相信,最初的作者只想写 ScalablePictureBoxImp
并且添加包装只是为了 test/simply 案例目的。这完全取决于您自己编写还是调整 -> 正确的方法应该是使用外部实现。