我试过自定义 WPF 中 DataGrid
的 ScrollBar
的外观,只需在 ScrollBar
上应用新样式即可.此样式将 ScrollBar
的 Template
更改为新样式。几乎可以正常工作,只是我无法将鼠标按住 Thumb
并拖动以滚动,我只需单击 RepeatButtons
(两个 Line 按钮
和 Page buttons
可以正常工作)滚动。
我还是 WPF 的新手,我不知道这里可能有什么问题。这是代码:
<DataGrid HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding}" SnapsToDevicePixels="True">
<DataGrid.Resources>
<Style TargetType="ScrollBar">
<Style.Resources>
<ControlTemplate x:Key="verRepeat" TargetType="RepeatButton">
<Border CornerRadius="4" BorderBrush="Green" BorderThickness="1" Background="Yellow">
<ContentPresenter Width="18" Height="18"/>
</Border>
</ControlTemplate>
<ControlTemplate x:Key="midRepeat" TargetType="RepeatButton">
<Border Background="Transparent">
<ContentPresenter/>
</Border>
</ControlTemplate>
<ControlTemplate x:Key="verScroll" TargetType="ScrollBar">
<Grid>
<Grid.RowDefinitions>
<RowDefinition MaxHeight="18"/>
<RowDefinition/>
<RowDefinition MaxHeight="18"/>
</Grid.RowDefinitions>
<Border Grid.RowSpan="3"/>
<RepeatButton Grid.Row="0" Width="18" Command="ScrollBar.LineUpCommand" Template="{StaticResource verRepeat}">
</RepeatButton>
<Track Grid.Row="1" IsDirectionReversed="True">
<Track.DecreaseRepeatButton>
<RepeatButton Command="ScrollBar.PageUpCommand" Template="{StaticResource midRepeat}">
</RepeatButton>
</Track.DecreaseRepeatButton>
<Track.Thumb>
<Thumb Margin="2,0,2,0">
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<Border Background="Green"/>
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Command="ScrollBar.PageDownCommand" Template="{StaticResource midRepeat}">
</RepeatButton>
</Track.IncreaseRepeatButton>
</Track>
<RepeatButton Grid.Row="2" Command="ScrollBar.LineDownCommand" Template="{StaticResource verRepeat}">
</RepeatButton>
</Grid>
</ControlTemplate>
<ControlTemplate x:Key="horScroll" TargetType="ScrollBar">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="18"/>
<ColumnDefinition Width="0.00001*"/>
<ColumnDefinition MaxWidth="18"/>
</Grid.ColumnDefinitions>
<Border Grid.ColumnSpan="3"/>
<RepeatButton Grid.Column="0" Height="18" Command="ScrollBar.LineLeftCommand" Template="{StaticResource verRepeat}">
</RepeatButton>
<Track Grid.Column="1" IsDirectionReversed="False" Focusable="False">
<Track.DecreaseRepeatButton>
<RepeatButton Command="ScrollBar.PageLeftCommand" Template="{StaticResource midRepeat}">
</RepeatButton>
</Track.DecreaseRepeatButton>
<Track.Thumb>
<Thumb>
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<Grid>
<Border Background="Green" Margin="0,1,0,1"/>
<ContentPresenter Width="18" Height="18"/>
</Grid>
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Command="ScrollBar.PageRightCommand" Template="{StaticResource midRepeat}">
</RepeatButton>
</Track.IncreaseRepeatButton>
</Track>
<RepeatButton Grid.Column="2" Command="ScrollBar.LineRightCommand" Template="{StaticResource verRepeat}">
</RepeatButton>
</Grid>
</ControlTemplate>
</Style.Resources>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Style.Triggers>
<Trigger Property="Orientation" Value="Horizontal">
<Setter Property="Template" Value="{StaticResource horScroll}"/>
</Trigger>
<Trigger Property="Orientation" Value="Vertical">
<Setter Property="Template" Value="{StaticResource verScroll}"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
</DataGrid>
我想我在这里漏掉了什么,Thumb
似乎无法与之交互。
这是网格的截图:
最佳答案
一切正常,只需在Track
中添加PART_Track
的名称如下:
<Track x:Name="PART_Track" Grid.Row="1" IsDirectionReversed="True" ... />
没有这个 Thumb
就不能工作。
注意:在设计模板和样式时,最好查看原件,至少是为了了解样式的名称。
Here是对 Template
的重要部分的一些描述。
关于c# - 无法在 DataGrid 中拖动自定义 ScrollBar Thumb(但 RepeatButtons 可以正常工作)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901383/