1

我有一个看起来像这样的结构:

public struct ChannelSettings
{
    public double slider20Hz;
    public double slider25Hz;
    public double slider31_5Hz;
    public double slider40Hz;
}

当滑块值像这样更改时,我正在遍历我的用户界面对象:

foreach (Slider slider in grdEqSliders.Children)
{
     // slidername = slider.Name;
     switch(currentChannel)
     {
         case 1:
            // Assign to channel.slidername
            break;
         case 2:
            // Assign to channel.slidername
            break;
         default:
            break;
      }
}

我的问题是,有没有办法让我获得滑块名称,然后将其转换为我可以直接在我的结构中引用的东西?例如,我想将in 转换为我在结构中使用slider.Name = "slider_20Hz"的变量。slider20Hz

4

2 回答 2

5

将定义保留为现在的唯一方法struct是使用反射 - 虽然非常混乱。

另一种选择 - 更改定义 - 是将值存储在字典中:

public class ChannelSettings {
  Dictionary<string, double> _values = new Dictionary<string, double>();

   public double slider20Hz {
     get {
       return GetByName("slider20Hz");
     }
     set {
       _values["slider20Hz"] = value;
     }
   }

   . . . 

   public void SetByName(string name, double value) {
     _values[name] = value;
   }

   public double GetByName(string name) {
     double v;
     if (_values.TryGetValue("slider20Hz", out v)) {
       return v;
     }
     return 0.0; // Default value
   }

}

然后设置一个给定名称的值,您可以编写:

channel.SetByName(slider.Name, . . . )

并获得一个值:

channel.GetByName(slider.Name)
于 2013-05-06T19:33:51.487 回答
1

Slider 控件和所有的 FrameworkElements 一样,都有一个 Tag 属性,用于这些类型的情况,您需要一个属性供您自己使用。

<Slider Tag="slider_20Hz"/>

foreach (Slider slider in grdEqSliders.Children)
{
     slidername = slider.Tag as string;
     ...
}
于 2013-05-06T19:29:27.003 回答