2

私は、Web サイトから RSS フィードを取得し、リストボックスに項目を入力するためのこの非常に単純なプログラムを持っています。ユーザーが項目を選択して Enter キーを押すたびに、Web ページに移動する必要があります。これは 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)

私が得ているのは次のとおりです。

  • イベントが初めてトリガーされたとき、正常に動作し、ブラウザーが開き、ページが読み込まれます
  • 2回目は2回トリガーされるため、2つのブラウザーウィンドウが開かれ、ページが両方に読み込まれます。
  • 3 回目に Three browser を取得します。. . あなたはアイデアを得る!

なぜこれが起こっているのか誰にも分かりますか?私の目標は (ご想像のとおり) 1 つのブラウザー ウィンドウと 1 つのページ PER トリガーを開くことです。

4

2 に答える 2

1

あなたの例には、不正なラムダ式、かっこの不一致、誤った識別子 (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

イベント引数の 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 に答える