c# - 跨越整行的 DataGrid ProgressBar
问题描述
我有一个工作进度条显示在一个列中。但需要它来跨越整行。怎样才能做到这一点?
这有效,ProgressBar 在单列中:
<UserControl.Resources>
<SolidColorBrush x:Key="DgGridLineBrush" Color="LightGray" />
<Style x:Key="ProgressBarStyle" TargetType="ProgressBar">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ProgressBar">
<Grid x:Name="PART_Track" >
<Rectangle x:Name="PART_Indicator" Fill="{Binding [3]}" HorizontalAlignment="Left" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<DataGrid x:Name="MbpDg" HeadersVisibility="Column" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False" HorizontalAlignment="Right" ColumnHeaderHeight="20" Height="221" Margin="0,1,0,0" VerticalAlignment="Top" Width="164"
GridLinesVisibility="None" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Size" Width="55">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<ProgressBar Value="{Binding [2], Mode=OneWay}" Style="{StaticResource ProgressBarStyle}" Minimum="0" Maximum="100"/>
<TextBlock Text="{Binding [2], Mode=OneWay}" HorizontalAlignment="Right"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding [0]}" Header="Price" Width="50"/>
<DataGridTextColumn Binding="{Binding [1]}" Header="Qty" Width="30*"/>
</DataGrid.Columns>
我确实看到了这个问题,但是尝试合并它会产生绑定异常..老实说,我真的不知道我在这里做什么..
<Setter Property="DataGrid.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRow}">
<Grid>
<ProgressBar Value="{Binding [2], Mode=OneWay}" Style="{StaticResource ProgressBarStyle}" Minimum="0" Maximum="100"/>
</Grid>
</ControlTemplate>
</Setter.Value>
编辑:答案效果很好,但留下了这个“错误”显示了三次:
System.Windows.Data Error: 1 : Cannot create default converter to perform 'one-way' conversions between types 'System.Boolean' and 'System.Windows.Controls.SelectiveScrollingOrientation'. Consider using Converter property of Binding. BindingExpression:Path=AreRowDetailsFrozen; DataItem='DataGrid' (Name='MyDg'); target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='False' BindingExpression:Path=AreRowDetailsFrozen; DataItem='DataGrid' (Name='MyDg'); target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
解决方案
您必须对 DataGridRow 进行模板化。首先,添加一个临时 DataGridRow 作为 DataGrid 的子元素,将光标放在该元素上,然后在属性窗口中转到 Miscellaneous -> Template,单击它右侧的小方块并选择“转换为新资源” . 这将在您的资源块中创建一个新的 DataGridRow 模板,然后您可以使用样式设置该模板。(由于某种原因,它也会使行标题出现在我的机器上,所以要么从模板中删除它,要么只在 DataGrid 上设置 `RowHeaderWidth='0')。
至于使您的进度条可见,只需将其添加为SelectiveScrollingGrid
模板中的第一个子项(如果您尚未删除第一列,那么您还需要将其 Grid.Column 设置为 1)。
将这些放在一起,您的 DataGrid 声明将如下所示(我添加了一个ItemsSource
您可能想要删除的绑定):
<DataGrid x:Name="MbpDg" ItemsSource="{Binding Items}" HeadersVisibility="Column" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False" HorizontalAlignment="Left" ColumnHeaderHeight="20" Height="221" Margin="0,1,0,0" VerticalAlignment="Top" Width="164" CanUserResizeRows="False" GridLinesVisibility="None">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding [2]}" Header="Size" Width="50"/>
<DataGridTextColumn Binding="{Binding [0]}" Header="Price" Width="50"/>
<DataGridTextColumn Binding="{Binding [1]}" Header="Qty" Width="30*"/>
</DataGrid.Columns>
</DataGrid>
在资源块中设置样式:
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Template" Value="{DynamicResource DataGridRowControlTemplate1}" />
</Style>
这是模板本身:
<ControlTemplate x:Key="DataGridRowControlTemplate1" TargetType="{x:Type DataGridRow}">
<Border x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<SelectiveScrollingGrid SelectiveScrollingOrientation="None">
<SelectiveScrollingGrid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</SelectiveScrollingGrid.RowDefinitions>
<ProgressBar HorizontalAlignment="Stretch" Value="{Binding [2]}" Minimum="0" Maximum="100"/>
<DataGridCellsPresenter ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<DataGridDetailsPresenter Grid.Row="1" Visibility="{TemplateBinding DetailsVisibility}" />
</SelectiveScrollingGrid>
</Border>
</ControlTemplate>
结果:
推荐阅读
- java - 使用jdk1.8.0时变成
- c# - 如何在 C# 中实现具有子菜单的控制台菜单
- reactjs - 为 NextJS 实现 Apollo 客户端,但无法读取未定义的属性“WebSocket”
- gitlab - 如何将第三方系统连接到 Gitlab 进行身份验证
- c# - 如何简化 It.IsAny
() 用于设置 Mocks 的参数 - php - 无法使相对路径、重写规则和路由的行为符合我的预期
- php - 将json转换为对象php
- python - 构造一个大于任何字符串的对象
- javascript - 在Javascript中自动完成输入日期?
- amazon-web-services - 卓:我的账户会收到意外费用吗?