将 ScaleTransform 限制为最大高度和宽度

Limit ScaleTransform to a maximum height and width

有没有办法限制 ScaleTransform 的最大高度和宽度?

我有一个 Viewbox,背景 Image 设置为拉伸到 "None"。在这个 Viewbox 中,我还有一个 ItemsControlCanvas 上显示较小的图像。由于操作员可以选择背景图像,因此图像的像素大小可能会有所不同,因此操作员需要能够相应地缩放较小的图像。

但是,如果在中等大小的背景图像上将比例因子设置得非常大,或者背景图像的尺寸很小,ItemsControl 图像最终会溢出容器并阻塞其他功能。

那么如何设置 ScaleTransform 的限制?

XAML:

<Viewbox Grid.Column="1">
    <Grid>
        <Image Source="{Binding Path=BackgroundImage}" Stretch="None" />
        <ItemsControl ItemsSource="{Binding Path=ThrusterCollection}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemContainerStyle>
                <Style TargetType="{x:Type ContentPresenter}">
                    <Setter Property="Canvas.Bottom" Value="{Binding Path=CanvasYPosition}" />
                    <Setter Property="Canvas.Left" Value="{Binding Path=CanvasXPosition}" />
                    <Setter Property="LayoutTransform">
                        <Setter.Value>
                            <ScaleTransform ScaleX="{Binding Path=ParentRovIllustration.ThrusterImageScale}" 
                                            ScaleY="{Binding Path=ParentRovIllustration.ThrusterImageScale}" />
                        </Setter.Value>
                    </Setter>
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Image Source="{Binding Path=ThrusterImage}" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ItemsControl.ItemContainerStyle>
        </ItemsControl>
    </Grid>
</Viewbox>

截图:

根据 Clemens' 的评论,在代码中进行限制工作正常。我刚刚计算了滑块的最大缩放值,基于最大的较小图像(推进器)被缩放到背景图像宽度的一半。这最终成为我的解决方案。

C#:

private string _backgroundImageFilePath;
public string BackgroundImageFilePath {
    get { return _backgroundImageFilePath; }
    set {
        SetNotify(ref _backgroundImageFilePath, value);
        try {
            BackgroundImage = new BitmapImage(new Uri(BackgroundImageFilePath));
        }
        catch (FileNotFoundException) {
            BackgroundImage = ImageNotFoundBitmapImage;
        }
        catch (Exception) {
            BackgroundImage = ImageInvalidBitmapImage;
        }
        ThrusterImageMaximumScale = BackgroundImage.Width / (2 * RovIllustrationThruster.VerticalThrusterBitmapImage.Width);
        ThrusterImageMaximumScale = Math.Round(ThrusterImageMaximumScale, 1);
        if (ThrusterImageScale > ThrusterImageMaximumScale) {
            ThrusterImageScale = ThrusterImageMaximumScale;
        }
        ConfigurationHandler.IsDirty = true;
    }
}