将显示 Xaml 窗口,但不接受用户交互



我想尝试将我的C#应用程序移植到F#,以便更充分地利用类型提供程序。我将隐藏的代码编写为 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

关于可能出现什么问题的任何想法?

我认为@JohnPalmer评论是正确的。我不完全确定该属性在您的代码中的位置(我没有检查过),但我很确定编译器不会自动将其提升到 main 函数(我很惊讶这段代码甚至可以编译。

您需要将代码放入函数中,并向该函数添加STAThread注释。

[<EntryPoint; STAThread>]
let main args =
    (new Application()).Run(loadWindow()) |> ignore
    // Return 0. This indicates success.
    0

另请参阅 MSDN 上的入口点 (F#)。

问题既愚蠢又简单 - 在导入窗口的某个时候,此标志在MainWindow对象上激活 - IsHitTestVisible="False"。这关闭了与表单交互的功能。

谢谢大家在这个问题上的帮助。

最新更新