我想尝试将我的C#应用程序移植到F#,以便更充分地利用Type Providers。我将代码作为F#文件编写,并使用fsharpx中的XAML类型提供程序引用XAML窗口。当我运行应用程序时,窗口显示,但不接受任何输入。我甚至无法在输入框中获得闪烁的光标或者让按钮显示他们的点击动画,所以它肯定比简单的无线事件处理程序更深:
XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" SizeToContent="WidthAndHeight" MinHeight="300" MinWidth="500" IsHitTestVisible="False" Icon="{DynamicResource Icon}">
<Window.Resources>
<BitmapImage x:Key="Icon" CreateOptions="IgnoreImageCache" CacheOption="OnLoad" UriSource="../W.ico"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="325*" />
</Grid.ColumnDefinitions>
<GroupBox HorizontalAlignment="Left" Margin="12,15,0,45" Name="groupBox1" Width="144">
<Grid>
<TextBox HorizontalAlignment="Left" Margin="6,6,0,0" Name="txtSerial" Width="120" Grid.ColumnSpan="2" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" Grid.RowSpan="2" VerticalContentAlignment="Stretch" />
</Grid>
</GroupBox>
<DataGrid Name="dgResults" AutoGenerateColumns="True" Margin="5,76,5,45" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Column="1" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}">
</DataGrid>
<Button Grid.Column ="1" Content="Do Stuff" Height="23" HorizontalAlignment="Left" Margin="5,12,0,0" Name="btnQuery" VerticalAlignment="Top" Width="75"/>
<Button Grid.Column ="1" Content="Find Stuff" Height="23" Width="75" Margin="5,38,230.4,0" Name="btnScout" VerticalAlignment="Top" />
<TextBox Grid.Column ="1" Height="23" Margin="5,38,5,0" Name="txtTarget" VerticalAlignment="Top" Width="100" />
</Grid>
</Window>
F#
let Fetch(e: RoutedEventArgs) =
dataTable.Rows.Clear()
...
let loadWindow() =
let window = MainWindow()
window.btnQuery.Click.Add(Fetch)
window.Root
[<EntryPoint; STAThread>]
let main args =
(new Application()).Run(loadWindow()) |> ignore
0
关于可能出现什么问题的任何想法?
答案 0 :(得分:2)
我认为@JohnPalmer在评论中是正确的。我不完全确定属性在你的代码中的最终位置(我没有检查过),但我很确定编译器不会自动将其提升到main函数(我很惊讶这段代码甚至编译。)
您需要将代码放入函数中并向该函数添加STAThread
注释。
[<EntryPoint; STAThread>]
let main args =
(new Application()).Run(loadWindow()) |> ignore
// Return 0. This indicates success.
0
答案 1 :(得分:0)
问题很简单 - 在导入窗口的某个时刻,在MainWindow对象上激活了这个标志 - IsHitTestVisible="False"。这关闭了与表单交互的能力。
谢谢大家对此问题的帮助。