XAML 关于Win UI中的滑块标签

mrzz3bfm  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(72)

我有一个关于Win UI滑块及其标签的查询。从我目前所看到的,标签往往是整数表示滑块的值。是否可以使用自定义标签,例如字符串?这是否可以通过使用标签模板实现?我已经搜索了文档和其他文章,但没有发现任何太有帮助的东西。有没有可能得到一个如何编码的例子?
我有一个滑块,范围从值10到30,但我希望标签是每十个刻度后。例如,标签可以是诸如“慢”(值为10)、“中”(值为20)和“快”(值为30)之类的东西。我可以通过从代码隐藏中的数组或XAML部分本身中阅读来做到这一点吗?
非常感谢您的时间,提前!
我试着查看文档和其他在线文章概述自定义标签,但它们没有显示任何关于自定义字符串标签的内容,而只是整数和/或浮点数。因此,我不太确定这是否可能。

pbwdgjma

pbwdgjma1#

你可以创建一个自定义的Slider,它接受一个值转换器:

SliderEx.cs

public class SliderEx : Slider
{
    public IValueConverter? ValueConverter { get; set; }

    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        this.LayoutUpdated += Slider_LayoutUpdated;
    }

    private void Slider_LayoutUpdated(object? sender, object e)
    {
        if (VisualTreeHelper
            .GetOpenPopupsForXamlRoot(this.XamlRoot)
            .FirstOrDefault() is not Popup popup ||
            popup.Child.FindDescendant<TextBlock>() is not TextBlock popupTextBlock)
        {
            return;
        }

        popupTextBlock.SetBinding(
            TextBlock.TextProperty,
            new Binding
            {
                Source = this,
                Path = new PropertyPath(nameof(this.Value)),
                Mode = BindingMode.OneWay,
                Converter = this.ValueConverter,
            });

        this.LayoutUpdated -= Slider_LayoutUpdated;
    }
}

ValueToSpeedConverter.cs

public class ValueToSpeedConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (double)value switch
        {
            >= 0 and < 20 => "Slow",
            >= 20 and < 30 => "Medium",
            >= 30 => "Fast",
            _ => $"{value}?",
        };
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

然后像这样使用它:

<StackPanel>
    <StackPanel.Resources>
        <local:ValueToSpeedConverter x:Key="ValueToSpeedConverter" />
    </StackPanel.Resources>

    <local:SliderEx
        x:Name="SliderControl"
        ValueConverter="{StaticResource ValueToSpeedConverter}"/>
</StackPanel>

相关问题