WPF路径大小问题

WPF路径大小问题,wpf,path,size,shape,Wpf,Path,Size,Shape,嘿,伙计们,我一直在玩WPF的路径形状,但我对一些行为感到有点恼火。 具体来说,路径本身的大小与我所希望的不同。如果你看下图,我想要的是整个路径都在白色的正方形(代表路径控制的边界)内,但是圆弧有点悬空。我认为这是因为路径本身的大小是根据用于绘制形状的点来确定的,而不是根据实际绘制的形状来确定的 我的问题是:有人知道如何克服这个问题吗?我的意思是,除了明确设置路径的维度之外。是否有一些我忽略了的选项,以便获得根据形状而不是根据用于制作形状的点来调整自身大小的路径?谢谢你的回答 下面是两个版本

嘿,伙计们,我一直在玩WPF的路径形状,但我对一些行为感到有点恼火。 具体来说,路径本身的大小与我所希望的不同。如果你看下图,我想要的是整个路径都在白色的正方形(代表路径控制的边界)内,但是圆弧有点悬空。我认为这是因为路径本身的大小是根据用于绘制形状的点来确定的,而不是根据实际绘制的形状来确定的

我的问题是:有人知道如何克服这个问题吗?我的意思是,除了明确设置路径的维度之外。是否有一些我忽略了的选项,以便获得根据形状而不是根据用于制作形状的点来调整自身大小的路径?谢谢你的回答


下面是两个版本的(应该是什么)等效代码:

1) 首先,使用数据绑定(以非常详细的方式编写):


2) 这一个,使用迷你语言:

<UserControl x:Class="OrbitTrapWpf.LineSegmentTool"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:OrbitTrapWpf"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         x:Name="Root" Background="White">
<UserControl.Resources>
    <local:ArcSizeConverter x:Key="ArcSizeConverter"/>
    <local:ArcPointConverter x:Key="ArcPointConverter"/>
</UserControl.Resources>
  <Grid Name="grid">
  <Path Name="path" Stroke="Black" Data="M 0.146446609406726,1.14644660940673 A 0.5,0.5 0 1 0 0.853553390593274,1.85355339059327 L 1.85355339059327,0.853553390593274 A 0.5,0.5 0 1 0 1.14644660940673,0.146446609406726 Z " />


我认为这两个版本应该大致相同,但显然迷你语言版本的大小几乎正确,而原始版本则大不相同。

基本上,path xaml所说的是:

  • 从点0开始,画一条弧到点1
  • 从点1到点2画一条线
  • 从点2到点3绘制一条弧
  • “IsClosed”从点3到点0绘制另一条线
  • 您定义的正是正在生成的内容-您可以更改它的唯一方法是更改您的位置-但圆弧仍将延伸到X轴上的点0之外,因为这是您定义的

    如果你需要你的形状完全符合某个边界,你可以在你的形状周围放置一个边界,比如说,在底部和右侧有1/2半径的边距(我确信有一个精确突出的公式)


    由于第二个屏幕截图与第一个屏幕截图看起来不同,我认为它们是不同的形状-这只能意味着路径数据翻译错误。

    好的,所以我找到了问题并解决了它。我在迷你语言版本中设置了
    IsLargeArc
    标志,而在纯XAML版本中,我将其保留为
    False
    。所以我把它改成了
    True
    ,我神奇地得到了我期望的结果


    这对我来说似乎是一个错误,因为在这种情况下,大弧和小弧是一个相同的,因为我画的是半弧。如果有人知道这种行为的原因,那就太棒了

    我无意中看到了这篇文章,我想我会发布一个答案,以防有人在寻找一种简单的方法来调整路径或图标的大小。我找到的最简单的方法是对我的所有路径显示使用Viewbox。这是因为路径将在Viewbox中很好地缩放自身。我使用画布来保存每条路径,如果你想使用“漂亮”的数字,画布的大小非常重要

    以下是如何执行此操作的示例:

    首先(可选)在矢量程序中绘制形状,如或CorelDraw!我使用CorelDraw创建了注意:当使用程序创建向量时,请将页面大小设置为100 X 100像素,这就是您要设置画布大小的大小。如果你是手写路径,这也是一种非常方便的方法,只需选择一个100 X 100的大小,所有路径测量值都小于100,换句话说,将其用作你的刻度

    接下来使用一个翻译程序,如,并生成一个路径。将其保存到资源字典中,或将其放入需要的文件中。将路径放在画布中,如下所示:

    <Canvas x:Key="someName" Width="100" Height="100">
        <Path Fill="#FF000000" Stroke="#FF373435" StrokeThickness="1" Data="M92,8L92,8C103,18,103,35,92,45L45,92C35,103,18,103,8,92L8,92C-3,82,-3,65,8,55L55,8C65,-3,82,-3,92,8z"/>
    </Canvas>
    
    
    
    再次注意画布的大小,这应该与“绘图板”的尺寸相匹配

    然后要使用它,只需将ContentControl放置在一个ViewBox中,该ViewBox的宽度和高度与您希望路径显示的宽度和高度相同,如下所示:

    <Viewbox x:Name="btnClose" Width="30" Height="30">
        <ContentControl Content="{StaticResource someName}" />
    </Viewbox>
    
    
    
    就这样!使用路径的另一个好处是可以绑定背景(填充)或前景(笔划)的颜色。下面以我们的示例说明如何控制颜色:

    <SolidColorBrush x:Key="stForeColor" Color="#FFD4D7EA" />
    
    <Canvas x:Key="someName" Width="100" Height="100">
        <Path Fill="{StaticResource stForeColor}" Stroke="Transparent" StrokeThickness="1" Data="M92,8L92,8C103,18,103,35,92,45L45,92C35,103,18,103,8,92L8,92C-3,82,-3,65,8,55L55,8C65,-3,82,-3,92,8z"/>
    </Canvas>
    
    
    

    你还可以做很多其他的事情,你可以用任何其他形状、效果、动画等做任何事情。

    这也是我对第一个示例的推论。但是当我使用mini语言时,它的工作方式就不同了。在这种情况下,它的边界(几乎)是完美的。第二个示例中的路径数据来自哪里?第一个示例从数据绑定中获取数据,我只是手动检索数据并将其插入第二个示例中的数据字符串中。嗯。。。我只能猜测,由于形状呈现不同,你在翻译中犯了一个错误。嗯,这总是有可能的。但它们确实产生了相同的形状——两条弧和两条线,每个弧和线的尺寸完全相同。我将继续讨论这个问题,但我现在的猜测是迷你语言对我们的帮助比我们想象的要大。
    <SolidColorBrush x:Key="stForeColor" Color="#FFD4D7EA" />
    
    <Canvas x:Key="someName" Width="100" Height="100">
        <Path Fill="{StaticResource stForeColor}" Stroke="Transparent" StrokeThickness="1" Data="M92,8L92,8C103,18,103,35,92,45L45,92C35,103,18,103,8,92L8,92C-3,82,-3,65,8,55L55,8C65,-3,82,-3,92,8z"/>
    </Canvas>