2009-12-28 73 views
0

我正在寫一個小型音頻應用程序(在Silverlight中,但這並不是真正相關的,我想),而且我正在努力解決以前遇到的問題,正確解決。這次我想說得對。在用戶界面中處理對象的選擇和取消選擇

在應用程序中有一個Arrangement控件,它包含多個Track控件,每個Track可以包含AudioObject控件(這些都是自定義用戶控件)。用戶需要能夠選擇音頻對象,並且選擇這些對象時,它們的渲染方式會有所不同。我可以通過掛入AudioObject控件的MouseDown事件並相應地設置狀態來實現此目的。到目前爲止這樣好,但是當選擇一個音頻對象時,所有其他音頻對象都需要被取消選擇(當然,除非用戶按住shift鍵)。音頻對象雖然不知道其他音頻對象,所以他們無法告訴其他音樂對象自行取消選擇。

現在,如果我會像上次那樣處理這個問題,我會在AudioObject控件的構造函數中傳遞對Arrangement控件的引用,並給Arrangement控件一個DeselectAll()方法或類似的東西,告訴所有Track控件取消選擇所有的AudioObject控件。這種感覺是錯誤的,如果我將這一策略應用於類似的問題,我恐怕很快會結束每一個對象,引用其他每個對象,從而產生一個緊密相連的混亂。感覺就像打開設計不佳的代碼的閘門一樣。

有沒有更好的方法來處理這個問題?

回答

0

爲什麼不通過排列控制來處理選擇?將每個AudioObject上的mousedown事件連接到安排中的相同處理程序(或者只是在安排級別處理它,方法是敲擊點擊位置)。然後,您可以爲每個AudioObject設置選擇畫面,然後打開發送到處理程序的畫面。這樣做也可以讓您更容易地維護諸如SelectedAudio屬性或SelectionChanged事件之類的東西,使其不再需要排列控件以用於樹。

編輯:我更仔細地重讀這個問題,以挑選出安排vs跟蹤vs音頻對象控制更好一點。看到3層,我肯定會處理所有選擇(除非軌道控制也必須執行選擇相關的活動)。我會處理排列控件的click事件,當它出現時,我會對點擊位置進行點擊測試,並檢查AudioObject是否在堆棧中。如果有的話,我只需要操作一個保存在配置層的選擇集合來獲得正確的數據(基於鍵修改器或其他)。我還將爲collection選項設置一個事件處理程序,該處理程序循環遍歷每個軌道控件中的AudioObjects,並根據它們是否包含在選擇集合中來設置它們的視覺效果。像這樣設置,我可以通過添加/刪除選擇集合來手動操作代碼中的選擇(出於各種原因,我可能需要)。

+0

嗯,這讓我意識到用戶也應該能夠點擊軌道的某個部分,導致該軌道上的所有音頻對象被一次選中。我想這對您的解決方案來說仍然是非常可行的。而當我想到其他功能時,我想要實現它,變得越來越清晰,安排控制應該處理這些事情。 (當我想到時,我只是添加了一些東西 - 我沒有真正的計劃......並不是解決我所瞭解的項目的最佳方式。) – Dennis 2009-12-28 20:40:59

0

保持某種程度的鬆耦合的一種方法是通過事件實現選擇通知。正如你所說,AudioObject控件可以在它們的構造函數中接受一個Arrangement控件(或者更好的是,一個IArrangement接口,所以你可以有多個實現來實現稍微更好的解耦),IArrangement接口可以有一個RaiseItemSelected()方法,它在轉動引發ItemSelected事件。所有AudioObject控件都知道要監聽該事件,如果它們不是被選中的對象,則會取消選擇它們。

+0

我希望避免將安排傳遞給音頻對象,但我確實喜歡聽音樂對象監聽ItemSelected事件。比我至少想到的要好得多。 – Dennis 2009-12-28 20:40:27

+0

如果你只是傳遞一個接口,它並不是那麼糟糕。但是,在安排控制中處理這一切的其他建議也不是一件壞事。 – 2009-12-29 07:57:51