gpt4 book ai didi

wpf - F# 异步显示 WPF 窗口

转载 作者:行者123 更新时间:2023-12-04 11:58:48 26 4
gpt4 key购买 nike

这个问题一直让我发疯。这是一般要点:

我在解决方案中有两个项目:第一个是 F# 控制台应用程序,第二个是 C# 库,其中包含一个名为 DisplayWindow 的 C#+XAML 类。从 WPF 窗口继承。 DisplayWindow有一个方法 public void SetMessage(string s) {...}这使得窗口以 Shiny 的大字母显示传递给它的文本,这些字母可能还会闪烁和旋转,并执行 WPF 擅长的其他所有操作。

问题是:从我的 F# 程序中,我需要创建一个函数 let openAWindow text = ???以便它会打开一个新的DisplayWindow每次用文本调用时异步。做这个的最好方式是什么?使用 async {}System.Threading.Thread ?谢谢您的帮助 :)

编辑:我找到了这篇博文 http://deanchalk.com/2010/10/08/f-interacting-with-wpf-dispatcher-via-f-interactive-window/这有效,但有时会 (?) 导致 ArgumentException 和错误文本“具有相同键的条目已经存在”。所以我不知道那里发生了什么:(

最佳答案

我为我们的 F# for Visualization 做了这个然后描述了我在书中使用的技术 Visual F# 2010 for Technical Computing .

首先,我写了一个惰性 thunk,它在强制求值时初始化 WPF(包括一个 STA UI 线程和 Application):

> let ui =
let mk() =
let wh = new ManualResetEvent(false)
let application = ref null
let start() =
let app = Application()
application := app
ignore(wh.Set())
app.Run() |> ignore
let thread = Thread start
thread.IsBackground <- true
thread.SetApartmentState ApartmentState.STA
thread.Start()
ignore(wh.WaitOne())
!application, thread
lazy(mk());;
val ui : Lazy<Application * Thread> = <unevaluated>

然后我写了一个 spawn调度函数应用程序的函数 f争论 x这样它就可以在 UI 线程上运行:
> let spawn : ('a -> 'b) -> 'a -> 'b =
fun f x ->
let app, thread = ui.Force()
let f _ =
try
let f_x = f x
fun () -> f_x
with e ->
fun () -> raise e
let t = app.Dispatcher.Invoke(DispatcherPriority.Send, System.Func<_, _>(f), null)
(t :?> unit -> 'b)();;
val spawn : ('a -> 'b) -> 'a -> 'b

现在只是调用您的 openAWindow 的一个案例UI线程上的函数:
let openAWindow text =
DisplayWindow().SetMessage text

spawn openAWindow text

关于wpf - F# 异步显示 WPF 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8864563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com