X3

RedSky

导航

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;
}

 

posted on 2022-03-22 10:04  HotSky  阅读(504)  评论(0编辑  收藏  举报