I am trying to use WPF with F #. I created a project using the F # Empty Windows App template (in fact, I created several using different settings). Then I added the FSharp.ViewModule and FsXaml.Wpf links. It works great when a project has only MainWindow.xaml and MainWindow.xaml.fs. But as soon as I added another .xaml View file and a .fs ViewModel file, I get the following error in the "namespace ViewModels" declaration at the top of the .fs files:
The type provider '...\packages\FsXaml.Wpf.2.1.0\lib\net45\FsXaml.Wpf.TypeProvider.dll' reported an error: Assembly attribute 'TypeProviderAssemblyAttribute' refers to a designer assembly 'FsXaml.Wpf.TypeProvider' which cannot be loaded or doesn't exist. Could not load file or assembly 'file:///...\packages\FsXaml.Wpf.2.1.0\lib\net45\FsXaml.Wpf.TypeProvider.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
There, a similar problem is described in the message "FsXaml loading error" (which I can not add in the comments because I do not have enough reputation). But I tried both of the answers provided there - changing the CPU and F # runtime - and no one works.
I am using Visual Studio 2015 Community Edition in a 64-bit Windows 7 SP1 virtual machine. And I tried to use the following versions of the framework and the DLL:
- NET Framework 4.5 and 4.6
- F # 3.0 and 4.0
- FSharp.ViewModule 0.9.9 and 0.9.9.3
- FsXaml.Wpf 2.0.0 and 2.1.0
EDIT 1: In response to Reid's comment below, here are my two code files that show errors. First MainWindow.xaml.fs:
namespace ViewModels open FSharp.ViewModule open FsXaml type MainView = XAML<"MainWindow.xaml", true> type MainViewModel() as self = inherit ViewModelBase() let text = self.Factory.Backing (<@ self.Text @>, "") let newCommand = self.Factory.CommandSync (fun _ -> self.Text <- "File > Open") let openCommand = self.Factory.CommandSync(fun _ -> self.Text <- "File > Open") let closeCommand = self.Factory.CommandSync(fun _ -> self.Text <- "File > Close") let exitCommand = self.Factory.CommandSync(fun _ -> self.Text <- "File > Exit") member x.Text with get() = text.Value and set value = text.Value <- value member x.NewCommand = newCommand member x.OpenCommand = openCommand member x.CloseCommand = closeCommand member x.ExitCommand = exitCommand
And here is Dialog.fs:
namespace ViewModels open FSharp.ViewModule type DialogView = XAML<"Dialog.xaml", true> type DialogVM() as self = inherit ViewModelBase() let name = self.Factory.Backing (<@ self.Name @>, "") let address = self.Factory.Backing (<@ self.Address @>, "") member x.Name with get() = name.Value and set value = name.Value <- value member x.Address with get() = address.Value and set value = address.Value <- value
In both files, I get red, squiggly lines under namespace ViewModels and under XAML . A project will be built when it only has MainWindow.xaml.fs, but not since I added Dialog.fs
EDIT 2: Here is my .fsproj file
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">x86</Platform> <ProductVersion>8.0.30703</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>b765eaca-f0ed-4898-bfea-fa19fca3788d</ProjectGuid> <OutputType>WinExe</OutputType> <RootNamespace>Test</RootNamespace> <AssemblyName>Test</AssemblyName> <targetframeworkversion>v4.5</targetframeworkversion> <TargetFSharpCoreVersion>4.3.0.0</TargetFSharpCoreVersion> <Name>Test</Name> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <Tailcalls>false</Tailcalls> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <WarningLevel>3</WarningLevel> <PlatformTarget>x86</PlatformTarget> <DocumentationFile>bin\Debug\Test.XML</DocumentationFile> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <Tailcalls>true</Tailcalls> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <WarningLevel>3</WarningLevel> <PlatformTarget>x86</PlatformTarget> <DocumentationFile>bin\Release\Test.XML</DocumentationFile> </PropertyGroup> <PropertyGroup> <MinimumVisualStudioVersion Condition="'$(MinimumVisualStudioVersion)' == ''">11</MinimumVisualStudioVersion> </PropertyGroup> <Choose> <When Condition="'$(VisualStudioVersion)' == '11.0'"> <PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')"> <FSharpTargetsPath>$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets</FSharpTargetsPath> </PropertyGroup> </When> <Otherwise> <PropertyGroup Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets')"> <FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath> </PropertyGroup> </Otherwise> </Choose> <Import Project="$(FSharpTargetsPath)" /> <ItemGroup> <None Include="Dialog.xaml" /> <Compile Include="Dialog.fs" /> <Resource Include="MainWindow.xaml" /> <Compile Include="MainWindow.xaml.fs" /> <Resource Include="App.xaml" /> <Compile Include="App.fs" /> <Content Include="App.config" /> <Content Include="packages.config" /> </ItemGroup> <ItemGroup> <Reference Include="Accessibility" /> <Reference Include="FSharp.ViewModule.Core.Wpf"> <HintPath>..\..\packages\FSharp.ViewModule.Core.0.9.9.1\lib\net45\FSharp.ViewModule.Core.Wpf.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="FsXaml.Wpf"> <HintPath>..\..\packages\FsXaml.Wpf.0.9.9\lib\net45\FsXaml.Wpf.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="FsXaml.Wpf.TypeProvider"> <HintPath>..\..\packages\FsXaml.Wpf.0.9.9\lib\net45\FsXaml.Wpf.TypeProvider.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="mscorlib" /> <Reference Include="FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <Private>True</Private> </Reference> <Reference Include="PresentationCore" /> <Reference Include="PresentationFramework" /> <Reference Include="PresentationUI" /> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="System.Data" /> <Reference Include="System.Drawing" /> <Reference Include="System.Numerics" /> <Reference Include="System.Windows.Interactivity"> <HintPath>..\..\packages\Expression.Blend.Sdk.1.0.2\lib\net45\System.Windows.Interactivity.dll</HintPath> <Private>True</Private> </Reference> <Reference Include="System.Xaml" /> <Reference Include="System.Xml" /> <Reference Include="UIAutomationProvider" /> <Reference Include="UIAutomationTypes" /> <Reference Include="WindowsBase" /> </ItemGroup> </Project>
EDIT 3: App.fs gives the error "Field, constructor or member" Root "is not defined.
module main open System open FsXaml type App = XAML<"App.xaml"> [<STAThread>] [<EntryPoint>] let main argv = App().Root.Run()
And package.config gives the warning "The element" packages "is not declared."
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Expression.Blend.Sdk" version="1.0.2" targetFramework="net45" /> <package id="FSharp.ViewModule.Core" version="0.9.9.3" targetFramework="net45" /> <package id="FsXaml.Wpf" version="2.1.0" targetFramework="net45" /> </packages>