【问题标题】:Stuck when zooming image with slider in WPF在 WPF 中使用滑块缩放图像时卡住
【发布时间】:2015-07-28 09:15:01
【问题描述】:

我最近构建了一些用于显示图像的 WPF 应用程序。此应用程序使用画布显示图像。并且该画布放置在 ScrollView 内。我需要使用滑块中的值缩小和放大图像。当图像的比例小于 ScrollView 的宽度时,一切正常。但是,当图像的比例接近 ScrollView 宽度或更大时,WPF 应用程序会卡住,并且在输出控制台中显示错误,例如“线程 0x214c 已退出,代码为 259 (0x103)”。

这是我缩放图像的代码:

private void Zoom(double m)
    {
        if (this.img != null && this.img.Source != null)
        {
            double temp = defaultScale * m;

            double ww = img.Source.Width * temp;
            double hh = img.Source.Height * temp;

            drawingCanvas.Width = ww;
            drawingCanvas.Height = hh;

            this.img.RenderTransform = new ScaleTransform(temp, temp); 
        }
    }

XAML代码的结构是

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="DragNDrop2.MainWindow"
        Title="MainWindow" Height="448" Width="693">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="0*"/>
        </Grid.RowDefinitions>
        <Button Content="DRAW" HorizontalAlignment="Left" VerticalAlignment="Top" Width="95" RenderTransformOrigin="-0.76,0.455" Height="26" Click="DrawImage" Margin="98,0,0,0"/>
        <Button Content="OPEN" HorizontalAlignment="Left" VerticalAlignment="Top" Width="93" Height="26" Click="OpenImage"/>
        <StackPanel Margin="0,31,0,0">
            <ScrollViewer x:Name="canvasViewer" HorizontalAlignment="Left" Height="377" VerticalAlignment="Top" Width="675" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
                <Canvas x:Name="drawingCanvas" Height="258" VerticalAlignment="Top" Width="414" />
            </ScrollViewer>
        </StackPanel>
        <Slider x:Name="scaleSlider" HorizontalAlignment="Left" Margin="211,4,0,0" VerticalAlignment="Top" Width="296" ValueChanged="scaleSlider_ValueChanged" Value="5.0" TickFrequency="0.01"/>

    </Grid>
</Window>

直到现在我都无法弄清楚为什么会发生这种情况。我尝试了一切,但我仍然不明白出现该错误的原因。

我在 youtube 上发布了一些视频来形象化这一点 https://youtu.be/CwLeYHMrW30

以及我在 google drive 上发布的完整源代码: https://drive.google.com/file/d/0B1irLqfPwjq0eVYyQnVvNC1qYUE/view?usp=sharing

如果有解决此问题(或解释)的方法,我将不胜感激。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    也许你应该检查这个解决方案:

    <Slider HorizontalAlignment="Left" Minimum="x" Maximum="y" x:Name="ZoomInput"  ValueChanged="ZoomInput_OnValueChanged"/>
    
    private void ZoomInput_OnValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        ImageScaleTransform.ScaleX = e.NewValue;
        ImageScaleTransform.ScaleY = e.NewValue;
        CanvasScaleTransform.ScaleX = e.NewValue;
        CanvasScaleTransform.ScaleY = e.NewValue;
        SetImagePosiotionInBounds();
    }
    

    对于画布和图像添加 ScaleTransform:

    <Canvas x:Name="drawingCanvas" Height="258" VerticalAlignment="Top" Width="414">
        <Canvas.RenderTransform>
            <ScaleTransform x:Name="CanvasScaleTransform"></ScaleTransform>
        </Canvas.RenderTransform>
    </Canvas>
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多