2

我有这个非常简单的程序来从网站获取 RSS 提要并用项目填充列表框。每当用户选择一个项目并按 Enter 键时,它应该转到一个网页。这是 KeyUp 事件处理程序!

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 触发器

4

2 回答 2

1

您的示例中有几个编译错误,包括格式错误的 lambda 表达式、不匹配的括号、不正确的标识符(SelectItem不是属性,我假设您的意思SelectedItem不是SelectedItems)以及let feed绑定后的不正确缩进。

下面是一个简化的示例,可以按您的预期工作。当用户按 Enter 键时,顶部 ListBox 中的选定项目将放入底部 ListBox。

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
于 2013-10-27T22:32:33.830 回答
-1

我通过使用以下内容实现事件 args 的 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; ())

感谢所有在这里帮助我的人!

于 2013-10-27T22:45:10.780 回答