从 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
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}}"
恐怕你不能在不修改 Style
的情况下更改 StringFormat
。您可以做的是绑定到 Style
:
中 Slider
的 Tag
属性
<TextBlock x:Name="sliderValue"
FontSize="10"
Foreground="Silver"
Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=Slider}}"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
...然后处理每个个体 Slider
的 ValueChanged
事件并将 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" />
我有这个 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}}"
恐怕你不能在不修改 Style
的情况下更改 StringFormat
。您可以做的是绑定到 Style
:
Slider
的 Tag
属性
<TextBlock x:Name="sliderValue"
FontSize="10"
Foreground="Silver"
Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=Slider}}"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
...然后处理每个个体 Slider
的 ValueChanged
事件并将 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" />