image
内部にaがborder
あり、画像ソースのさまざまな部分をさまざまな時間に画像ボックスに表示したいと思います。具体的には、特定のテキストボックスにフォーカスが移ったときに、画像コンテンツの特定の部分にズームするように画像を変更したいと思います。
XAMLは次のとおりです。
<Border BorderBrush="Silver" BorderThickness="1" Grid.Column="5" Height="504"
HorizontalAlignment="Left" Margin="20,116,0,0" Name="border1"
VerticalAlignment="Top" Width="410" ClipToBounds="True">
<Image Height="493" Name="image5" Stretch="Fill" Width="390"
ClipToBounds="True" BindingGroup="{Binding}"
Clip="{Binding ElementName=border1}"
Cursor="Hand" StretchDirection="Both" />
</Border>
たとえば、私の画像ソースは2550x3320ピクセルです。ボックスに、ポイント1755,300から始まり、幅650、高さ230の長方形でソースを表示したいimage
と思います。手動ズームセットもあるため、CloneBitmapを使用してその長方形を切り取って表示したくありません。これimage
は、ユーザーがマウスホイールを使用してズームインおよびズームアウトし、クリック&ドラッグして画像をパンできる場所です。希望の領域にズームした後でも、それを許可したいと思います。
更新: colinsmithの回答を実装しようとしましたが、scrollviewerのオフセットを変更すると画像が切り刻まれるので、後で移動(クリックしてドラッグしてパン)すると、空のスペースになります。以前はscrollviewer内の画像だけでこれを機能させていましたが、現在は境界線内のscrollviewer内に画像があります。ズームとパンには境界線が必要です。これで設定しました。
更新されたXAML:
<Border BorderBrush="Silver" BorderThickness="1" Grid.Column="5" Height="504"
HorizontalAlignment="Left" Margin="20,116,0,0" Name="border1"
VerticalAlignment="Top" Width="410" ClipToBounds="True">
<ScrollViewer x:Name="image5scroll" VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Hidden">
<Image Height="493" Name="image5" Stretch="Fill" Width="390"
ClipToBounds="True" BindingGroup="{Binding}"
Clip="{Binding ElementName=image5scroll}" Cursor="Hand"
StretchDirection="Both" />
</ScrollViewer>
</Border>
そして背後にあるコード:
public void imageZoom(Element element, int index)
{
if (element.Rectangle.Left - 100 > 0)
{
image5scroll.ScrollToHorizontalOffset(element.Rectangle.Left - 100);
image5scroll.Width = element.Rectangle.Width + 200;
image5scroll.Height = element.Rectangle.Height + 200;
border1.Width = image5scroll.Width;
border1.Height = image5scroll.Height;
image5.Width = image5scroll.Width;
image5.Height = image5scroll.Height;
image5.Stretch = System.Windows.Media.Stretch.None;
}
else
{
image5scroll.ScrollToHorizontalOffset(0);
}
if (element.Rectangle.Top - 100 > 0)
{
image5scroll.ScrollToVerticalOffset(element.Rectangle.Top - 100);
}
else
{
image5scroll.ScrollToVerticalOffset(0);
}
}