【问题标题】:3x3 Grid containing a Path in the center fills the entire grid包含中心路径的 3x3 网格填充整个网格
【发布时间】:2014-07-11 21:31:51
【问题描述】:

我在 ItemsControl 中使用了以下 ControlTemplate。它本质上是一个 3x3 网格,中间有一个路径,顶部有一个文本框/文本块。当我使用它时,路径会占用 ItemsControl 中的所有空间,并忽略列/行定义约束。谁能告诉我为什么会这样?我尝试将路径包装在画布中,但这似乎没有帮助。

谢谢!

<controls:Toolbox x:Key="DrawingShapeTemplates"
                  DefaultItemSize="60, 60"
                  SnapsToDevicePixels="True"
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled">

    <ItemsControl.Items>
        <Path Style="{StaticResource Square}"
              ToolTip="Square Shape">

            <controls:DesignerItem.MoveThumbTemplate>
                <ControlTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="3*" />
                            <RowDefinition Height="1*" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="3*" />
                            <ColumnDefinition Width="1*" />
                        </Grid.ColumnDefinitions>

                        <StackPanel Grid.Column="1">
                            <TextBlock Text="Length" />
                            <TextBox MinWidth="{Binding RelativeSource={RelativeSource AncestorType=controls:DesignerItem}, Path=ActualWidth}" />
                        </StackPanel>

                        <Canvas  Grid.Column="1"
                                 Grid.Row="1">
                            <Path Style="{StaticResource Square_DragThumb}" />
                        </Canvas>
                    </Grid>
                </ControlTemplate>
            </controls:DesignerItem.MoveThumbTemplate>
        </Path>
    </ItemsControl.Items>

</controls:Toolbox>

风格。

<Style x:Key="Square"
       TargetType="Path"
       BasedOn="{StaticResource StandardShapeStyle}">
    <Setter Property="Data">
        <Setter.Value>
            <RectangleGeometry Rect="50 50 50 50" />
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="Square_DragThumb"
       TargetType="Path"
       BasedOn="{StaticResource Square}">
    <Setter Property="IsHitTestVisible"
            Value="True" />
    <Setter Property="Fill"
            Value="Transparent" />
    <Setter Property="Stroke"
            Value="Transparent" />
</Style>

编辑

源代码是从这里enter link description here 下载的。如果您将第 469 行的 &lt;Path Style="{StaticResource Decision}" 替换为以下内容,您将得到与我相同的结果。

        <Path Style="{StaticResource Decision}"
              ToolTip="Decision">
            <s:DesignerItem.MoveThumbTemplate>
                <ControlTemplate>

                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="3*" />
                            <RowDefinition Height="1*" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="3*" />
                            <ColumnDefinition Width="1*" />
                        </Grid.ColumnDefinitions>

                        <StackPanel Grid.Column="1">
                            <TextBlock Text="Length" />
                            <TextBox MinWidth="{Binding RelativeSource={RelativeSource AncestorType=s:DesignerItem}, Path=ActualWidth}" />
                        </StackPanel>
                        <Path Grid.Column="1"
                              Grid.Row="1"
                              Style="{StaticResource Decision_DragThumb}" />
                    </Grid>
                </ControlTemplate>
            </s:DesignerItem.MoveThumbTemplate>
        </Path>

以下是我要完成的工作以及实际结果的图片。我想在选定项目的所有四个边上显示一个标签和一个文本框。最终,标签/文本框的可见性将数据绑定到 DesignerItem.IsSelected 依赖属性,但尚未连接。

预期结果:

实际结果:

【问题讨论】:

    标签: c# wpf wpf-controls


    【解决方案1】:

    默认情况下,Canvas 会剪辑其子项,因此您需要将其显式设置为 ClipToBounds="True"

    例如

    <Canvas  Grid.Column="1"
             Grid.Row="1"
             ClipToBounds="True">
        <Path Style="{StaticResource Square_DragThumb}" />
    </Canvas>
    

    更新

    将line 469处FlowChartSymbols.xaml中的Path元素替换为以下Grid

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <StackPanel Grid.Column="1">
                <TextBlock Text="Length" HorizontalAlignment="Center"/>
                <TextBox />
                <StackPanel.Style>
                    <Style TargetType="StackPanel">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=s:DesignerItem}}" 
                                         Value="{x:Null}">
                                <Setter Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </StackPanel.Style>
            </StackPanel>
            <Path Style="{StaticResource Decision}" 
                Grid.Row="1" Grid.Column="1"
                ToolTip="Decision">
                <s:DesignerItem.MoveThumbTemplate>
                    <ControlTemplate>
                        <Path Style="{StaticResource Decision_DragThumb}" />
                    </ControlTemplate>
                </s:DesignerItem.MoveThumbTemplate>
            </Path>
        </Grid>
    

    这就是您实现相同目标的方法。还修复了工具箱问题,通过添加触发器来检测它是在设计器项目内还是仅仅在工具箱中

    【讨论】:

    • 这并不能解决问题。网格的其余内容仍被画布隐藏。是否与我的几何不使用 StreamGemometry 语法有关?
    • 流几何可能不是原因。因为你的问题有点不完整。您能否发布StandardShapeStyle 和任何其他风格等,这是一个完整的例子。所以我可以在这里尝试同样的方法。如果您可以发布您看到的内容和想要看到的内容的屏幕截图。如果您能发布一个工作示例,我们将不胜感激,因为我也没有 controls:DesignerItem 和 controls:Toolbox。
    • 我从 CodeProject 下载了一个示例项目并将其迁移到我的项目中。当我刚尝试时,这个问题也存在于他们的项目中。我用源链接和替换为我的路径的行更新了我的帖子。
    • 我可以看到你正在尝试定义一个移动拇指,它工作正常。真正的担忧是什么?你能张贴一张你看到的和你想看到的照片吗?您可以尝试从路径中删除 Style="{StaticResource Decision}" 并查看您的拇指实现。
    • 也许也将Fill="Gray" 添加到内部路径。例如&lt;Path Grid.Column="1" Grid.Row="1" Fill="Gray" Style="{StaticResource Decision_DragThumb}" /&gt; 查看内部路径。您在完整网格中看到的是实际路径 Decision 在这种情况下呈现在顶部。
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2011-08-13
    • 2019-07-06
    • 2017-10-01
    相关资源
    最近更新 更多