在WPF中画一个十字

时间:2012-04-13 17:16:11

标签: .net wpf wpf-controls

我有一个WPF控件。

我需要在背景中有一个十字架,如下所示:
enter image description here

之后,我可以在“交叉”背景上添加其他控件: enter image description here

我应该如何绘制十字架,知道当我重新控制控制时,十字架应该遵循它的大小?

5 个答案:

答案 0 :(得分:13)

快速而肮脏的方法是使用线条并将其坐标绑定到某个父容器的宽度和高度。像这样:

<Grid Name="parent">
    <Line  X1="0" Y1="0" X2="{Binding ElementName='parent', Path='ActualWidth'}" Y2="{Binding ElementName='parent', Path='ActualHeight'}" 
           Stroke="Black" StrokeThickness="4" />
    <Line  X1="0" Y1="{Binding ElementName='parent', Path='ActualHeight'}" X2="{Binding ElementName='parent', Path='ActualWidth'}" Y2="0" Stroke="Black" StrokeThickness="4" />
</Grid>

使用网格作为父级意味着任何其他子项添加到网格后行将出现在行顶部:

<Grid Name="parent">
    <Line  X1="0" Y1="0" X2="{Binding ElementName='parent', Path='ActualWidth'}" Y2="{Binding ElementName='parent', Path='ActualHeight'}" 
           Stroke="Black" StrokeThickness="4" />
    <Line  X1="0" Y1="{Binding ElementName='parent', Path='ActualHeight'}" X2="{Binding ElementName='parent', Path='ActualWidth'}" Y2="0" Stroke="Black" StrokeThickness="4" />
    <Label Background="Red" VerticalAlignment="Center" HorizontalAlignment="Center">My Label</Label>
</Grid>

答案 1 :(得分:6)

解决此问题的另一种方法是将所有内容放在Viewbox中并使用Stretch="fill"。它将在保持适当比例的同时为您重新调整尺寸。在这种情况下,您不需要使用数据绑定。

<Grid  HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" >
    <Viewbox HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Stretch="Fill">
        <Grid>
            <Line  X1="0" Y1="0" X2="100" Y2="100" Stroke="Black" StrokeThickness="1" />
            <Line  X1="0" Y1="100" X2="100" Y2="0" Stroke="Black" StrokeThickness="1" />
        </Grid>
    </Viewbox>
    <Label Background="Red" VerticalAlignment="Center" HorizontalAlignment="Center">My Label</Label>
</Grid>

答案 2 :(得分:2)

Matt Burland的答案使我的应用程序不断闪烁(因为我认为对'parent'的引用调整了它的大小......然后调整行的大小等等......)

所以我使用Stretch = Fill并抑制对'parent'的引用。现在工作得很好。

<Line x:Name="Line1" Visibility="Hidden" Stroke="Red" StrokeThickness="2" Stretch="Fill"
                X1="0" Y1="0" X2="1" Y2="1" />
<Line x:Name="Line2" Visibility="Hidden" Stroke="Red" StrokeThickness="2" Stretch="Fill"
                X1="0" Y1="1" X2="1" Y2="0" />

这是此解决方案与此one

的混合

答案 3 :(得分:0)

    <Line  X1="10" Y1="10" X2="50" Y2="50" Stroke="Black" StrokeThickness="4" />
    <Line  X1="10" Y1="50" X2="50" Y2="10" Stroke="Black" StrokeThickness="4" />

如果你想知道x和y值的来源,只需绘制笛卡尔坐标并插入

line 1 - point 1:(10,10), point 2:(50,50)
line 2 - point 1:(10,50), point 2:(50,10)

参考形状 http://msdn.microsoft.com/en-us/library/ms747393.aspx

将标签放在XAML中的Line元素之后/之下,这将使其在线条上绘制

答案 4 :(得分:0)

您可以使用单个Path项目,而不是为布局引擎创建两个元素:

<Path Data="M0,0L16,16M16,0L0,16" Stroke="Black" />

这是一个16x16的“ X”符号:

enter image description here

您可以在Data元素中指定其他大小,或者根据需要使用ViewBox将其缩放到其父大小。

请注意,行的末端为正方形,并略微超出16x16正方形:

enter image description here

如果您希望框正好是16x16,则可以在Width="16" Height="16"上设置Path,以裁剪行尾:

enter image description here