WPF线路问题

WPF线路问题,wpf,xaml,Wpf,Xaml,我正在尝试制作一个非常简单的红色X按钮,类似于鼠标悬停在X上关闭Google Chrome标签。线条控件似乎尊重其底部和右侧的边界,但在顶部和左侧突出,我不知道如何修复它(除了给它们看似任意的边距以迫使它们屈服之外)。。。我有以下XAML: <Grid Background="Black"> <Ellipse Height="15" Width="15" Fill="Red" HorizontalAlignment="Center" VerticalAlignment=

我正在尝试制作一个非常简单的红色X按钮,类似于鼠标悬停在X上关闭Google Chrome标签。线条控件似乎尊重其底部和右侧的边界,但在顶部和左侧突出,我不知道如何修复它(除了给它们看似任意的边距以迫使它们屈服之外)。。。我有以下XAML:

<Grid Background="Black">
    <Ellipse Height="15" Width="15" Fill="Red" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <Line X1="0" Y1="0" X2="10" Y2="10" HorizontalAlignment="Center" VerticalAlignment="Center" Stroke="White" StrokeThickness="1" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
    <Line X1="0" Y1="10" X2="10" Y2="0" HorizontalAlignment="Center" VerticalAlignment="Center" Stroke="White" StrokeThickness="1" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
</Grid>

第一个问题是线条从左上角到右下角:

我选择了显示边界框的线。请注意,该线如何在左上角从椭圆(及其边界框)中伸出,但在右下角位于椭圆内部。难道这些行为不应该始终如一,要么都暴露出来,要么都保持在自己的范围内吗

第一条线至少穿过边界框角的中心,但第二条线最终会向上和向左移动:


他们似乎都尊重底部和右侧的边界,但从顶部和左侧的边界突出,这导致他们偏离中心。我能做些什么让他们按照我想要的方式行动呢?提前感谢。

不知道为什么线帽仅在右侧和底部对线边界起作用,但作为一种解决方法,您可以在画布中居中绘制所有内容:

<Grid Background="Black">
    <Canvas HorizontalAlignment="Center" VerticalAlignment="Center">
        <Path Fill="Red">
            <Path.Data>
                <EllipseGeometry RadiusX="7.5" RadiusY="7.5"/>
            </Path.Data>
        </Path>
        <Path Data="M-5,-5 L5,5 M-5,5 L5,-5" StrokeThickness="1"
              Stroke="White" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
    </Canvas>
</Grid>

不知道为什么线帽仅在右侧和底部构成线边界,但作为一种解决方法,您可以在画布中居中绘制所有内容:

<Grid Background="Black">
    <Canvas HorizontalAlignment="Center" VerticalAlignment="Center">
        <Path Fill="Red">
            <Path.Data>
                <EllipseGeometry RadiusX="7.5" RadiusY="7.5"/>
            </Path.Data>
        </Path>
        <Path Data="M-5,-5 L5,5 M-5,5 L5,-5" StrokeThickness="1"
              Stroke="White" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
    </Canvas>
</Grid>

不知道为什么线帽仅在右侧和底部构成线边界,但作为一种解决方法,您可以在画布中居中绘制所有内容:

<Grid Background="Black">
    <Canvas HorizontalAlignment="Center" VerticalAlignment="Center">
        <Path Fill="Red">
            <Path.Data>
                <EllipseGeometry RadiusX="7.5" RadiusY="7.5"/>
            </Path.Data>
        </Path>
        <Path Data="M-5,-5 L5,5 M-5,5 L5,-5" StrokeThickness="1"
              Stroke="White" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
    </Canvas>
</Grid>

不知道为什么线帽仅在右侧和底部构成线边界,但作为一种解决方法,您可以在画布中居中绘制所有内容:

<Grid Background="Black">
    <Canvas HorizontalAlignment="Center" VerticalAlignment="Center">
        <Path Fill="Red">
            <Path.Data>
                <EllipseGeometry RadiusX="7.5" RadiusY="7.5"/>
            </Path.Data>
        </Path>
        <Path Data="M-5,-5 L5,5 M-5,5 L5,-5" StrokeThickness="1"
              Stroke="White" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
    </Canvas>
</Grid>

经过一些实验

您的问题在X1、X2、Y1、Y2中。你没有遵循数学规则来找到精确的值(如果你不记得像我这样的三角形和圆形方程,那么要找到它们就有点困难:)

我的解决方案是画两条直线,一条从上到下,一条从左到右,然后将它们旋转45度

结果如下所示:

代码很简单,我拉伸线并旋转它们,以便粘到边上

  <Grid Background="Black"  VerticalAlignment="Stretch"       HorizontalAlignment="Stretch" Width="15" Height="15">
    <Ellipse Height="15" Width="15" Fill="Red"/>
    <Line X1="7.5" Y1="0" X2="7.5" Y2="15" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round"  RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
    <Line X1="0" Y1="7.5" X2="15" Y2="7.5" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round" RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
</Grid>

还请注意,我们将每条直线的旋转原点设置为0.5和0.5。这有点令人困惑(为什么不是0,0),但是这个链接将帮助您理解


经过一些实验

您的问题在X1、X2、Y1、Y2中。你没有遵循数学规则来找到精确的值(如果你不记得像我这样的三角形和圆形方程,那么要找到它们就有点困难:)

我的解决方案是画两条直线,一条从上到下,一条从左到右,然后将它们旋转45度

结果如下所示:

代码很简单,我拉伸线并旋转它们,以便粘到边上

  <Grid Background="Black"  VerticalAlignment="Stretch"       HorizontalAlignment="Stretch" Width="15" Height="15">
    <Ellipse Height="15" Width="15" Fill="Red"/>
    <Line X1="7.5" Y1="0" X2="7.5" Y2="15" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round"  RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
    <Line X1="0" Y1="7.5" X2="15" Y2="7.5" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round" RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
</Grid>

还请注意,我们将每条直线的旋转原点设置为0.5和0.5。这有点令人困惑(为什么不是0,0),但是这个链接将帮助您理解


经过一些实验

您的问题在X1、X2、Y1、Y2中。你没有遵循数学规则来找到精确的值(如果你不记得像我这样的三角形和圆形方程,那么要找到它们就有点困难:)

我的解决方案是画两条直线,一条从上到下,一条从左到右,然后将它们旋转45度

结果如下所示:

代码很简单,我拉伸线并旋转它们,以便粘到边上

  <Grid Background="Black"  VerticalAlignment="Stretch"       HorizontalAlignment="Stretch" Width="15" Height="15">
    <Ellipse Height="15" Width="15" Fill="Red"/>
    <Line X1="7.5" Y1="0" X2="7.5" Y2="15" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round"  RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
    <Line X1="0" Y1="7.5" X2="15" Y2="7.5" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round" RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
</Grid>

还请注意,我们将每条直线的旋转原点设置为0.5和0.5。这有点令人困惑(为什么不是0,0),但是这个链接将帮助您理解


经过一些实验

您的问题在X1、X2、Y1、Y2中。你没有遵循数学规则来找到精确的值(如果你不记得像我这样的三角形和圆形方程,那么要找到它们就有点困难:)

我的解决方案是画两条直线,一条从上到下,一条从左到右,然后将它们旋转45度

结果如下所示:

代码很简单,我拉伸线并旋转它们,以便粘到边上

  <Grid Background="Black"  VerticalAlignment="Stretch"       HorizontalAlignment="Stretch" Width="15" Height="15">
    <Ellipse Height="15" Width="15" Fill="Red"/>
    <Line X1="7.5" Y1="0" X2="7.5" Y2="15" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round"  RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
    <Line X1="0" Y1="7.5" X2="15" Y2="7.5" HorizontalAlignment="Center"  Stretch="Fill" VerticalAlignment="Center" Stroke="White" StrokeThickness="1"  StrokeStartLineCap="Round" StrokeEndLineCap="Round" RenderTransformOrigin="0.5,0.5">
        <Line.RenderTransform>
            <RotateTransform Angle="45" />
        </Line.RenderTransform>
    </Line>
</Grid>

还请注意,我们将每条直线的旋转原点设置为0.5和0.5。这有点令人困惑(为什么不是0,0),但是这个链接将帮助您理解


这些是添加到线条之外的形状,我不认为这些形状是在measure()/arrange()上的中心原点,但像往常一样,对于组合路径数据的解决方法+1,我知道你可能又是从头开始做的。克莱门斯·洛尔,我看到你做的更复杂的形状总是让人印象深刻。:)@好吧,我知道大写字母是什么,我只是不知道为什么它们在右边和底部,而不是在左边和顶部,对一条线的边界有影响。同样的事情实际上发生在没有指定结束大写字母的情况下,我几乎贴出了没有结束大写字母的问题来简化它。根据@ChrisW给出的链接,这应该默认为平面