Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WPF中覆盖几何体对象,使每个对象具有相同的尺寸,但具有不同的变换_Wpf_Animation_Graphics_Geometry_Drawingvisual - Fatal编程技术网

在WPF中覆盖几何体对象,使每个对象具有相同的尺寸,但具有不同的变换

在WPF中覆盖几何体对象,使每个对象具有相同的尺寸,但具有不同的变换,wpf,animation,graphics,geometry,drawingvisual,Wpf,Animation,Graphics,Geometry,Drawingvisual,我已经被这个问题困扰了一周,并且尝试了多种方法 我有一个平衡秤的图纸,如下所示。我已经将这张图片分成两张,这样底部+垂直轴代表一张图片,而水平条代表另一张。然后,我从这两个图形中提取路径几何图形,并尝试从单个自定义图形中或作为视觉层图形绘制它们 正如您所想象的,当水平杆需要在其中心点旋转到一定自由度时,底座+垂直轴需要保持静止。WPF只是: <Canvas> <!-- Custom Shape or Visual Layer Drawing here. --> &

我已经被这个问题困扰了一周,并且尝试了多种方法

我有一个平衡秤的图纸,如下所示。我已经将这张图片分成两张,这样底部+垂直轴代表一张图片,而水平条代表另一张。然后,我从这两个图形中提取路径几何图形,并尝试从单个自定义图形中或作为视觉层图形绘制它们

正如您所想象的,当水平杆需要在其中心点旋转到一定自由度时,底座+垂直轴需要保持静止。WPF只是:

<Canvas>
    <!-- Custom Shape or Visual Layer Drawing here. -->
</Canvas>

问题:由于我希望两个几何图形具有相同的左、上、右、下值,因此我使用单个自定义形状或单个DrawingVisual,尝试绘制两个效果良好的几何图形。但是,当我对其中一个应用变换时,变换将同时应用于两个,从而使基础+垂直轴也移动

问题:请注意,我没有试图找到我已经拥有的代码的修复方法,因为我以前多次尝试问这个问题,但都没有成功,例如。有人能解释一下如何从头开始实现这样的覆盖吗


也许您使用自定义形状和绘图视觉效果的方法太复杂了。尝试下面的纯XAML解决方案(当然是简化的几何图形),了解如何仅使用一条路径和一些几何图形就可以实现这一点

<Canvas>
    <Path Canvas.Left="200" Canvas.Top="100" Fill="Black">
        <Path.Data>
            <GeometryGroup FillRule="Nonzero">
                <PathGeometry Figures="M0,0 L50,200 -50,200 Z"/>
                <GeometryGroup>
                    <GeometryGroup.Transform>
                        <RotateTransform
                            Angle="{Binding Value,ElementName=angleSlider}"/>
                    </GeometryGroup.Transform>
                    <PathGeometry Figures="M-100,-5 L100,-5 100,5 -100,5 Z"/>
                    <PathGeometry Figures="M-100,0 L-75,100 L-125,100 Z">
                        <PathGeometry.Transform>
                            <TransformGroup>
                                <RotateTransform CenterX="-100"
                                    Angle="{Binding Value,ElementName=angleSlider}"/>
                                <ScaleTransform ScaleX="-1" CenterX="-100"/>
                            </TransformGroup>
                        </PathGeometry.Transform>
                    </PathGeometry>
                    <PathGeometry Figures="M100,0 L75,100 L125,100 Z">
                        <PathGeometry.Transform>
                            <TransformGroup>
                                <RotateTransform CenterX="100"
                                    Angle="{Binding Value,ElementName=angleSlider}"/>
                                <ScaleTransform ScaleX="-1" CenterX="100"/>
                            </TransformGroup>
                        </PathGeometry.Transform>
                    </PathGeometry>
                </GeometryGroup>
            </GeometryGroup>
        </Path.Data>
    </Path>        
</Canvas>
...
<Slider x:Name="angleSlider" Minimum="-45" Maximum="45"/>

...
编辑:为了使其可伸缩,您可以将画布宽度和高度设置为固定值(由包含的几何图形给出的值),并将整个内容放在一个视口中:

<Viewbox>
    <Canvas Width="250" Height="205">
        ...
    </Canvas>
</Viewbox>

...

谢谢@Clemens。这种行为正是我想要的,所以在问其他问题之前,我会将答案标记为正确。我使用的是非XAML方法,因此我可以根据容器大小缩放几何体。有没有办法用纯XAML实现这一点?在本例中,顶级画布嵌套在DockPanel的主区域或填充区域中(不确定这是否重要)。我尝试将父对象的水平和垂直对齐设置为拉伸,但没有效果。对我来说,在代码中进行缩放的主要原因是能够以编程方式指定CenterX和CenterY,因为我看不到在XAML中动态指定CenterX和CenterY的方法(例如百分比)。