Tengo algún tipo de malentendido fundamental sobre cómo abordar este problema.¿Cómo puedo hacer que mi scrollviewer de WPF funcione con el zoom?
Tengo un lienzo dentro de un ScrollViewer. Me gustaría poder acercar y alejar ese lienzo y hacer que ScrollViewer se ajuste de forma adecuada.
Aquí está el código:
XAML:
<Window x:Class="scrollerProblem.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<ScrollViewer Name="scroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Canvas Background="AntiqueWhite" Name="content" MouseLeftButtonDown="content_MouseLeftButtonDown" MouseRightButtonDown="content_MouseRightButtonDown">
<Rectangle Width="100" Height="100" Canvas.Top="50" Canvas.Left="50" Fill="PaleGoldenrod"></Rectangle>
</Canvas>
</ScrollViewer>
</Window>
Y CodeBehind:
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
namespace scrollerProblem
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
float Zoom = 1;
public Window1()
{
InitializeComponent();
content.Width = 700;
content.Height = 700;
}
private void content_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
content.Width *= 2; // BLAH
content.Height *= 2; // BLAH
Zoom *= 2;
TransformGroup gridTransforms = new TransformGroup();
gridTransforms.Children.Add(new ScaleTransform(Zoom, Zoom));
gridTransforms.Children.Add(new TranslateTransform(0, 0));
content.RenderTransform = gridTransforms;
}
private void content_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
content.Width /= 2; // BLAH
content.Height /= 2; // BLAH
Zoom /= 2;
TransformGroup gridTransforms = new TransformGroup();
gridTransforms.Children.Add(new ScaleTransform(Zoom, Zoom));
gridTransforms.Children.Add(new TranslateTransform(0, 0));
content.RenderTransform = gridTransforms;
}
}
}
Si dejo fuera de las líneas marcadas con el "bla" las barras de desplazamiento no se ajustan a las todo ... lo cual no es demasiado sorprendente, ya que en realidad nada está cambiando el tamaño del contenido del lienzo. Sin embargo, si agrego las líneas BLAH, el lienzo se encoge/crece, pero también se escala al mismo tiempo, lo que significa que no se ve bien en comparación con su contenido.
Supongo que estoy adoptando un enfoque fundamentalmente incorrecto, pero no tengo claro cómo resolverlo. ¿Es este el camino correcto, con solo un problema menor, o estoy tomando el tacto completamente equivocado aquí?
¿No estaría cambiando el alto y el ancho afectando el tamaño de píxel real (en la pantalla) del ScrollViewer? Eso no es lo que trato de hacer. Quiero que ScrollViewer permanezca con el mismo tamaño visible ... pero que muestre las barras de desplazamiento cuando el contenido es demasiado grande (cuando la persona ha acercado el zoom lo suficiente). – Beska