Вызов функции F # с помощью кнопки из WPF (подход FsXaml) - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать приложение Button Hello World с F #, WPF и FsXaml. Я начал следовать этому руководству:

https://www.c -sharpcorner.com / статьи / создания-МОФ-приложение-с-фа-диез-и-fsxaml /

Все работает нормально, когда я просто загружаю вещи в xaml и компилирую, но мне не удалось вызвать функцию нажатием кнопки, и руководство заканчивается, прежде чем он объясняет, как вызывать функции.

Я видел много разных подходов, но у меня пока ничего не получалось (и многим из них уже несколько лет, поэтому с тех пор многое произошло внутри фреймворков). Было бы здорово иметь работающую (и простую) отправную точку, которую я мог бы начать строить, как только я пойму логику между x.xaml и x.xaml.fs при использовании FsXaml.

Моя кнопка на MainWindow.xaml:

<Button x:Name="submitButton" Content="Send" Click="submitButton_Click"/>

Также у меня есть это в разделе окна MainWindow.xaml:

xmlns:local="clr-namespace:Views;assembly=GUItemplate"

My MainWindow.xaml.fs:

namespace GUItemplate

open FsXaml  
open System.Windows

type MainWindowBase = XAML<"MainWindow.xaml">

type MainWindow() =
    inherit MainWindowBase()

    override this.submitButton_Click (sender: obj, e: RoutedEventArgs) = 
        MessageBox.Show("Hello world!")
        |> ignore

Ошибка, которую я получаю в настоящее время:

System.Windows.Markup.XamlParseException
HResult=0x80131501
Message='Failed to create a 'Click' from the text 'submitButton_Click'.' Line number '29' and line position '101'.
Source=PresentationFramework

Inner Exception 1:
ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.

1 Ответ

0 голосов
/ 10 января 2019

Так я поступаю в VS 2017, и у меня это работает. Я добавляю ссылку UIAutomationTypes и устанавливаю NuGet FsXaml.Wpf.

open System
open System.Windows
open FsXaml

type MainWindowBase = XAML<"MainWindow.xaml">

type MainWindow() =
    inherit MainWindowBase()

    override this.submitButton_Click (sender: obj, e: RoutedEventArgs) = 
        MessageBox.Show("Hello world!")
        |> ignore

[<EntryPoint;STAThread>]  
let application = new Application() in
    let mainWindow = new MainWindow() in
        application.Run(mainWindow) |> ignore    
...