我有一个slider实现System.Windows.Controls.Slider:
class MySlider : Slider
{
public MySlider()
{
Minimum = 1;
Maximum = 1000;
}
}
我这样使用它:
MySlider slider = new MySlider() { Width = 400, Name = "TheSlider"};
它运作良好,但是是线性的。
我想使其为非线性,因为合理的值例如为1、2、10、1000。
所以我定义了一个非线性IValueConverter像这样:
public class LogScaleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (int)Math.Log((int)value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (int)Math.Exp((double)value);
}
}
问题:如何使滑块使用此转换器?
最佳答案
更新:为您提供完整的工作代码。
MainWindow.xaml
<StackPanel>
<StackPanel.Resources>
<spikes:LogScaleConverter x:Key="LogScaleConverter"/>
</StackPanel.Resources>
<TextBox x:Name="InputNumberTextBox" Width="100" Text="{Binding InputNumber, Mode=TwoWay}"/>
<Slider Width="1000"
Minimum="1"
Maximum="100"
Value="{Binding ElementName=InputNumberTextBox,Path=Text, Mode=TwoWay,Converter={StaticResource LogScaleConverter}}"/>
</StackPanel>
LogScaleConverter.cs
public class LogScaleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var stringValue = value.ToString();
if (string.IsNullOrWhiteSpace(stringValue)) return null;
var intValue = int.Parse(stringValue);
return Math.Log(intValue);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (int)Math.Exp((double)value);
}
}
现在注意,当您在
textbox
中键入内容时,它将根据您的公式更改滑块的值。您可以在Convert
上放置一个断点,看看这是否是slider
中您真正想要的值。我认为没有必要创建
MySlider
类,因为您仅设置了Minimum
和Maximum
属性,这些属性已经在实际对象本身上可用。仅在创建自定义内容(例如定义自己的Dependency Properties
)时才应扩展控件。关于c# - 使滑块使用现有的IValueConverter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20946760/