我有一个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类,因为您仅设置了MinimumMaximum属性,这些属性已经在实际对象本身上可用。仅在创建自定义内容(例如定义自己的Dependency Properties)时才应扩展控件。

关于c# - 使滑块使用现有的IValueConverter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20946760/

10-09 16:09