WPF 可缩放ScrollView(方式一)
public class ScaleScrollView : ScrollViewer
{
List<object> MouseWheelEvents = new List<object>();
/// <summary>
/// 通过监听此事件对内容进行缩放
/// </summary>
public event MouseWheelEventHandler MouseWheeled
{
add => MouseWheelEvents.Add(value);
remove => MouseWheelEvents.Remove(value);
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
}
protected override void OnMouseWheel(MouseWheelEventArgs e)
{
if (e.Handled) { return; }
if (ScrollInfo != null)
{
//Shift+滚动:上下滚动
//Ctrl+滚动:左右滚动
//滚动:放大缩小
if (Keyboard.IsKeyDown(Key.LeftShift))
{
if (e.Delta > 0)
ScrollInfo.MouseWheelUp();
else
ScrollInfo.MouseWheelDown();
}
else if (Keyboard.IsKeyDown(Key.LeftCtrl))
{
if (e.Delta > 0)
ScrollInfo.LineLeft();
else
ScrollInfo.MouseWheelRight();
}
else
{
foreach (var item in MouseWheelEvents)
{
(item as MouseWheelEventHandler)?.Invoke(this, e);
if (e.Handled) break;
}
}
}
e.Handled = true;
}
}
示例:
<local:ScaleScrollView HorizontalScrollBarVisibility="Visible" MouseWheeled="ScrollViewer_MouseWheel">
<Viewbox Name="viewbox">
<Border Width="2000" Height="2000" Background="Orange">
<Canvas>
<Rectangle Fill="Red" Width="1000" Height="1000"/>
</Canvas>
</Border>
</Viewbox>
</local:ScaleScrollView>
private void ScrollViewer_MouseWheel(object sender, MouseWheelEventArgs e)
{
if (viewbox == null) return;
double w = viewbox.ActualWidth + viewbox.ActualWidth * (e.Delta > 0 ? 1 : -1) / 100;
if (w >= 0)
viewbox.Width = w;
double h = viewbox.ActualHeight + viewbox.ActualHeight * (e.Delta > 0 ? 1 : -1) / 100;
if (h >= 0)
viewbox.Height = h;
}
配合Slider使用:
<Slider Name="sliderScale" Minimum="1" Value="100" Maximum="1000" SmallChange="1" LargeChange="50" ValueChanged="sliderScale_ValueChanged" Width="100"/>
private void ScrollViewer_MouseWheel(object sender, MouseWheelEventArgs e)
{
sliderScale.Value += e.Delta > 0 ? 1 : -1;
}
private void sliderScale_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (viewbox == null) return;
double w = viewbox.ActualWidth + viewbox.ActualWidth * (e.NewValue > e.OldValue ? 1 : -1) / 100;
if (w >= 0)
viewbox.Width = w;
double h = viewbox.ActualHeight + viewbox.ActualHeight * (e.NewValue > e.OldValue ? 1 : -1) / 100;
if (h >= 0)
viewbox.Height = h;
}