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;
      }
}

私の質問は、スライダーの名前を取得して、構造で直接参照できるものに変換する方法はありますか? たとえば、構造体で使用slider.Name = "slider_20Hz"する変数に in を入れたい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

すべての FrameworkElements と同様に、Slider コントロールには、独自に使用するプロパティが必要なこれらの種類の状況に対応する Tag プロパティがあります。

<Slider Tag="slider_20Hz"/>

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