Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 处理用户界面中对象的选择和取消选择_Silverlight_User Interface - Fatal编程技术网

Silverlight 处理用户界面中对象的选择和取消选择

Silverlight 处理用户界面中对象的选择和取消选择,silverlight,user-interface,Silverlight,User Interface,我正在编写一个小的音频应用程序(在Silverlight中,但我想这并不是真的相关),我正在努力解决一个我以前遇到过的问题,而且从未正确解决过。这次我想把它做好 在应用程序中有一个排列控件,其中包含多个曲目控件,每个曲目都可以包含AudioObject控件(这些都是自定义用户控件)。用户需要能够选择音频对象,当选择这些对象时,它们的渲染方式不同。我可以通过挂接AudioObject控件的MouseDown事件并相应地设置状态来实现这一点。到目前为止还不错,但是当选择了音频对象时,需要取消选择所有

我正在编写一个小的音频应用程序(在Silverlight中,但我想这并不是真的相关),我正在努力解决一个我以前遇到过的问题,而且从未正确解决过。这次我想把它做好

在应用程序中有一个排列控件,其中包含多个曲目控件,每个曲目都可以包含AudioObject控件(这些都是自定义用户控件)。用户需要能够选择音频对象,当选择这些对象时,它们的渲染方式不同。我可以通过挂接AudioObject控件的MouseDown事件并相应地设置状态来实现这一点。到目前为止还不错,但是当选择了音频对象时,需要取消选择所有其他音频对象(除非用户按住shift键)。但是音频对象不知道其他音频对象,因此它们无法告诉其他对象取消选择自己

现在,如果我像上次一样处理这个问题,我会在AudioObject控件的构造函数中传递一个对排列控件的引用,并给排列控件一个DeselectAll()方法或类似的方法,它会告诉所有轨迹控件取消选择其所有AudioObject控件。这感觉是错误的,如果我将此策略应用于类似的问题,恐怕很快就会导致每个对象都引用其他对象,从而造成一个紧密耦合的大混乱。这感觉就像打开了设计拙劣代码的闸门


有更好的方法来处理这个问题吗?

保持某种程度的松耦合的一种方法是通过事件实现选择通知。正如您所说,AudioObject控件可以在其构造函数中接受排列控件(或者更好的是,一个IARangement接口,这样您可以有多个实现来实现更好的解耦),而IARangement接口可以有一个RaiseItemSelected()方法,该方法反过来引发ItemSelected事件。所有AudioObject控件都知道要侦听该事件,如果它们不是要选择的对象,则会取消选择它们自己。

为什么不通过排列控件处理选择?将每个AudioObject上的mousedown事件(或者通过点击位置测试在排列级别完全处理它)连接到排列中的同一个处理程序。然后,您只需为每个AudioObject设置“选择”视觉效果,然后为发送到处理程序的对象打开它。这样做还可以让您更轻松地维护排列控件中的SelectedAudio属性或SelectionChanged事件等内容,以便使用树


编辑:我更仔细地重读了这个问题,以便更好地了解排列、轨迹和audioobject控件的情况。看到3层,我肯定会处理安排中的所有选择(除非轨道控制也必须执行与选择相关的活动)。我会处理排列控件的点击事件,当它出现时,我会对点击位置进行点击测试,并检查堆栈中是否有AudioObject。如果有的话,我只需要操作一个保存在排列级别的选择集合,以获得正确的数据(基于键修饰符或其他任何东西)。我还将在collectionchanged上为该选择集合设置一个事件处理程序,该选择集合循环通过每个曲目控件中的AudioObject,并根据它们是否包含在选择集合中来设置它们的视觉效果。这样设置之后,我还可以通过添加/删除选择集合来手动操作代码中的选择(无论出于何种原因)。

我希望避免将安排传递给音频对象,但我确实喜欢音频对象侦听ItemSelected事件的想法。至少比我想象的要好得多。如果你只是传递一个接口,那也没那么糟糕。但是在排列控制中处理这一切的另一个建议也不坏。嗯,这让我意识到用户也应该能够单击某个曲目的某个部分,从而一次选中该曲目上的所有音频对象。不过,我想你的解决方案仍然是可行的。当我想到我想要实现的其他特性时,排列控件应该处理这类事情。(当我想到它时,我只是在添加一些东西——我真的没有计划……这不是我所知道的处理项目的最佳方法。)