从 Slider 定义更改 SliderThumbStyle 值

Change SliderThumbStyle value from Slider definition

我有这个 SliderThumbStyle:

<Style x:Key="SliderThumbStyle" TargetType="{x:Type Thumb}">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Thumb}">
                    <Grid>
                        <Border Name="outerBorder"
                                Background="{DynamicResource ApplicationBorderBrush}"
                                BorderBrush="{DynamicResource ApplicationBorderBrush}"
                                Height="24"
                                Width="24"
                                Opacity="1" 
                                BorderThickness="2"
                                CornerRadius="10"/>
                        <TextBlock x:Name="sliderValue"
                                   FontSize="10"
                                   Foreground="Silver"
                                   Text="{Binding Value, RelativeSource={RelativeSource AncestorType=Slider}, StringFormat={}{0:N1}}"
                                   VerticalAlignment="Center"
                                   HorizontalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在我的应用程序中,我使用了这个滑块 Style 两次,但其中一个不需要这个 N1 StringFormatN0 仅用于整数值。

当我高级定义 Slider 时,知道如何选择它吗?

作为 mm8 建议我试试这个:

<Slider Tag="{Binding Value, RelativeSource={RelativeSource Self}, StringFormat=N1}" />

风格:

Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=Slider}}"/>

但它现在似乎以 N1 格式显示值,但 1.23456789

我也试试这个:

Tag="{Binding Value, RelativeSource={RelativeSource Self}, StringFormat={}{0:N1}}"

恐怕你不能在不修改 Style 的情况下更改 StringFormat。您可以做的是绑定到 Style:

SliderTag 属性
<TextBlock x:Name="sliderValue"
            FontSize="10"
            Foreground="Silver"
            Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=Slider}}"
            VerticalAlignment="Center"
            HorizontalAlignment="Center"/>

...然后处理每个个体 SliderValueChanged 事件并将 Tag 属性 设置为格式化的 string:

private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    Slider slider = (Slider)sender;
    slider.Tag = slider.Value.ToString("N1");
}

您可能希望将此功能包装为附加行为:

public class SliderFormatBehavior
{
    public static string GetStringFormat(Slider treeViewItem)
    {
        return (string)treeViewItem.GetValue(StringFormatProperty);
    }

    public static void SetStringFormat(Slider slider, string value)
    {
        slider.SetValue(StringFormatProperty, value);
    }

    public static readonly DependencyProperty StringFormatProperty =
        DependencyProperty.RegisterAttached(
        "StringFormat",
        typeof(string),
        typeof(SliderFormatBehavior),
        new UIPropertyMetadata(null, OnStringFormatChanged));

    static void OnStringFormatChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        Slider slider = depObj as Slider;
        if (slider != null)
        {
            if (slider.IsLoaded)
            {
                SetTag(slider);
            }
            else
            {
                slider.Loaded += Slider_Loaded;
            }
            slider.ValueChanged += Slider_ValueChanged;
        }
    }

    private static void Slider_Loaded(object sender, RoutedEventArgs e)
    {
        Slider slider = (Slider)sender;
        SetTag(slider);
        slider.Loaded -= Slider_Loaded;
    }

    private static void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        SetTag((Slider)sender);
    }

    private static void SetTag(Slider slider)
    {
        slider.Tag = slider.Value.ToString(GetStringFormat(slider));
    }
}

示例用法:

<Slider ... local:SliderFormatBehavior.StringFormat="N1" />