WPF滑块 - 单击其轨道上的任何位置时将焦点设置在滑块上

时间:2014-04-23 05:40:17

标签: wpf wpf-controls wpf-4.0

我要求如果用户点击滑块上的任何位置,它应该获得逻辑焦点。如果我拖动滑块的拇指,它的工作原理。但是当我点击Track(增加和减少重复按钮 - 下图中显示的红色框)时,我遇到了一个问题,滑块没有获得焦点。请注意,我已将IsMoveToPointEnabled设置为true。

enter image description here

我尝试了很多事情:

  1. 通过在滑块template中设置所有Focusable = True来尝试。
  2. 有解决方法 - 在值更改时处理ValueChanged事件并在滑块上设置焦点显式。
  3. 有人可以帮我解决这个问题吗?

    <Slider IsMoveToPointEnabled="True"
                x:Name="testSlider"
                Focusable="True"
                Minimum="0"
                Maximum="1">
            <Slider.Style>
                <Style TargetType="Slider">
                    <Setter Property="Background" Value="Transparent"></Setter>
                    <Style.Triggers>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter Property="Background" Value="Green"></Setter>
                        </Trigger>
                    </Style.Triggers>
    
                </Style>
            </Slider.Style>
        </Slider>
    

1 个答案:

答案 0 :(得分:1)

只需从滑块中删除 IsMoveToPointEnabled="True" ,发布的代码就可以正常使用。


<强>更新

IsMoveToPointEnabled设置为True会占用鼠标按下事件,因为模板内的矩形用于移动到特定点。因此,它永远不会到滑块隧道,它不会得到焦点。

但是, MouseUp 事件已正确引发,因此您可以执行的操作是挂钩该事件并手动将焦点放在滑块上。

<强> XAML

<Slider IsMoveToPointEnabled="True"
        x:Name="testSlider"
        MouseUp="testSlider_MouseUp"
        Focusable="True"
        Minimum="0"
        Maximum="100">
    <Slider.Style>
        <Style TargetType="Slider">
            <Setter Property="Background" Value="Transparent"></Setter>
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Background" Value="Green"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Slider.Style>
</Slider>

代码

private void testSlider_MouseUp(object sender, MouseButtonEventArgs e)
{
    ((Slider)sender).Focus();
}