2013-10-27 234 views
2

我有這個非常簡單的程序,可以從網站獲取RSS提要,並用項目填充列表框。每當用戶選擇一個項目並按下回車鍵,它就會進入一個網頁。這是KeyUp事件處理程序!F#事件正在多次觸發。 。 。?

rssList.KeyUp 
|> Event.filter (fun e -> rssList.SelectedItems.Count > 0) 
|> Event.filter (fun (args:Input.KeyEventArgs) -> args.Key = Key.Enter) 
|> Event.add -> let feed = unbox<RSSFeed> rssList.SelectItem) 
              Process.Start(feed.Link) |> ignore) 

什麼我得到如下:

  • 第一次事件觸發,它工作正常,在瀏覽器中打開和頁面加載
  • 它會觸發兩次,第二次次,所以現在我得到兩個瀏覽器窗口打開和頁面加載在他們兩個。
  • 我第三次得到三個瀏覽器。 。 。你明白了!

任何人都知道爲什麼會發生這種情況?我的目標是(你猜對了)只是打開1個瀏覽器窗口和1頁PER觸發器

+1

看起來像Event.add缺少一些代碼(有趣的參數 - >)。你能解決它嗎? –

+0

上面的代碼運行完全正常,我沒有得到關於任何'缺少'代碼的錯誤。它和預期的一樣。但在這裏有多個執行,我不知道爲什麼會發生這種情況 –

+2

@ZaidAjaj爲了診斷起見,請嘗試一下Eugene建議 - 將Event.add - > ...改爲Event.add(有趣的參數 - > ...)'然後再次運行代碼。總是有可能在編譯器中存在一個錯誤,所以當你應該時你沒有得到解析器或輸入錯誤。 –

回答

1

您的示例中有幾個編譯錯誤,包括格式錯誤的lambda表達式,不匹配的括號,不正確的標識符(SelectItem不是屬性,I假設你的意思是SelectedItem而不是SelectedItems)以及let feed綁定之後的錯誤縮進。

下面是一個簡單的例子,它可以按照你的意圖工作。當用戶點擊Enter時,頂部列表框中的選定項目被放入底部列表框。

open System 
open System.Windows 
open System.Windows.Controls 
open System.Windows.Input 

[<EntryPoint>] 
[<STAThread>] 
let main argv = 
    let panel = new DockPanel() 
    let listBox = new ListBox() 
    for i in [| 1 .. 10 |] do 
     listBox.Items.Add i |> ignore 
    DockPanel.SetDock(listBox, Dock.Top) 
    let listBox2 = new ListBox(Height = Double.NaN) 
    panel.Children.Add listBox |> ignore 
    panel.Children.Add listBox2 |> ignore 
    listBox.KeyUp 
     |> Event.filter (fun e -> listBox.SelectedItems.Count > 0) 
     |> Event.filter (fun e -> e.Key = Key.Enter) 
     |> Event.add (fun e -> let i = unbox<int> listBox.SelectedItem 
           listBox2.Items.Add(i) |> ignore) 
    let win = new Window(Content = panel) 
    let application = new Application() 
    application.Run(win) |> ignore 
    0 
+0

我複製粘貼該代碼,我在帖子頁面上玩它,但是,問題不是填充listBox,我已經管理好了,但問題是事件觸發它自我一次又一次 –

+0

我是嘗試了幾件事情,我意識到我可以實現MouseButtonEventArgs.Handled屬性來防止事件重新觸發自己 –

+1

@ZaidAjaj聽起來好像發生了什麼,你正在獲得多個處理程序附加到'KeyUp'事件。 (也許你是在經常發射的另一個事件處理程序中添加處理程序?)註冊一次'KeyUp'事件。 –

-1

我得到了它與下面的執行事件參數的Handled屬性正常工作:

let doubleClick = new MouseButtonEventHandler(fun sender (args:MouseButtonEventArgs) -> 
    let listBox = unbox<ListBox> sender 
    match listBox.SelectedItems.Count > 0 with 
    | true -> 
     let listBox = unbox<ListBox> sender 
     let feed = unbox<RSSFeed> listBox.SelectedItem 
     Process.Start(feed.Link) |> ignore 
     args.Handled <- true;() 
    | false -> 
     args.Handled <- true;()) 

感謝大家誰在這裏幫我!