WPF 入门教程Slider控件介绍

Slider控件允许您通过沿水平线或垂直线拖动拇指来选取数值。您可以在许多用户界面中看到它,但仅从描述中识别它仍然有点困难,因此这是一个非常基本的示例:

<Window x:Class="WpfTutorialSamples.Misc_controls.SliderSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SliderSample" Height="100" Width="300">
    <StackPanel VerticalAlignment="Center" Margin="10">
        <Slider Maximum="100" />
    </StackPanel>
</Window>

这将允许最终用户通过沿线拖动按钮(称为拇指)来选择 0 到 100 之间的值。

在示例中,我将拇指拖到中间,但显然很难看到确切的值。解决此问题的一种方法是打开刻度线,这是线上显示的小标记,可以更好地指示拇指的距离。下面是一个例子:

<Window x:Class="WpfTutorialSamples.Misc_controls.SliderSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SliderSample" Height="100" Width="300">
    <StackPanel VerticalAlignment="Center" Margin="10">
        <Slider Maximum="100" TickPlacement="BottomRight" TickFrequency="5" />
    </StackPanel>
</Window>

我通过给 TickPlacement 属性另一个值而不是 None 来打开刻度标记,这是默认值。在我的示例中,我希望将刻度线放置在线条下方,但您可以使用 TopLeft 甚至 Both 作为可能的值来更改它。

还要注意我对 TickFrequency 属性的使用。它默认为 1,但在可能值的范围从 0 到 100 的示例中,这将导致 100 个刻度标记,这些标记必须适合有限的空间。在这种情况下,将 TickFrequency 提高到使其看起来不那么拥挤的程度是有意义的。

捕捉到刻度

如果您查看上面的屏幕截图,您会看到拇指位于刻度之间。这是有道理的,因为每个刻度之间有五个值,由 TickFrequency 属性指定。此外,Slider 控件的值实际上默认为双精度值,这意​​味着该值可以(并且很可能)是非整数。我们可以使用 IsSnapToTickEnabled 属性更改此 设置 ,如下例所示:

<Window x:Class="WpfTutorialSamples.Misc_controls.SliderSnapToTickSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SliderSnapToTickSample" Height="100" Width="300">
    <StackPanel VerticalAlignment="Center" Margin="10">
        <Slider Maximum="100" TickPlacement="BottomRight" TickFrequency="10" IsSnapToTickEnabled="True" />
    </StackPanel>
</Window>

请注意,我已将 TickFrequency 更改为 10,然后启用了 IsSnapToTickEnabled 属性。这确保了拇指只能直接放在刻度值上,因此对于本示例,它只能是 0、10、20、30、40 等。

滑块值

到目前为止,我们只是示例性地使用了 Slider,但当然,实际目的是读取其当前值并将其用于某事。Slider 有一个 Value 属性,您当然可以从代码隐藏中读取,甚至绑定到该属性。

使用 Slider 的一个常见场景是将它与 TextBox 结合使用,这将允许用户查看当前选定的值,以及通过输入数字而不是拖动 Slider 拇指来更改它。通常,您必须订阅 Slider 和 TextBox 上的更改事件,然后相应地更新,但是一个简单的绑定可以为我们完成所有这些:

<Window x:Class="WpfTutorialSamples.Misc_controls.SliderBoundValueSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SliderBoundValueSample" Height="100" Width="300">
    <DockPanel VerticalAlignment="Center" Margin="10">
        <TextBox Text="{Binding ElementName=slValue, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" />
        <Slider Maximum="255" TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="True" Name="slValue" />
    </DockPanel>
</Window>

现在您可以通过使用滑块或通过在文本框中输入值来更改值,它会立即反映在另一个控件中。作为一个额外的好处,我们也得到了简单的验证,没有任何额外的工作,就像我们尝试在 TextBox 中输入一个非数字值:

响应更改的值

当然,虽然绑定在很多方面都非常酷,但您仍然可能希望从代码隐藏中响应 Slider 值的更改。对我们来说幸运的是,Slider 带有一个 ValueChanged 事件,它将帮助我们解决这个问题。为了说明这一点,我创建了一个带有三个滑块的更复杂的示例,我们在其中更改了一种颜色的红色、绿色和蓝色 (RGB) 值:

<Window x:Class="WpfTutorialSamples.Misc_controls.SliderValueChangedSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SliderValueChangedSample" Height="200" Width="300">
    <StackPanel Margin="10" VerticalAlignment="Center">
        <DockPanel VerticalAlignment="Center" Margin="10">
            <Label DockPanel.Dock="Left" FontWeight="Bold">R:</Label>
            <TextBox Text="{Binding ElementName=slColorR, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" />
            <Slider Maximum="255" TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="True" Name="slColorR" ValueChanged="ColorSlider_ValueChanged" />
        </DockPanel>
        <DockPanel VerticalAlignment="Center" Margin="10">
            <Label DockPanel.Dock="Left" FontWeight="Bold">G:</Label>
            <TextBox Text="{Binding ElementName=slColorG, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" />
            <Slider Maximum="255" TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="True" Name="slColorG" ValueChanged="ColorSlider_ValueChanged" />
        </DockPanel>
        <DockPanel VerticalAlignment="Center" Margin="10">
            <Label DockPanel.Dock="Left" FontWeight="Bold">B:</Label>
            <TextBox Text="{Binding ElementName=slColorB, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" />
            <Slider Maximum="255" TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="True" Name="slColorB" ValueChanged="ColorSlider_ValueChanged" />
        </DockPanel>
    </StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Media;
namespace WpfTutorialSamples.Misc_controls
	public partial class SliderValueChangedSample : Window
		public SliderValueChangedSample()
			InitializeComponent();
		private void ColorSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)