0

我在 ScrollViewer 中有一个图像。当我将图像宽度设置得更大时,出现了 Horizo​​ntalScrollBar。然后我将图像宽度设置为小于 ScrollViewer With 但此 ScrollBar 仍然出现,如下所示:

                IMG
我该如何解决这个问题?谢谢!

<Grid>
    <ScrollViewer
        Name="sv"
        HorizontalScrollBarVisibility="Auto"
        VerticalScrollBarVisibility="Auto"
        PreviewMouseWheel="sv_PreviewMouseWheel">
        <Image Name="img"/>
    </ScrollViewer>
</Grid>

代码:

    void sv_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        if ((System.Windows.Forms.Control.ModifierKeys & System.Windows.Forms.Keys.Control) != System.Windows.Forms.Keys.Control) base.OnMouseWheel(e);
        else
        {
            if (e.Delta > 0)
            {
                if (img.ActualHeight < img.Source.Height * 5)
                {
                    double h2 = img.Height = img.ActualHeight * 1.1;
                    double w2 = img.Width = img.Source.Width * h2 / img.Source.Height;
                }
            }

            // PROBLEM HERE:

            else if (img.ActualHeight > 100) img.Height = img.ActualHeight / 1.1;
        }
    }
4

1 回答 1

3

问题是您在缩小图像时没有设置Image控件的属性。Width图像控件实际上自动保持纵横比(该Stretch属性Uniform默认设置为)。但是,当图像调整大小时,控件本身会保持您在放大期间设置的大小。另请注意,我已更正您的修饰键检查以使用 WPF 而不是 Windows 窗体:

void sv_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control))
    {
        double? h2 = null;
        if (e.Delta > 0)
        {
            if (img.ActualHeight < img.Source.Height * 5)
            {
                h2 = img.Height = img.ActualHeight * 1.1;
            }
        }
        else if (img.ActualHeight > 100)
        {
          h2 = img.Height = img.ActualHeight / 1.1;
        }

        if (h2 != null)
        {
             img.Width = img.Source.Width * h2.Value / img.Source.Height;
        }
    }
}

另一种解决方案是使用变换来缩放图像。

XAML

<Image Name="img"
       HorizontalAlignment="Center"
       VerticalAlignment="Center">
    <Image.LayoutTransform>
        <ScaleTransform x:Name="imageScale" />
    <Image.LayoutTransform>
</Image>

C#

void sv_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control))
    {
        e.Handled = true; // stops scrolling due to wheel

        if (e.Delta > 0)
        {
            if (imageScale.ScaleX < 5)
            {
                imageScale.ScaleX *= 1.1;
                imageScale.ScaleY *= 1.1;
            }
        }
        else
        {
            imageScale.ScaleX /= 1.1;
            imageScale.ScaleY /= 1.1;
        }
    }
}

您也可以使用其他变换,例如旋转。在MSDN上阅读有关它的更多信息。

于 2013-10-21T06:46:18.497 回答