C# 在画布中放置对象

C# 在画布中放置对象,c#,wpf,xaml,layout,C#,Wpf,Xaml,Layout,我跟随一个项目并修改了其中一个形状。目标是在路径几何体周围放置一个文本框。这是工作感谢一些,但现在我有这个问题 路径被包装在一个网格中,另一个网格在根网格中。第二个网格包含一系列堆栈面板,它们的位置围绕路径 <!-- Square Shape --> <Grid> <Grid Style="{StaticResource ShapeInputStyle}"> <Canvas HorizontalAlignment="Center"

我跟随一个项目并修改了其中一个形状。目标是在路径几何体周围放置一个文本框。这是工作感谢一些,但现在我有这个问题

路径被包装在一个网格中,另一个网格在根网格中。第二个网格包含一系列堆栈面板,它们的位置围绕路径

<!-- Square Shape -->
<Grid>
    <Grid Style="{StaticResource ShapeInputStyle}">
        <Canvas HorizontalAlignment="Center">
            <StackPanel Canvas.Top="-40"
                        Canvas.Left="-20">
                <TextBlock Text="Length"
                            HorizontalAlignment="Center" />
                <TextBox />
            </StackPanel>
        </Canvas>
        <Canvas VerticalAlignment="Center">
            <StackPanel Canvas.Left="-40"
                        Canvas.Top="-20">
                <TextBlock Text="Height"
                            HorizontalAlignment="Center" />
                <TextBox />
            </StackPanel>
        </Canvas>
        <Canvas VerticalAlignment="Center">
            <StackPanel Canvas.Right="-40"
                        Canvas.Top="-20">
                <TextBlock Text="Height"
                            HorizontalAlignment="Center" />
                <TextBox />
            </StackPanel>
        </Canvas>
        <Canvas VerticalAlignment="Center">
            <StackPanel Canvas.Bottom="-80"
                        Canvas.Left="-20">
                <TextBlock Text="Height"
                            HorizontalAlignment="Center" />
                <TextBox />
            </StackPanel>
        </Canvas>
    </Grid>
    <Path Style="{StaticResource Square}"
            x:Name="path"
            ToolTip="Decision">
        <controls:DesignerItem.MoveThumbTemplate>
            <ControlTemplate>
                <Path Style="{StaticResource Square_DragThumb}" />
            </ControlTemplate>
        </controls:DesignerItem.MoveThumbTemplate>
    </Path>
</Grid>

结果应该是这样的。在我开始调整路径大小之前,它实际上是这样的。然后,路径仅与底部文本框的顶部重叠。其余的都很好

预期结果

实际结果

我是否使用了画布依赖属性错误

更新 我把所有东西都放到了一个DockPanel中,而不是像评论中建议的那样,但最终得到了相同的结果

这是我用于包含StackPanels的网格的样式

<Style x:Key="ShapeInputStyle"
       TargetType="Grid">
    <Setter Property="Margin"
            Value="-10 -10" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=controls:DesignerItem}}"
                     Value="{x:Null}">
            <Setter Property="Visibility"
                    Value="Collapsed" />
        </DataTrigger>

        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=controls:DesignerItem}, Path=IsSelected}"
                     Value="False">
            <Setter Property="Visibility"
                    Value="Hidden" />
        </DataTrigger>
    </Style.Triggers>
</Style>

此更改的结果如下图所示。所以你有一些过去的历史,这是我最初的问题,我在上面链接的文章中试图解决。最终的解决方案是将StackPanels放在画布中,这就是解决下面问题的方法。在画布中,除了底部画布,其他一切都很好

更新2 我遵循提供的答案,但结果并不理想(事实上,我在昨晚的OP中也遇到过同样的问题)。您可以在图像中看到,形状开始变小。在我上面提供的获取示例项目的链接中,该模板既用于工具箱中供用户选择,也用于画布上的渲染/编辑。如果我设置minwidth/height,则它会在工具箱中扭曲。此外,围绕整个模板的装饰器并不理想,因为如果装饰器仅像使用画布时那样围绕形状,则更可取

还有其他想法吗

用DockPanel替换画布

线框现在包含整个dockpanel。

试试这个(基本停靠模板)



除此之外,请参见。

给您

这是底部面板

    <Canvas VerticalAlignment="Bottom" 
            HorizontalAlignment="Center">
        <StackPanel Canvas.Bottom="-40"
                    Canvas.Left="-20">
            <TextBlock Text="Height"
                        HorizontalAlignment="Center" />
            <TextBox />
        </StackPanel>
    </Canvas>
用法示例

    <ContentControl Template="{StaticResource EditableSides}">
        <Path Style="{StaticResource Decision}"
              ToolTip="Decision">
            <s:DesignerItem.MoveThumbTemplate>
                <ControlTemplate>
                    <Path Style="{StaticResource Decision_DragThumb}" />
                </ControlTemplate>
            </s:DesignerItem.MoveThumbTemplate>
        </Path>
    </ContentControl>


在我看来,
画布
不是一个合适的容器。在我看来更像是一个
DockPanel
。停靠面板是原始容器,但路径始终呈现在所有停靠元素之上。在我链接到的SO帖子中,最终的解决方案是采用这种方法,以避免在模板内路径周围的其他元素上渲染路径。我还使用了一个剖切的网格,但路径始终呈现在整个网格上,并且永远不会被约束到我分配给我的行/列,这将由您设置附加属性的UI元素引起。我想你应该用DockPanel再试一次,同时将附加属性保留在方形路径中。我刚才试过了(参见我更新的OP),结果是一样的。路径覆盖在底部StackPanel的顶部,因此停靠面板的使用完全错误。请参阅OPU中的我的更新#2。欢迎随时使用。我添加了一个技巧,使整个内容可重用,这将帮助您在不重新定义整个结构的情况下重用相同的内容。祝你好运,快乐编码:)我将有多个形状,我需要将值绑定到与每个形状关联的模型。让我的ControlTemplate尝试绑定到父数据上下文是一种不好的做法,还是应该采用另一种方法?绑定到父数据上下文不是一种不好的做法,您需要做的只是仔细考虑。如果需要,可以使用附着的特性。你们可以把你们的想法发布在代码审查网站上,让我们看看它是好的还是需要改进。
    <Canvas VerticalAlignment="Bottom" 
            HorizontalAlignment="Center">
        <StackPanel Canvas.Bottom="-40"
                    Canvas.Left="-20">
            <TextBlock Text="Height"
                        HorizontalAlignment="Center" />
            <TextBox />
        </StackPanel>
    </Canvas>
<ControlTemplate x:Key="EditableSides"
                 TargetType="ContentControl">
    <Grid>
        <Grid Style="{StaticResource ShapeInputStyle}">
            <Canvas HorizontalAlignment="Center">
                <StackPanel Canvas.Top="-40"
                            Canvas.Left="-20">
                    <TextBlock Text="Length"
                               HorizontalAlignment="Center" />
                    <TextBox />
                </StackPanel>
            </Canvas>
            <Canvas VerticalAlignment="Center">
                <StackPanel Canvas.Left="-40"
                            Canvas.Top="-20">
                    <TextBlock Text="Height"
                               HorizontalAlignment="Center" />
                    <TextBox />
                </StackPanel>
            </Canvas>
            <Canvas VerticalAlignment="Center">
                <StackPanel Canvas.Right="-40"
                            Canvas.Top="-20">
                    <TextBlock Text="Height"
                               HorizontalAlignment="Center" />
                    <TextBox />
                </StackPanel>
            </Canvas>
            <Canvas VerticalAlignment="Bottom"
                    HorizontalAlignment="Center">
                <StackPanel Canvas.Bottom="-40"
                            Canvas.Left="-20">
                    <TextBlock Text="Height"
                               HorizontalAlignment="Center" />
                    <TextBox />
                </StackPanel>
            </Canvas>
        </Grid>
        <ContentPresenter />
    </Grid>
</ControlTemplate>
    <ContentControl Template="{StaticResource EditableSides}">
        <Path Style="{StaticResource Decision}"
              ToolTip="Decision">
            <s:DesignerItem.MoveThumbTemplate>
                <ControlTemplate>
                    <Path Style="{StaticResource Decision_DragThumb}" />
                </ControlTemplate>
            </s:DesignerItem.MoveThumbTemplate>
        </Path>
    </ContentControl>