带控件模板拇指的滑块会影响值吗?

时间:2017-07-18 02:35:00

标签: c# .net wpf slider

我注意到一些奇怪的(但是逻辑的)行为,我有一个滑块,我已经覆盖了我想要覆盖的Thumb控件模板。这不是完整的XAML,但它是关键部分。红色矩形是手柄,中间有一条白色水平线。

<Slider VerticalAlignment="Center"
        Orientation="Vertical"
        IsMoveToPointEnabled="True"/>

<ControlTemplate TargetType="{x:Type Thumb}">
        <Grid Margin="0,1,0,1" SnapsToDevicePixels="True">
            <Border Name="PART_Border"
                    Background="White"
                    Height="1"/>
            <Rectangle x:Name="PART_Grip" Fill="Red" Height="50" Width="15" ClipToBounds="True"/>
        </Grid>
</ControlTemplate>

在后面的代码中,如果我以滑块的样式将模板连接到拇指,它会给我一个漂亮的小滑块,这就是我想要的。

但是,一旦我开始滑动它,我注意到当你拥有Rectangle时功能略有不同。当您向上拖动时,Thumb到达轨道的末端(这里以绿色粗略显示),但Thumb将停在矩形的顶部,这意味着白线与轨道的正确对齐刻度值。

如果您从Rectangle PART_Grip中删除Grid并将其一直向上滑动,则白线将与最后一个勾号对齐,如下所示:

<ControlTemplate TargetType="{x:Type Thumb}">
            <Grid Margin="0,1,0,1" SnapsToDevicePixels="True">
                <Border Name="PART_Border"
                        Background="White"
                        Height="1"/>
            </Grid>
</ControlTemplate>

如何将Rectangle放置在Grid中,以允许矩形超出轨道的末端,但白线将与刻度线对齐,仍然是中心?我尝试将Rectangle改为Adorner,但这样做有效,但似乎无法在DragDelta上正确触发Thumb,因此您无法将拇指向上拖动。也许有一种方法可以覆盖刻度线功能并偏移Rectangle高度,而无需走Adorner路线?

我想看到的内容:

enter image description here

1 个答案:

答案 0 :(得分:0)

我发现了两种不同的方法。

直线负边距偏移量是Grip高度的1/2,在这种情况下是50。

<Grid Margin="0,-25,0,-25">

这很有效。

稍微复杂一点的方法:嵌套画布,并直接对Grip进行限制。

<Grid>
    <Border/>
    <Canvas>
        <Rectangle x:Name="PART_Grip" Margin="0, -25, 0, 0"/>
    </Canvas>
</Grid>

如果你想要滚动的话,画布允许你做一些像抓握鼠标一样容易的东西。 当然,如果方向是水平的,这也是有效的,它只是宽度而不是高度和顶部而不是左边距。