我正在制作一个进度向导。我将其定义为基于ItemsControl的样式。我有一个ItemTemplateSelector,其中包含两个DataTemplates,一个用于第一项,另一个用于剩余项。除了一个非常难以修复的小问题之外,它可以正常工作。第一项和第二项之间有一个间隙。这是控件应该看起来的样子:这个间隙出现是因为我使用了一个均匀的网格,所以所有的列都被同样地调整大小,即使第一列没有线。但是使用均匀的网格非常重要,因为我希望所有的东西都在一行上,并且随着控件的增长而拉伸以填充可用空间。我已经尝试过不使用均匀网格,但最终要么出现边距问题,要么无法填充可用空间。我该如何修复这个间隙?
以下是代码:
以下是代码:
<Style x:Key="WizardProgressBar" TargetType="{x:Type ItemsControl}">
<Style.Resources>
<DataTemplate x:Key="FirstItem">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Ellipse Name="ellipse" HorizontalAlignment="Left" Height="32" Width="32" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Completed}" Value="False">
<Setter TargetName="ellipse" Property="Stroke" Value="{DynamicResource DisabledBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding InProgress}" Value="True">
<Setter TargetName="ellipse" Property="Stroke" Value="{DynamicResource PrimaryTextBrush}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<DataTemplate x:Key="OtherItem">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Ellipse Name="ellipse" Grid.Column="1" HorizontalAlignment="Left" Height="32" Width="32" />
<Line Name="leftPath" Grid.Column="0" X1="0" Y1="16"
X2="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}" Y2="16" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Completed}" Value="False">
<Setter TargetName="ellipse" Property="Stroke" Value="{DynamicResource DisabledBrush}" />
<Setter TargetName="leftPath" Property="Stroke" Value="{DynamicResource DisabledBrush}"/>
</DataTrigger>
<DataTrigger Binding="{Binding InProgress}" Value="True">
<Setter TargetName="ellipse" Property="Stroke" Value="{DynamicResource PrimaryTextBrush}"/>
<Setter TargetName="leftPath" Property="Stroke" Value="{DynamicResource PrimaryTextBrush}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Style.Resources>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplateSelector">
<Setter.Value>
<wpf:ItemsDataTemplateSelector FirstItem="{StaticResource FirstItem}" OtherItem="{StaticResource OtherItem}" />
</Setter.Value>
</Setter>
</Style>
public class ItemsDataTemplateSelector : DataTemplateSelector
{
public DataTemplate FirstItem { get; set; }
public DataTemplate OtherItem { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
var returnTemplate = (itemsControl.ItemContainerGenerator.IndexFromContainer(container) == 0) ? FirstItem : OtherItem;
return returnTemplate;
}
}
ItemsControl.AlternationIndex
上设置一个触发器,当Trigger Value为零时将ContentTemplate设置为FirstItem。还要在ItemsControl上设置AlternationCount为一个高值(如2147483647)。 - Clemens