Использование цикла для создания переменных в C # - PullRequest
0 голосов
/ 02 февраля 2019

Я создаю приложение, которое измеряет время, в течение которого человек рассматривал около 300 объектов.Для всех объектов необходимо вывести время в текстовый файл.Я успешно закодировал это только для одного объекта, но я пытаюсь сделать это для 300 объектов.Это код, который я создал для одного объекта:

Stopwatch Timer = new Stopwatch();
        gazeButtonControl1 = GazeInput.GetGazeElement(GazeBlock1);
        gazeButtonControl1 = new GazeElement();
        GazeInput.SetGazeElement(GazeBlock1, gazeButtonControl1);
        TimeSpan Word1 = TimeSpan.Zero;
        gazeButtonControl1.StateChanged += GazeBlockControl1_StateChanged;
        void GazeBlockControl1_StateChanged(object sender, StateChangedEventArgs ea)
        {
            if (ea.PointerState == PointerState.Enter)
            {
                Timer.Start();

            }


            if (ea.PointerState == PointerState.Exit)
            {
                Timer.Stop();
                Word1 += Timer.Elapsed;
                File.WriteAllText(@"*insert path here", Word1.ToString());
                Timer.Reset();
            }
        }

Каждый раз, когда в переменную или имя элемента вставляется «1», я хочу иметь его для всех 300 объектов.Это то, что я ищу:

Stopwatch Timer = new Stopwatch();
        for (int i = 0; i < 300; i++) {
            gazeButtonControl[i] = GazeInput.GetGazeElement(GazeBlock[i]);
            gazeButtonControl[i] = new GazeElement();
            GazeInput.SetGazeElement(GazeBlock[i], gazeButtonControl[i]);
            TimeSpan Word[i] = TimeSpan.Zero;
            gazeButtonControl[i].StateChanged += GazeBlockControl[i]_StateChanged;
            void GazeBlockControl[i]_StateChanged(object sender, StateChangedEventArgs ea)
            {
                if (ea.PointerState == PointerState.Enter)
                {
                    Timer.Start();

                }


                if (ea.PointerState == PointerState.Exit)
                {
                    Timer.Stop();
                    Woord[i] += Timer.Elapsed;
                    File.WriteAllText(@"*insert path here", Word[i].ToString());
                    Timer.Reset();
                }
            }
        }

Этот код не работает.Я пытался использовать списки, и это тоже не сработало.Кто-нибудь знает, как заставить это решение работать?Заранее спасибо!

Винсент

1 Ответ

0 голосов
/ 02 февраля 2019

Нельзя использовать заполнители или индексы массивов в именах переменных, методов и т. Д.

Для UWP, кажется, существует вспомогательный метод FindChildByName, который позволяет найти элемент управления по егоимя, через (TypeOfChildControl)insertParentControlHere.FindChildByName("<Name of child control>").

Я нахожу следующий код вашего недоумения:

gazeButtonControl1 = GazeInput.GetGazeElement(GazeBlock1);
gazeButtonControl1 = new GazeElement();
GazeInput.SetGazeElement(GazeBlock1, gazeButtonControl1);

По сути, сначала вы получаете gazeButtonControl1 из GazeBlock1, а затем игнорировать его, чтобы создатьновый GazeElement.Я предполагаю, что имеется в виду что-то вроде в этом примере UWP Gaze , где сначала проверяется, есть ли у элемента управления UI элемент взгляда, и если он не создан.Поэтому я думаю, что это должно быть:

gazeButtonControl1 = GazeInput.GetGazeElement(GazeBlock1);
if (gazeButtonControl1 == null)
{
  gazeButtonControl1 = new GazeElement();
  GazeInput.SetGazeElement(GazeBlock1, gazeButtonControl1);
}

Также, как я уже писал в своем первоначальном комментарии, вам, вероятно, нужен отдельный таймер для каждого элемента взгляда.

Так что в целом это должно быть примерно так(хотя и не проверено):

public class YourClass
{
  private TimeSpan[] Word = new TimeSpan[300];
  private Stopwatch[] Timer = new Stopwatch[300];
  private GazeElement[] gazeButtonControl = new GazeElement[300];

  public YourMethod(...)
  {
    for (int i = 0; i < 300; i++)
    {
      // first find gaze block where parentControl is the control containing your gaze blocks.
      var gazeBlock = (UIElement)parentControl.FindChildByName("GazeBlock" + (i + 1));

      gazeButtonControl[i] = GazeInput.GetGazeElement(gazeBlock);
      if (gazeButtonControl[i] == null)
      {
        gazeButtonControl[i] = new GazeElement();
        GazeInput.SetGazeElement(gazeBlock, gazeButtonControl[i]);
      }

      Word[i] = TimeSpan.Zero;
      Timer[i] = new Stopwatch();
      gazeButtonControl[i].StateChanged += GazeBlockControl_StateChanged;
    }
  }

  private void GazeBlockControl_StateChanged(object sender, StateChangedEventArgs ea)
  {
    // get the GazeElement for which this event was raised
    var changedControl = (GazeElement)sender;
    // find its index in your list of GazeElements.
    var i = Array.IndexOf(gazeButtonControl, changedControl); 

    if (ea.PointerState == PointerState.Enter)
    {
      Timer[i].Start();
    }

    if (ea.PointerState == PointerState.Exit)
    {
      Timer[i].Stop();
      Word[i] += Timer.Elapsed;
      File.WriteAllText(@"*insert path here", Word[i].ToString());
      Timer[i].Reset();
    }
  }
}

Обратите внимание, что я использую Array.IndexOf вместо gazeButtonControl.IndexOf, потому что я объявил gazeButtonControl в качестве массива.Если бы это был список (например, List<GazeElement> gazeButtonControl), вы бы использовали gazeButtonControl.IndexOf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...