我正在尝试创建一个 UWP 应用程序来衡量一个人注视多个对象的时间。大约有 300 个对象,它们都需要测量时间并将其显示在文本文件中。我已经成功地为一个对象编写了这个代码,但我不知道我如何能够用多个对象来做到这一点。我看到了这篇文章如何更有效地在 C# 中创建 300 个秒表?这个问题的答案对我帮助很大,但是我的代码不能很好地实现代码。所以我喜欢创建一个对象列表的想法,然后当人注视对象 [o] 时,相应的秒表将在眼睛进入对象时启动,并在眼睛离开对象时停止。问题正如我已经提到的,该解决方案不适用于我正在使用的代码。这是我使用的仅适用于一个元素的代码。
public sealed partial class BlankPage1 : Page
{
private GazeElement gazeButtonControl;
private GazePointer gazePointer;
public BlankPage1()
{
this.InitializeComponent();
Stopwatch Timer = new Stopwatch();
gazePointer = GazeInput.GetGazePointer(null);
gazeButtonControl = GazeInput.GetGazeElement(GazeBlock);
gazeButtonControl = new GazeElement();
GazeInput.SetGazeElement(GazeBlock, gazeButtonControl);
gazeButtonControl.StateChanged += GazeButtonControl_StateChanged;
void GazeButtonControl_StateChanged(object sender, StateChangedEventArgs ea)
{
if (ea.PointerState == PointerState.Enter)
{
Timer.Start();
}
if (ea.PointerState == PointerState.Exit)
{
Timer.Stop();
CreateStatistics();
}
}
void CreateStatistics()
{
File.WriteAllText(@"C:\Users\Vincent Korpelshoek\AppData\Local\Packages\app.a264e06e2-5084-4424-80a9-bee5f5fbb6b6_8wekyb3d8bbwe\LocalState\Resultaten.txt", Timer.Elapsed.ToString(););
}
}
}
“GazeBlock”是在 XAML 文件中创建的第一个对象的名称。长话短说,我想实现这个解决方案:
static Dictionary<object, Stopwatch> stopwatchesByObject;
static void Main(string[] args)
{
List<object> objects = new List<object>();
// now you have to fill the objects list...
stopwatchesByObject = new Dictionary<object, Stopwatch>();
foreach (var o in objects)
{
stopwatchesByObject.Add(o, new Stopwatch());
}
}
// Call this method when the user starts gazing at object o
static void StartGazingAt(object o)
{
stopwatchesByObject[o].Start();
}
// Call this method when the user stops gazing at object o
static void StopGazingAt(object o)
{
stopwatchesByObject[o].Stop();
}
static void CreateStatistics()
{
StringBuilder sb = new StringBuilder();
foreach (var entry in stopwatchesByObject)
{
sb.AppendLine($"Gazed at {entry.Key.ToString()} for {entry.Value.Elapsed.TotalSeconds} seconds.");
}
File.WriteAllText("c:\\temp\\statictics.txt", sb.ToString());
}
但我不知道如何将这两个“合并”在一起,因此该解决方案不仅适用于一个对象,而且适用于大约 300 个对象。如果有人知道如何帮助我完成这项工作,谢谢!
文森特