使Viewbox垂直缩放但水平拉伸 [英] Making a Viewbox scale vertically but stretch horizontally
问题描述
我想制作一个只缩放其高度的Viewbox(或类似的东西),然后水平拉伸其内容.
如果我这样做:
<Viewbox>
<StackPanel>
<Button>Foo</Button>
<Button>Bar</Button>
</StackPanel>
</Viewbox>
然后我得到了:
(来源: excastle.com ) >
这就像两个按钮都具有HorizontalAlignment ="Center"一样,然后缩放结果.但是我不希望HorizontalAlignment ="Center".我想要HorizontalAlignment ="Stretch",就像这样:
(来源: excastle.com ) >
因此,我希望它读取其内容的所需高度,仅根据高度计算缩放比例,然后允许缩放后的内容水平拉伸.
是否可以使用Viewbox和/或某些第三方面板来完成此操作?
WPF不包含此类控件,但是您可以自己编写,而不会遇到太多麻烦.这是一个具有您要求的自定义ViewboxPanel:
public class ViewboxPanel : Panel
{
private double scale;
protected override Size MeasureOverride(Size availableSize)
{
double height = 0;
Size unlimitedSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
foreach (UIElement child in Children)
{
child.Measure(unlimitedSize);
height += child.DesiredSize.Height;
}
scale = availableSize.Height / height;
return availableSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
Transform scaleTransform = new ScaleTransform(scale, scale);
double height = 0;
foreach (UIElement child in Children)
{
child.RenderTransform = scaleTransform;
child.Arrange(new Rect(new Point(0, scale * height), new Size(finalSize.Width / scale, child.DesiredSize.Height)));
height += child.DesiredSize.Height;
}
return finalSize;
}
}
,您可以这样使用它:
<local:ViewboxPanel>
<Button>Foo</Button>
<Button>Bar</Button>
</local:ViewboxPanel>
它肯定需要一些工作,但这可能会让您入门.
I want to make a Viewbox (or something similar) that scales only its height, and then stretches its content horizontally.
If I do this:
<Viewbox>
<StackPanel>
<Button>Foo</Button>
<Button>Bar</Button>
</StackPanel>
</Viewbox>
then I get this:
(source: excastle.com)
It acts as if both of the buttons had HorizontalAlignment="Center", and then scales the result. But I don't want HorizontalAlignment="Center"; I want HorizontalAlignment="Stretch", like this:
(source: excastle.com)
So I want it to read its contents' desired height, calculate a scaling factor based only on the height, and then allow the scaled content to stretch horizontally.
Is there any way to accomplish this using the Viewbox, and/or some third-party panel?
There is no such control include with WPF but you can write one yourself without too much trouble. Here is a custom ViewboxPanel that has your specifications:
public class ViewboxPanel : Panel
{
private double scale;
protected override Size MeasureOverride(Size availableSize)
{
double height = 0;
Size unlimitedSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
foreach (UIElement child in Children)
{
child.Measure(unlimitedSize);
height += child.DesiredSize.Height;
}
scale = availableSize.Height / height;
return availableSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
Transform scaleTransform = new ScaleTransform(scale, scale);
double height = 0;
foreach (UIElement child in Children)
{
child.RenderTransform = scaleTransform;
child.Arrange(new Rect(new Point(0, scale * height), new Size(finalSize.Width / scale, child.DesiredSize.Height)));
height += child.DesiredSize.Height;
}
return finalSize;
}
}
and you use it like this:
<local:ViewboxPanel>
<Button>Foo</Button>
<Button>Bar</Button>
</local:ViewboxPanel>
It definitely needs some work but this might get you started.
这篇关于使Viewbox垂直缩放但水平拉伸的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!