c# - 无法在 DataGrid 中拖动自定义 ScrollBar Thumb(但 RepeatButtons 可以正常工作)?

标签 c# wpf xaml datagrid controltemplate

我试过自定义 WPF 中 DataGridScrollBar 的外观,只需在 ScrollBar 上应用新样式即可.此样式将 ScrollBarTemplate 更改为新样式。几乎可以正常工作,只是我无法将鼠标按住 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 似乎无法与之交互。

这是网格的截图:

enter image description here

最佳答案

一切正常,只需在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/

相关文章:

c# - BeforeBuild 事件未触发

c# - 为什么我在 C# 中需要分部类和虚方法?

c# - 如何使用 JavaScript 获取客户端系统的屏幕分辨率

wpf - 如何在 slider 值更改时使 TextBlock.Text = Slider.Value

c# - 在程序运行时编译/执行 XAML

c# - 如何以编程方式保持自定义设置 Charm 弹出窗口打开?

c# - 构造函数字符串参数与 Ninject 的基于约定的绑定(bind)

.net - NavigationService 什么时候初始化?

c# - 加载前的 WPF 图像初始大小

c# - 从 UserControl 的 DependencyProperty 绑定(bind)不起作用