代码之家  ›  专栏  ›  技术社区  ›  falukky

从滑块定义更改SliderThumbStyle值

  •  0
  • falukky  · 技术社区  · 6 年前

    我有这个 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 StringFormat 但是 N0 仅用于整数值。

    当我定义我的 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}}"
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   mm8    6 年前

    恐怕你不能改变 StringFormat 不修改 Style 是的。你能做的就是绑定到 Tag 财产 Slider 在你的 风格 :

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

    …然后处理 ValueChanged 每个人的事件 滑块 并设置 标签 属性设置为 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" />