创建一个允许缩放和平移的 WPF 窗口

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22489400/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 11:15:37  来源:igfitidea点击:

Creating a WPF Window that allows zooming and panning

wpfvb.net

提问by hendersondayton

I want to create a Window that will hold several controls. However, I would like the user to be able to pan around and zoom in and out to see larger versions of those controls.

我想创建一个包含多个控件的窗口。但是,我希望用户能够平移和放大和缩小以查看这些控件的更大版本。

I don't even know where to begin looking.

我什至不知道从哪里开始寻找。

I was going to start at ScaleTransform that responds to the use of the scroll button on the mouse but I am not sure if that is the best idea.

我打算从 ScaleTransform 开始,它响应鼠标上滚动按钮的使用,但我不确定这是否是最好的主意。

Just need a push in the right direction.

只需要朝着正确的方向推动。

thanks!

谢谢!

回答by d.moncada

This might be a good candidate for a Viewbox.

这可能是Viewbox.

See here: http://msdn.microsoft.com/en-us/library/system.windows.controls.viewbox(v=vs.110).aspx

请参阅此处:http: //msdn.microsoft.com/en-us/library/system.windows.controls.viewbox(v=vs.110).aspx

Basically, you can Wrap the entire contents of the Window into a Viewboxlike so:

基本上,您可以将 Window 的整个内容包装成Viewbox这样:

<Window>
   <Viewbox>
       <!-- content here -->
   </Viewbox>
</Window>

and then bind to the Viewboxcontrol's width and height to simulate the zooming. For a quick test, you could just listen to scroll wheel events via code-behind, name the Viewbox control, and access the Viewbox directly at change the values there.

然后绑定到Viewbox控件的宽度和高度来模拟缩放。为了快速测试,您可以通过代码隐藏监听滚轮事件,命名 Viewbox 控件,并在更改那里的值时直接访问 Viewbox。

Edit: here's a scenario I just found to get you started. They are using an image, but it's the exact same concept that I described above.

编辑:这是我刚刚发现的一个场景,可以帮助您入门。他们正在使用图像,但它与我上面描述的概念完全相同。

http://www.c-sharpcorner.com/uploadfile/yougerthen/working-with-wpf-viewbox-control/

http://www.c-sharpcorner.com/uploadfile/yougerthen/working-with-wpf-viewbox-control/

Edit2: Quick working example using mouse-scroll

Edit2:使用鼠标滚动的快速工作示例

Xaml:

Xml:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        MouseWheel="MainWindow_OnMouseWheel">
    <Grid>
        <Viewbox x:Name="ZoomViewbox" Stretch="Fill">
            <StackPanel>
                <Label Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" />
            </StackPanel>
        </Viewbox>
    </Grid>
</Window>

C#:

C#:

using System.Windows;
using System.Windows.Input;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ZoomViewbox.Width = 100;
            ZoomViewbox.Height = 100;
        }

        private void MainWindow_OnMouseWheel(object sender, MouseWheelEventArgs e)
        {
            UpdateViewBox((e.Delta > 0) ? 5 : -5);
        }

        private void UpdateViewBox(int newValue)
        {
            if ((ZoomViewbox.Width >= 0) && ZoomViewbox.Height >= 0)
            {
                ZoomViewbox.Width += newValue;
                ZoomViewbox.Height += newValue;   
            }
        }
    }
}

回答by Michael Gunter

You can get functionality out of a ScrollViewer and a ScaleTransform. Here's an example:

您可以从 ScrollViewer 和 ScaleTransform 中获得功能。下面是一个例子:

<Window x:Class="CSharpWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <!-- This ScrollViewer enables the panning -->
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">

            <!-- This StackPanel is the container for the zoomable/pannable content. -->
            <!-- Any container control (StackPanel, DockPanel, Grid, etc) may be used here. -->
            <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">

                <!-- This ScaleTransform implements the zooming and is bound the Value of the ZoomSlider -->
                <StackPanel.LayoutTransform>
                    <ScaleTransform ScaleX="{Binding ElementName=ZoomSlider, Path=Value}" ScaleY="{Binding ElementName=ZoomSlider, Path=Value}" />
                </StackPanel.LayoutTransform>

                <!-- Here is your custom content -->
                <Button>Foo</Button>
                <Button>Bar</Button>

            </StackPanel>

        </ScrollViewer>

        <!-- This Slider controls the zoom level -->
        <Slider x:Name="ZoomSlider" Orientation="Horizontal" Grid.Row="1" Minimum="0.0" Maximum="8.0" LargeChange="0.25" SmallChange="0.01"  Value="1.0" />

    </Grid>


</Window>