将 ScaleTransform 限制为最大高度和宽度
Limit ScaleTransform to a maximum height and width
有没有办法限制 ScaleTransform
的最大高度和宽度?
我有一个 Viewbox
,背景 Image
设置为拉伸到 "None"。在这个 Viewbox
中,我还有一个 ItemsControl
在 Canvas
上显示较小的图像。由于操作员可以选择背景图像,因此图像的像素大小可能会有所不同,因此操作员需要能够相应地缩放较小的图像。
但是,如果在中等大小的背景图像上将比例因子设置得非常大,或者背景图像的尺寸很小,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;
}
}
有没有办法限制 ScaleTransform
的最大高度和宽度?
我有一个 Viewbox
,背景 Image
设置为拉伸到 "None"。在这个 Viewbox
中,我还有一个 ItemsControl
在 Canvas
上显示较小的图像。由于操作员可以选择背景图像,因此图像的像素大小可能会有所不同,因此操作员需要能够相应地缩放较小的图像。
但是,如果在中等大小的背景图像上将比例因子设置得非常大,或者背景图像的尺寸很小,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;
}
}