【问题标题】:How to remove the unusable space at the bottom of WPF DataGrid?如何删除 WPF DataGrid 底部的不可用空间?
【发布时间】:2021-06-04 18:02:39
【问题描述】:

这里在顶部还可以,但是滚动到最后就不好了:

我可以看到这是因为这个属性:Horizo​​ntalScrollBarVisibility,但无论我设置它是什么,它都会占用空间。我希望它彻底消失。

如果我让窗口足够长以显示所有项目,它就消失了,所以我认为它是垂直滚动条占用空间,从而使数据网格显示垂直滚动条空间。

<Window x:Class="ProfitTracker.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ProfitTracker"
    mc:Ignorable="d"
    SizeToContent="Width"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="Profit Tracker"
    WindowStyle="None"
    AllowsTransparency="True"
    Height="464">

<Window.Resources>
    <local:NullImageConverter x:Key="nullImageConverter"/>

    <Style x:Key="DataGridColumnSeparatorStyle" TargetType="DataGridCell">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Fill="#1e90ff"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="DataGridColumnAlarmStyle" TargetType="DataGridCell">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Fill="#000000"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="RowStyleWithAlternation" TargetType="DataGridRow">
        <Setter Property="Background" Value="#141414"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="FontWeight" Value="Normal"/>
        <Style.Triggers>
            <Trigger Property="AlternationIndex" Value="1">
                <Setter Property="Background" Value="#1e1e1e"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style TargetType="DataGridCell">
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Grid Background="{TemplateBinding Background}">
                        <ContentPresenter VerticalAlignment="Stretch"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="Padding" Value="0"/>
        <Setter Property="Margin" Value="0"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Style.Triggers>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value=" "/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Symbol"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Profit"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" />
                    <Setter Property="DataGridCell.Foreground" Value="{Binding Path=Balance.ProfitColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="PNL %"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Background" Value="{Binding Path=Balance.ProfitPercentageColor}" />
                    <Setter Property="DataGridCell.Foreground" Value="{Binding Path=Balance.ProfitColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Day %"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Background" Value="{Binding Path=PriceChangeDailyBackColor}" />
                    <Setter Property="DataGridCell.Foreground" Value="{Binding Path=PriceChangeDailyForeColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Hour %"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Background" Value="{Binding Path=PriceChangeHourlyBackColor}" />
                    <Setter Property="DataGridCell.Foreground" Value="{Binding Path=PriceChangeHourlyForeColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Min %"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Foreground" Value="{Binding Path=PriceChangeMinutelyForeColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Column.Header, RelativeSource={RelativeSource Self}}" Value="Net BTC/m"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="DataGridCell.Background" Value="{Binding Path=LastMinuteVolumeColor}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>

            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="{x:Null}" />
                <Setter Property="BorderBrush" Value="{x:Null}" />
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style TargetType="DataGridColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Center" />
    </Style>

    <Style TargetType="{x:Type ProgressBar}">
        <Setter Property="Padding" Value="0"/>
        <Setter Property="Margin" Value="0"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ProgressBar">
                    <Border BorderThickness="1" Background="#006400" CornerRadius="0" Padding="0">
                        <Grid x:Name="PART_Track">
                            <Rectangle x:Name="PART_Indicator" HorizontalAlignment="Left" Fill="#640000" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <CollectionViewSource Source="{Binding Coins}" IsLiveSortingRequested="True" x:Key="MyKey" />

</Window.Resources>

<Grid>
    <DataGrid Name="dataGrid" ItemsSource="{Binding Source={StaticResource MyKey}}"  GridLinesVisibility="None" HorizontalScrollBarVisibility="Hidden" RowHeaderWidth="0" IsReadOnly="True" CanUserAddRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" AutoGenerateColumns="False" AlternatingRowBackground="#282828" RowStyle="{StaticResource RowStyleWithAlternation}">
        <DataGrid.Columns>

            <DataGridTemplateColumn Header=" " MinWidth="0" Width="10"/>

            <DataGridTemplateColumn Header="Symbol" Width="74">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image RenderOptions.BitmapScalingMode="HighQuality" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Height="16" Margin="4,2,6,2" Source="{Binding IconFile, Converter={StaticResource nullImageConverter}}" />
                            <TextBlock Text="{Binding Path=Symbol}" HorizontalAlignment="Left"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn MinWidth="0" Width="2" CellStyle="{StaticResource DataGridColumnSeparatorStyle}"/>
            <DataGridTextColumn Header="Lowest" Width="64" Binding="{Binding Path=LowestDailyPriceDisplay}" Foreground="#b40000"/>

            <DataGridTemplateColumn Header="Price" Width="64">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <ProgressBar Value="{Binding Path=PriceProgress, Mode=OneWay}" Minimum="0" Maximum="1"/>
                            <TextBlock Text="{Binding Path=PriceDecimalDisplay}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Header="Highest" Width="64" Binding="{Binding Path=HighestDailyPriceDisplay}" Foreground="#00b400"/>
            <DataGridTemplateColumn MinWidth="0" Width="2" CellStyle="{StaticResource DataGridColumnSeparatorStyle}"/>
            <DataGridTextColumn Header="Unit Price" Width="64" Binding="{Binding Path=Balance.UnitPriceDisplay}" />
            <DataGridTextColumn Header="Amount" Width="64" Binding="{Binding Path=Balance.AvailableAmountDisplay}" />
            <DataGridTextColumn Header="Capital" Width="64" Binding="{Binding Path=Balance.TotalValueDisplay}" />
            <DataGridTemplateColumn MinWidth="0" Width="2" CellStyle="{StaticResource DataGridColumnSeparatorStyle}"/>
            <DataGridTextColumn Header="Profit" Width="64" Binding="{Binding Path=Balance.ProfitDisplay}"/>
            <DataGridTextColumn Header="PNL %" Width="64" Binding="{Binding Path=Balance.ProfitPercentageDisplay}"/>
            <DataGridTextColumn Header="Day %" Width="64" Binding="{Binding Path=PriceChangeInPercentDailyDisplay}"/>
            <DataGridTextColumn Header="Hour %" Width="64" Binding="{Binding Path=PriceChangeInPercentHourlyDisplay}"/>
            <DataGridTemplateColumn MinWidth="0" Width="2" CellStyle="{StaticResource DataGridColumnSeparatorStyle}"/>
            <DataGridTextColumn Header="Min %" Width="64" Binding="{Binding Path=PriceChangeInPercentMinutelyDisplay}"/>

            <DataGridTemplateColumn Header="Vol BTC/h" Width="64">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <ProgressBar Value="{Binding Path=TotalSellVolumePercentage, Mode=OneWay}" Minimum="0" Maximum="1"/>
                            <TextBlock Text="{Binding Path=LastHourVolumeInBtcDisplay}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Header="Net BTC/m" Width="64" Binding="{Binding Path=LastMinuteVolumeInBtcDisplay}"/>
        </DataGrid.Columns>
    </DataGrid>
    <Border x:Name="DragControl" local:EnableDragHelper.EnableDrag="True" Visibility="Hidden">
        <TextBlock Text=" "/>
    </Border>
</Grid>

【问题讨论】:

  • 您的代码没有导致它出现在我的机器上,它一定是由于流氓模板或您项目中未包含在此处的其他内容。
  • 所以你看不到水平滚动条?
  • 不,一点也不。我确实必须删除你对转换器的使用,因为你还没有发布它的来源,而我绑定的 ItemsSource 是string[](尽管我怀疑这会导致这样的事情)。如果您想发布mcve,我很乐意再看一下,但您的项目中似乎还有其他原因导致了这个,而您没有包括在内。
  • 实际上,等等……您的内容似乎一直延伸到列表控件的右边缘(并且可能超出),在这种情况下,它的可见性是正常的。您到底想做什么,夹住内容以使滚动条不出现?
  • 是的,基本上调整窗口大小,使其适合宽度。我将发布显示窗口顶部和底部的更新图像,因为当我在顶部时我看不到水平滚动条。

标签: c# .net wpf datagrid styling


【解决方案1】:

哦,好的,从您的评论看来,您希望窗口自动调整大小以适应内容,对吗? WPF 窗口默认情况下不这样做,但您可以通过以下方式启用它:

<Window
    ...etc....
    SizeToContent="Width">

【讨论】: