如何制作';变量';C#中的方法名称?

如何制作';变量';C#中的方法名称?,c#,wpf,visual-studio-2010,methods,C#,Wpf,Visual Studio 2010,Methods,我不熟悉C#编程,对C/C++有点了解。我试图写一个问题,就像一个均衡器,只是在玩代码。想象一下5个垂直滑块彼此相邻,当你上下移动中间的滑块时,其他滑块会根据一个散列函数做出特定的反应,我将在稍后的时间计算出来,此时我有了简单的方程 但是,当我添加更多滑块时,我不想为每个滑块都添加一个函数,所以有没有办法“检测”哪个滑块正在移动,并通过算法将其发送到相邻的滑块?基本上,我想用一个函数将相邻的滑块移动到我选择移动的任何滑块。从逻辑上讲,这是有道理的,但我不知道如何在代码中实现它 下面是我为特定滑块

我不熟悉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;
    }
private void slider3\u值已更改(对象发送方,RoutedPropertyChangedEventArgs e)
{
双相邻滑块=((slider3.Value)/4)*3;
双邻接滑块2=((slider3.Value)/2);
slider2.Value=slider4.Value=相邻的滑块;
slider1.Value=slider5.Value=AdjacentSlider2;
}
我可能还没有完全解释,请随意提问

我有一段时间没有使用C#和visualstudio,所以我不记得在窗口设计器中是否有直接使用数组的方法,有人应该在注释中明确这一点;)

private void anySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
   var thisSlider = sender as Slider;
   ...
}
但您可能希望的是,不要声明slider1、slider2、slider3。。。您应该使用数组,以便可以访问滑块[0]、滑块[1]、

为此,首先必须更改表单的设计以使用数组,然后在处理程序中访问该数组

无阵列:

        private System.Windows.Forms.TrackBar trackBar1;
        private System.Windows.Forms.TrackBar trackBar2;
        private System.Windows.Forms.TrackBar trackBar3;

        [...]

        this.trackBar1 = new System.Windows.Forms.TrackBar();
        this.trackBar2 = new System.Windows.Forms.TrackBar();
        this.trackBar3 = new System.Windows.Forms.TrackBar();
        ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).BeginInit();
        this.SuspendLayout();
        // 
        // trackBar1
        // 
        this.trackBar1.Location = new System.Drawing.Point(154, 80);
        this.trackBar1.Name = "trackBar1";
        this.trackBar1.Size = new System.Drawing.Size(104, 45);
        this.trackBar1.TabIndex = 0;
        // 
        // trackBar2
        // 
        this.trackBar2.Location = new System.Drawing.Point(154, 132);
        this.trackBar2.Name = "trackBar2";
        this.trackBar2.Size = new System.Drawing.Size(104, 45);
        this.trackBar2.TabIndex = 1;
        // 
        // trackBar3
        // 
        this.trackBar3.Location = new System.Drawing.Point(154, 184);
        this.trackBar3.Name = "trackBar3";
        this.trackBar3.Size = new System.Drawing.Size(104, 45);
        this.trackBar3.TabIndex = 2;
使用阵列:

        private System.Windows.Forms.TrackBar[] trackBar = new System.Windows.Forms.TrackBar[3];

        [...]
        this.SuspendLayout();

        for(int n = 0; n < 3; n++) {
            this.trackBar[n] = new System.Windows.Forms.TrackBar();
            ((System.ComponentModel.ISupportInitialize)(this.trackBar[n])).BeginInit();

            this.trackBar[n].Location = new System.Drawing.Point(154, 80 + n*52);
            this.trackBar[n].Name = "trackBar[" + n + "]";
            this.trackBar[n].Size = new System.Drawing.Size(104, 45);
            this.trackBar[n].TabIndex = 0;
        }
private System.Windows.Forms.TrackBar[]TrackBar=new System.Windows.Forms.TrackBar[3];
[...]
这个.SuspendLayout();
对于(int n=0;n<3;n++){
this.trackBar[n]=new System.Windows.Forms.trackBar();
((System.ComponentModel.ISupportInitialize)(this.trackBar[n])).BeginInit();
this.trackBar[n].Location=new System.Drawing.Point(154,80+n*52);
this.trackBar[n].Name=“trackBar[“+n+”]”;
this.trackBar[n].Size=新系统.Drawing.Size(104,45);
this.trackBar[n].TabIndex=0;
}

然后,您可以通过轨迹栏[x]访问所有轨迹栏。您可以将声明和for循环中的3更改为所需的常量或变量。

您也可以仅在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>

但是你需要为这个做转换器。让我知道你的想法。

你想要一系列的滑块。我想我知道你想做什么了。。。不,我不明白。我想选民们会的,是的。我还是不明白。这看起来像是第一步,后面还有五步。我可能会想出来,但我知道我在做什么。我没有假装发布完整的工作代码答案。我很少这样做。我认为这是OP缺少的部分。当新滑块添加到集合中时,如何为其编写事件代码<代码>滑块3\u值已更改仅适用于滑块3。您只需要1个事件处理程序。使用
sender
使其成为通用的。表单必须维护一个列表,这是大部分工作。(但我更改了名称:-)OP使用WPF,而不是WinForms。数组和设计器代码不是互斥的。哦,对不起。没有看到wpf标签。
<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();
   }
}