如何在C#中创建一个'变量'方法名?

时间:2013-01-15 18:38:30

标签: c# wpf visual-studio-2010 methods

我是C#编程的新手,在C / C ++中有一点背景知识。我正在尝试写一个问题,就像均衡器一样,只是玩代码。想象一下5个垂直滑块彼此相邻,当你向上和向下移动中间滑块时,其他滑块会根据我稍后会弄清楚的哈希函数对特定值作出反应,此时我很简单方程。

然而,当我添加更多滑块时,我不想通过为每个滑块添加一个函数,所以有没有办法'检测'哪个滑块正在移动,并通过算法发送它来移动相邻的滑块?基本上,我想要一个功能将相邻的滑块移动到我选择移动的任何滑块上。从逻辑上讲,它是有道理的,但我不知道如何在代码中做到这一点。

我为特定滑块编写的功能如下。

private void slider3_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        double adjacentSliders = ((slider3.Value) / 4) * 3;
        double adjacentSliders2 = ((slider3.Value) / 2);
        slider2.Value = slider4.Value = adjacentSliders;
        slider1.Value = slider5.Value = adjacentSliders2;
    }

我可能没有完全解释,随意提问!

2 个答案:

答案 0 :(得分:3)

private void anySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
   var thisSlider = sender as Slider;
   ...
}

如果需要相邻的滑块,请在FormLoad中构建滑块列表。然后,您可以找到thisSlider的索引并从那里开始工作。

编辑:我不确定WPF在更改代码中的值时是否触发了事件。如果是这样,您可能需要这样做以防止它进入循环:

private static bool changingSlider = false;

private void anySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    if (! changingSlider)
    {
        changingSlider = true;      
        var thisSlider = sender as Slider;
        ...
        changingSlider = false;
}

答案 1 :(得分:0)

您也可以仅在xaml中执行此操作。你只需要一个FormulaCalculationConverter。我试过了,效果很好。

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication2="clr-namespace:WpfApplication2"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <sys:Double x:Key="MyValueFour">4.0</sys:Double>
    <sys:Double x:Key="MyValueTwo">2.0</sys:Double>
    <WpfApplication2:FormulaCalculationConverter x:Key="FormulaCalculationConverter"/>
</Window.Resources>
<StackPanel>
    <Slider x:Name="BaseSlider" />
    <Slider>
        <Slider.Value>
            <MultiBinding Converter="{StaticResource FormulaCalculationConverter}">
                <Binding Path="Value" ElementName="BaseSlider" Mode="OneWay"  />
                <Binding Path="." Source="{StaticResource MyValueFour}" />
            </MultiBinding>
        </Slider.Value>
    </Slider>
    <Slider >
        <Slider.Value>
            <MultiBinding Converter="{StaticResource FormulaCalculationConverter}">
                <Binding Path="Value" ElementName="BaseSlider" Mode="OneWay"  />
                <Binding Path="." Source="{StaticResource MyValueTwo}" />
            </MultiBinding>
        </Slider.Value>
    </Slider>
    <Slider Value="{Binding Path=Value, ElementName=BaseSlider}"/>
</StackPanel>
</Window>

我刚创建了一个像

这样的转换器
public class FormulaCalculationConverter : IMultiValueConverter
{
   // this is incomplete formula converter...
   public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   {
       // strictly assume for 1 + 1
       double retVal = 0;
       if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue
           || values[0] == null || values[1] == null)
       {
           return Binding.DoNothing;
       }
       // apply logic to split formula here
       retVal = System.Convert.ToDouble(values[0]) + System.Convert.ToDouble(values[1]);
       return retVal;
   }

   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
   {
       throw new NotImplementedException();
   }
}

但是你需要为转换器工作。让我知道你的想法。