2013-10-27 232 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;()) 

感谢大家谁在这里帮我!