ViewBox是WPF中非常有用的控件。如果只是缩放以使内容适合可用大小。它不会调整内容的大小,但会对其进行转换。
这可能是一个非常简单的问题,但是如何让 SVG 中的文本拉伸以适合其容器? 我不在乎它是否因拉得太长或太高而看起来很丑,但它需要适合它的
我使用剪辑路径(id:contour1-contourMask)在Plotly创建的轮廓SVG上定义德黑兰市的边界。这里是代码:https://codepen.io/mojtaba_codepen/pen/abeKJRX 虽然它...
我想制作一个仅缩放其高度的Viewbox(或类似的东西),然后水平拉伸其内容。 如果我这样做: 福 我想制作一个 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> 它肯定需要一些工作,但这可能会让你开始。 保持宽度正常工作: 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; foreach (UIElement child in Children) { unlimitedSize.Width = availableSize.Width / scale; child.Measure(unlimitedSize); } return availableSize; } 我很确定答案是“不容易”。 这是一个似乎可行但有点笨拙的想法: 将 StackPanel 放入 UserControl(下例中的 UserControl1)。 将此 UserControl 的两个副本放入容器(下例中的网格)中。 a.将第一个副本顶部/左侧对齐,使其保持默认大小。该副本严格用于测量目的,应将其可见性设置为隐藏。 b.将第二个副本放入视图框内。该副本是用户实际看到的副本。 使用带有 MultiValueConverter 的 MultiBinding 来调整第二个 UserControl 的宽度,使其在 被 Viewbox 展开之前具有正确的宽高比。 这是标记: <Grid> <local:UserControl1 x:Name="RawControl" HorizontalAlignment="Left" VerticalAlignment="Top" Visibility="Hidden" /> <Viewbox> <local:UserControl1> <local:UserControl1.Width> <MultiBinding Converter="{StaticResource WidthAdjuster}"> <Binding ElementName="RawControl" Path="ActualHeight" /> <Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth" /> <Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualHeight" /> </MultiBinding> </local:UserControl1.Width> </local:UserControl1> </Viewbox> </Grid> 这是多值转换器 public class WidthAdjuster : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { var rawHeight = (double)values[0]; var containerWidth = (double)values[1]; var containerHeight = (double)values[2]; var ratio = containerWidth / containerHeight; return rawHeight * ratio; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 525 x 350 容器的结果 我有一个几乎类似的问题。我的面板必须适合所有子面板,将它们排成一排并拉伸它们,均匀地填充面板。上面的算法使用渲染变换来缩放元素。问题是渲染变换会拉伸子项本身,但忽略边距。如果边距较高且比例系数低于 1,则元素会从面板中脱落。您必须根据该轴上的边距校正 RenderTransform 的比例,并使用相同的比例系数进行排列。我使用的MeasureOverride是 protected override Size MeasureOverride(Size availableSize) { double width = 0; double maxHeight = 0; double mY=0; double mX=0; Size unlimitedSize = new Size(double.PositiveInfinity, double.PositiveInfinity); foreach (UIElement child in Children) { child.Measure(unlimitedSize); width += child.DesiredSize.Width; maxHeight = Math.Max(maxHeight, child.DesiredSize.Height); FrameworkElement cld = child as FrameworkElement; mY = cld.Margin.Top + cld.Margin.Bottom; mX = cld.Margin.Left + cld.Margin.Right; } double scaleX = availableSize.Width / width; double scaleY = availableSize.Height / maxHeight; //That is scale for arranging positionScaling = Math.Min(scaleX, scaleY); try { // Let FrameworkElement hight be Xn. mY = Element.Margin.Top + Element.Margin.bottom. // DesiredSize includes margin therefore: // (Yn + mY) * scaleY = availableSize.Height // But render transform doesn't scales margin. Actual render height with margin will be // Yn * RenderScaleY + mY = availableSize.Height; // We must find render transform scale coeff like this: double yn = availableSize.Height / scaleY - mY; scaleY = (availableSize.Height - mY) / yn; double xn = availableSize.Width / scaleX - mX; scaleX = (availableSize.Width - mX) / xn; scale = Math.Min(scaleX, scaleY); //scale to use in RenderTransform // In my project all children are similar in size and margin, algorithm BREAKS otherwise!!! } catch { scale = 1; } return availableSize; } 再一次:在我的项目中,所有子项的大小和边距都相似,否则算法会崩溃。 除了Rick Sladkey的回答之外,当所有元素的总高度变得太小并且水平方向发生尺寸过大,使得元素在右侧被切割时,这里有一个测量方法的小修复: 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; foreach (UIElement child in Children) { var childDesireWidth = child.DesiredSize.Width; if (childDesireWidth * scale > availableSize.Width) scale = availableSize.Width / childDesireWidth; } return availableSize; }
我正在创建一个程序来告诉用户他的帐户余额之类的东西。我在带有 ViewBox 的网格上显示此信息(因此可以将其大小调整为任何屏幕分辨率),问题是......
如何使 SVG Overlay 的 viewBox 与下面的图像大小相同?
我想使用Python NiceGUI 库构建一个小型GUI。 对于我的应用程序,我使用网格元素将界面分为两列。这很好用。左边有带有
当 viewBox 从 0 开始时,为什么 y=0 不会将 svg-circle 粘到顶部
它基本上有一个小的 html 文件,其中包含以下 html: ...
元素允许有一个viewBox和一个preserveAspectRatio属性,它们共同决定了屏幕上显示的实际viewbox。 viewBox 属性指定一个
这是我的 HTML: * { 框大小:边框框; } .side-svg { 宽度:200px; 高度:200px; 边框:1px 红色实心; } .sto{ 身高:...
我有非常大的铁路轨道作为svg路径中的路径...但我想将轨道分成4部分并一一显示...请建议我一个角度代码 我尝试将值分成 4 和
我为了让客户满意而奋斗了很长时间,找到了解决方案。我使用 svg sprites 和标签在 css 中插入图标。它工作得很好,但改变分辨率显然会破坏
我想使用鼠标滚轮控制缩放比例并使用SVG的viewBox属性来变换图像,从而在SVG图像上创建缩放效果。 用鼠标滚轮缩放后,我...
我的页面上有一个 SVG,它是视口的完整高度,并且比视口更宽。非常全景。我有一个 HTML 元素,位于移动设备页面的中心,就像右边一样...
我试图从头开始创建一个 svg 以便稍后制作一个很酷的笔划线动画,问题是我创建的形状超出了视图屏幕并且不容易操作。 我想...
每按一次按钮都应该替换矩形内的现有文本和id。同时在视图框中保留以前的形状和文本。相反,它只是替换了现有的形状和id ...
我正在尝试使用click()方法移动SVG对象,但是该对象没有移动到我想要移动的位置。我希望我的对象精确移动到单击用户屏幕的位置!看看什么...
使用PanResponder在React Native中解决SVG viewBox的问题
我正在尝试使SVG元素在内部可拖动,但是PanResponder无法解决SVG viewBox导致拖动的元素不跟随屏幕周围的触摸的问题。我试过利用...
我需要一些有关在HTML视图框中缩放SVG的帮助。我正在为网站使用HTML模板,并且希望将模板的标准SVG图像更改为另一图像。我无法获得...
我需要始终将XAML对象按1:1比例缩放,或者至少将imagebrush的内容缩放,即使它的父对象在视图框中并且该内容在X方向上也被压缩。例如:...
无法在SVG.js中绘制。可能在.viewBox()调用中做错了吗?
创建SVG元素:var draw = SVG('drawing')。size(window.innerWidth,window.innerHeight); draw.viewbox(0,0,100,100);我认为问题出在那儿。当我尝试稍后再画一个点时...