user1246682
user1246682

Reputation: 206

WPF Slider - Setting focus on slider on clicking anywhere on its Track

I have requirement that if user clicks anywhere on slider, it should get the logical focus. It works, if I drag the thumb of the slider. But I am facing an issue when I click on Track(Increase and Decrease repeat button - Red box shown in below image), slider is not getting focus. Please note that I have set IsMoveToPointEnabled to true.

enter image description here

Couple of things that I tried:

  1. Tried by setting everything Focusable=True in slider template.
  2. Has workaround - Handling ValueChanged event and setting focus explicity on slider when value changes.

Can someone please help me to solve this issue?

<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>

Upvotes: 1

Views: 3052

Answers (1)

Rohit Vats
Rohit Vats

Reputation: 81348

Just remove IsMoveToPointEnabled="True" from your slider and posted code works fine.


UPDATE

Setting IsMoveToPointEnabled to True eat up the mouse down event since rectangle inside template used it to move to specific point. Hence, it never get tunnel to slider and it doesn't get focus.

However, MouseUp event is raised properly so what you can do is hook that event and manually put focus on the slider.

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>

Code behind

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

Upvotes: 1

Related Questions