我需要绘制一个类似公交车站架构的图表:o-School----o-Church-------o-Police
所以,简单的线条和圆圈。我还需要放大它。
因为我有VS 2010,我认为WPF(据我所知它使用矢量化图形)应该是开始绘图的好画布。
是否可能,复杂,以及您对WPF初学者的推荐。
感谢。
编辑: 我可以为该行设置 DashStyle (dash-dot,dotDot ...)?
答案 0 :(得分:9)
这可以帮助您入门。它有一个包含几个形状的Canvas,以及一个允许您控制缩放的Slider控件。您可以根据需要在Canvas中添加其他元素。
<DockPanel>
<Slider x:Name="slider" Minimum=".1" Maximum="10" Value="1" DockPanel.Dock="Top"/>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Canvas Width="300" Height="300">
<Canvas.LayoutTransform>
<ScaleTransform ScaleX="{Binding ElementName=slider, Path=Value}"
ScaleY="{Binding ElementName=slider, Path=Value}"/>
</Canvas.LayoutTransform>
<Ellipse Canvas.Left="10" Canvas.Top="10" Width="20" Height="20"
Stroke="Black" StrokeThickness="1" Fill="Red"/>
<Line Canvas.Left="20" Canvas.Top="30" X1="0" X2="0" Y1="0" Y2="50"
Stroke="Black" StrokeThickness="1"/>
<Ellipse Canvas.Left="10" Canvas.Top="80" Width="20" Height="20"
Stroke="Black" StrokeThickness="1" Fill="Yellow"/>
</Canvas>
</Border>
</ScrollViewer>
</DockPanel>
修改强>:
要更改线条的短划线样式,只需设置StrokeDashArray属性即可。它允许您指定线条的样式。它遵循“段长度,间隙长度,段长度,间隙长度...”格式,因此设置此行:
<Line Canvas.Left="100" Canvas.Top="100" Stroke="Black"
X1="0" X2="100" Y1="0" Y2="0"
StrokeThickness="3" StrokeDashArray="2,2"/>
给你这个(即由一系列长度为2的段组成的行,后跟长度为2的间隙):
将StrokeDashArray设置为
StrokeDashArray="5,1,1,1"
为您提供点划线图案。
答案 1 :(得分:9)
您有一些使用Canvas并显示Zoom的示例,但是如果您只需要一行元素,则可以使用StackPanel并设置VerticalAlignment =“Center”,那么您不需要仅计算大小的位置线。
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<StackPanel.Resources>
<Style TargetType="Ellipse">
<Setter Property="Width" Value="20" />
<Setter Property="Height" Value="20" />
<Setter Property="Stroke" Value="Orange" />
<Setter Property="StrokeThickness" Value="3" />
</Style>
<Style TargetType="Line">
<Setter Property="Stroke" Value="DodgerBlue" />
<Setter Property="StrokeDashArray" Value="5,1,1,1,1,1" />
<Setter Property="StrokeThickness" Value="2" />
</Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="White" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Padding" Value="4" />
</Style>
<Style TargetType="Border" x:Key="Label">
<Setter Property="Background" Value="LimeGreen" />
<Setter Property="CornerRadius" Value="10" />
</Style>
</StackPanel.Resources>
<Ellipse />
<Border VerticalAlignment="Center">
<Line X2="50" />
</Border>
<Border Style="{StaticResource Label}">
<TextBlock Text="Home" />
</Border>
<Border VerticalAlignment="Center">
<Line X2="50" />
</Border>
<Ellipse />
<Border VerticalAlignment="Center">
<Line X2="50" />
</Border>
<Border Style="{StaticResource Label}">
<TextBlock Text="Church" />
</Border>
<Border VerticalAlignment="Center">
<Line X2="50" />
</Border>
<Ellipse />
<Border VerticalAlignment="Center">
<Line X2="20" />
</Border>
<Border Style="{StaticResource Label}">
<TextBlock Text="Police" />
</Border>
</StackPanel>
如果你需要做多个图表,你可以为每种类型的节点创建一个不同的DataTemplate,例如circle,road,label,并使用ItemsPatrol并设置ItemsPanelTemplate来做同样的事情。
答案 2 :(得分:1)
在WPF中绘制简单的形状很容易。您可以通过一些示例在Shapes命名空间中找到它们。
您的一个例子:
<Canvas>
<Ellipse Canvas.Top="0" Canvas.Left="0" Width="256" Height="256" />
<Line Canvas.Top="0" Canvas.Left="256" X1="0" Y1="0" X2="128" Y2=128" >
</Canvas>
答案 3 :(得分:1)
这应该不复杂,我会通过将Canvas放在Viewbox中来保持简单。增加画布的宽度和高度以缩小,并减小它们以放大。
<DockPanel>
<Viewbox DockPanel.Dock="Top" Width="100" Height="100" >
<Canvas Width="{Binding Path=Value, ElementName=TheZoomSlider}" Height="{Binding Path=Value, ElementName=TheZoomSlider}">
<Ellipse Stroke="Black" Canvas.Top="40" Canvas.Left="20" Width="20" Height="20" />
<Ellipse Stroke="Black" Canvas.Top="40" Canvas.Left="50" Width="20" Height="20" />
<Ellipse Stroke="Black" Canvas.Top="40" Canvas.Left="80" Width="20" Height="20" />
</Canvas>
</Viewbox>
<Slider Margin="0,400,0,0" HorizontalAlignment="Center" Orientation="Vertical" DockPanel.Dock="Bottom" Name="TheZoomSlider" Minimum="20" Maximum="800" Value="40" />
</DockPanel>