wpf - 一个画布在相邻画布上的 ZIndex
问题描述
我正在尝试渲染一排互锁的箭头,如下所示:
每个箭头代表工作流中的一个步骤,每个箭头的颜色由其步骤在工作流中的位置决定。虽然上面的示例有 3 种颜色(之前、当前、之后),但到目前为止,我只实现了 2 种颜色(之前/当前、之后),这对于这个问题来说很好。我有一个IMultiValueConverter
来处理这些颜色。
工作流步骤表示为StepStruct
具有Step
属性(手动设置,稍后会详细介绍)和VmFunc
返回该步骤的视图模型的属性。我的当前IMultiValueConverter
使用步骤列表中的步骤索引,而不是实际Step
值。
我的问题是箭头。最初,我将每一步都作为画布呈现一个简单的矩形,这很容易上手。但是为了制作箭头,我使用了一个PolyLine
我想要定位在画布右侧的箭头,实际上是从一个画布的右侧开始并溢出到下一个画布。
我无法Panel.ZIndex
以这样一种方式工作,即画布的箭头可见溢出到其右侧邻居中。
我的代码粘贴在下面。注意:
Polyline
我已经将'sPanel.Zindex
(我已经读过会影响其父画布的 z-index)绑定到StepStruct
'Step
属性,并且我已经设置了Step
值,以便每个步骤的值小于其左侧步骤的值,它应该显示左步在右步之上。- 我评论了一行设置
Canvas.Left
每个PolyLine
. 当我取消注释这条线(并将其移动到位)时,Polyline
确实会移动到画布的右侧,但它是不可见的,我想这是因为它隐藏在右侧的画布后面。(我已经通过将 更改为PolyLine
以负 x 值开头来确认这一点,因此您可以看到未被相邻画布阻挡的部分。这没有被描绘出来。) - 我已将每个画布呈现
Step
为文本,并且这些TextBlock
s 都具有相同的 z-index (40),因此它们位于一些PolyLine
s 的前面和其他的后面,这表明它们的PolyLine
z-index 设置正确,在至少在它自己的画布内。
<Border Grid.Row="0" BorderBrush="{StaticResource BackgroundBlack}" BorderThickness="2">
<!--Progress bar-->
<ItemsControl ItemsSource="{Binding StepViewModels}" Grid.Row="0" x:Name="progressBar">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Canvas Height="24">
<Canvas.Style>
<Style TargetType="Canvas">
<Setter Property="Background" Value="{StaticResource BackgroundDarkGrey}"/>
<Style.Triggers>
<DataTrigger>
<DataTrigger.Binding>
<!-- the binding. this part works so I'm omitting the code -->
</DataTrigger.Binding>
<DataTrigger.Value>True</DataTrigger.Value>
<Setter Property="Background" Value="{StaticResource DisabledGrey}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Canvas.Style>
<Polyline Points="0,-1 20,11 0,25" Stroke="{StaticResource BackgroundBlack}" StrokeThickness="2"
Fill="{Binding Background, RelativeSource={RelativeSource AncestorType=Canvas}}"
Panel.ZIndex="{Binding Step}"
/>
<!--Canvas.Left="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Canvas}}"-->
<TextBlock Text="{Binding Step}" FontWeight="ExtraBlack" Panel.ZIndex="40" Foreground="Pink" FontSize="20" Canvas.Left="8"/>
</Canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
如何根据需要在一个画布的末尾和下一个画布的顶部渲染箭头?
(我当然可以保持这种方式并使其工作,但绑定会非常烦人和复杂,需要将每个箭头绑定到前一个画布的颜色;或者更确切地说是进行某种涉及的转换IndexOf - 1
)
解决方案
对于 ZIndex:
每个项目都由一个 ContentPresenter 包装,这是由该 ItemsControl 实例中的 ItemContainerGenerator 完成的。
因此,您需要编辑容器以获取新的 ZIndex(例如通过 ContentPresenter 样式和绑定)。
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Panel.ZIndex" Value="{Binding XXX}" />
</Style>
</ItemsControl.ItemContainerStyle>
对于形状:
我建议使用具有预定义形状几何形状的路径控件,例如:
“M 0,0 L30,0 L34,5 L30,10 L0,10 z”
最后有一个负边距,如 Margin="0,0,-4,0"
推荐阅读
- python - Selenium 无法在 Instagram 上获取所有元素
- compiler-errors - 为什么临时变量会抑制“类型归属是实验性的”错误?
- ios - 如何动态更改本地化 SwiftUI
- android - 有没有办法让我们按钮 onclick 监听器在 android 上打开导航抽屉
- php - 如何在几天的数组中查询每一天的数据库laravel
- mysql - 这是一个 MySQL 错误吗?
- python - 无监督学习、Python、文本聚类
- react-native - React Native 语义问题:“MethodDescriptor”的重新定义
- sql - 连接 2 个 PostgreSQL 表
- python - 如何从特定时间范围内的股票报价数据中保存数据