C# 使用Viewbox缩放/拉伸在WPF中保持固定厚度线
我有一个C# 使用Viewbox缩放/拉伸在WPF中保持固定厚度线,c#,wpf,antialiasing,viewbox,C#,Wpf,Antialiasing,Viewbox,我有一个,其中包含一些垂直和水平s。我希望网格可以根据窗口大小进行伸缩,并保留其纵横比,因此它包含在中 但是,我还希望线条始终以1像素的宽度渲染,因此我使用: Line line = new Line(); line.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); // other line settings here... 这使得线条的初始外观非常理想,但一旦开始调整窗口大小,拉伸/缩放就会开始,线条将再次变为1和2像素
,其中包含一些垂直和水平
s。我希望网格可以根据窗口大小进行伸缩,并保留其纵横比,因此它包含在
中
但是,我还希望线条始终以1像素的宽度渲染,因此我使用:
Line line = new Line();
line.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
// other line settings here...
这使得线条的初始外观非常理想,但一旦开始调整窗口大小,拉伸/缩放就会开始,线条将再次变为1和2像素厚的混合体
有没有办法使线条始终为1像素厚,并允许调整窗口/网格的大小
更新-根据克莱门斯的建议使用路径几何图形
@克莱门斯-感谢您突出显示线和路径之间的渲染差异。当我试图用你的例子重新编写我的代码时,我有一种沉闷的感觉,我在为自己挖更多的洞,而不是真正理解整个概念(完全是我的错,不是你的错,我只是新加入WPF)
我将添加一些屏幕截图来说明以下描述:
我正在制作一个游戏板(用于的游戏,以防有助于理解布局)。我有一个9x9的网格,我计划通过简单地在一个特定的网格单元中添加一个椭圆来放置游戏棋子
然而,为了在电路板上绘制基础线,我需要在电路板上绘制与单元中间相交的线(在Go中,工件放置在交叉点上,而不是单元中间)
很可能是我采取了完全错误的方法,请随时告诉我从另一条路线重新开始,而不是在当前的结构中进行黑客攻击
到目前为止,我就是这样做的(由于坐标的计算方式,我以编程方式添加路径。不确定是否可以在XAML中完成):
XAML:
C#:
int cols=9;
int行=9;
//画水平线
对于(int row=0;row
这就是我在使用上述代码时得到的结果
这就是我想要的样子。这又给我提出了两个问题:
1) 在计算x1
、x2
、y1
和y2
值时,我是否采取了正确的方法,通过将它们除以电路板总宽度来创建一个介于0和1之间的数字,从而可以对它们应用ScaleTransform
2) 现在我不再使用Viewbox
,如何实现固定比率缩放?如果我放大我的窗口,电路板就会超出比例(见下图)。(不过,它不再对行进行反别名处理,这很好。)
我知道这是一个有点铁板一块的帖子。非常感谢您的耐心和回复。一个视图框只能“视觉”缩放其子元素,包括任何渲染笔划的厚度。您需要的是仅应用于线(或其他形状)几何体的缩放,但不影响笔划
不使用Line
对象,您可以通过对其属性使用transformed的对象绘制直线。通过使用栅格的宽度和高度作为x和y方向的比例因子,可以创建从逻辑坐标缩放到视口坐标的栅格。每个线条几何体(或任何其他几何体)将使用0..1范围内的逻辑坐标:
<Grid x:Name="grid">
<Grid.Resources>
<ScaleTransform x:Key="transform"
ScaleX="{Binding ActualWidth, ElementName=grid}"
ScaleY="{Binding ActualHeight, ElementName=grid}"/>
</Grid.Resources>
<Path Stroke="Black" StrokeThickness="1">
<Path.Data>
<LineGeometry StartPoint="0.1,0.1" EndPoint="0.9,0.9"
Transform="{StaticResource transform}"/>
</Path.Data>
</Path>
</Grid>
您还可以从宽度和高度的最小值计算均匀比例因子,后面有一点代码:
<Grid x:Name="grid" SizeChanged="grid_SizeChanged">
<Grid.Resources>
<ScaleTransform x:Key="transform"/>
</Grid.Resources>
...
</Grid>
请发布屏幕截图。我已经编辑了问题并添加了屏幕截图。有关如何实现均匀缩放,请参阅我编辑的答案。感谢您澄清几何体渲染中的差异。我已经用路径重新编写了代码,并用我的发现编辑了我的原始问题。ScaleTransform上的绑定已经就绪,我已经实现了SizeChanged处理程序,但是在调整窗口大小时,网格仍然没有固定的比例拉伸。我想我们讨论的是如何保持线条的粗细,而不是总体布局。无论如何,为了保持栅格为方形,例如,可以将其高度绑定到其实际宽度。根据你的总体布局,实现这一目标的方法当然不止一种。是的,现在你说出来似乎很明显:)谢谢。
<Grid x:Name="grid">
<Grid.Resources>
<ScaleTransform x:Key="transform"
ScaleX="{Binding ActualWidth, ElementName=grid}"
ScaleY="{Binding ActualHeight, ElementName=grid}"/>
</Grid.Resources>
<Path Stroke="Black" StrokeThickness="1">
<Path.Data>
<LineGeometry StartPoint="0.1,0.1" EndPoint="0.9,0.9"
Transform="{StaticResource transform}"/>
</Path.Data>
</Path>
</Grid>
<Grid x:Name="grid">
<Grid.Resources>
<ScaleTransform x:Key="transform"
ScaleX="{Binding ActualWidth, ElementName=grid}"
ScaleY="{Binding ActualWidth, ElementName=grid}"/>
</Grid.Resources>
...
</Grid>
<Grid x:Name="grid" SizeChanged="grid_SizeChanged">
<Grid.Resources>
<ScaleTransform x:Key="transform"/>
</Grid.Resources>
...
</Grid>
private void grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
var transform = grid.Resources["transform"] as ScaleTransform;
var minScale = Math.Min(grid.ActualWidth, grid.ActualHeight);
transform.ScaleX = minScale;
transform.ScaleY = minScale;
}