WPF表单新手:基本事件理解

本文关键字:事件 表单 新手 WPF | 更新日期: 2023-09-27 18:21:28

尽管聚会迟到了,但我们公司最终还是缓慢但肯定地转向WPF来满足我们的桌面编程需求。

我有几个问题,我希望这个社区能帮助我。。。b/c我发现,尽管我正在阅读世界上所有的教程,但有了WPF,有很多不同的方法来处理你过去用Forms做的最基本的事情,我只需要一个101。。。例如。。。

有人能告诉一个沮丧的WPF新手为什么这个BASIC代码不起作用吗?

        private void BtnImport_Click(object sender, RoutedEventArgs e)
         {
             //Button disabled on it's own without below routines
             BtnImport.IsEnabled = false;   
             // So does textbox which updates on it's own without below routines
             TxtTest.Text = "Started at : " + DateTime.Now.ToString() + "'n";
             //Bunch of routines that each run in their own loops
         }

当我尝试禁用按钮并更新文本框以及提到的例程时。。例程运行得很好。但按钮从未被禁用,文本框也没有更新?

我有一种感觉,我仍然不理解WPF是如何在Bindings中做事的,但我希望从这里开始有一个灯泡时刻,告诉我为什么基本的东西在这里不起作用?谢谢~

非常感谢。这是XAML@Joe我完全明白我没有使用绑定,我认为这是我困惑的核心,如果我直接设置它,为什么在我直接设置属性后其他例程正在运行时它不起作用?(我的新手认为这是绑定)。在任何情况下,这里请求的都是XAML代码。

         <Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Background="#FF8FB1B1" Name="AnalyticsWindow"                Loaded="AnalyticsWindow_Loaded">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="74*" />
        <ColumnDefinition Width="429*" />
    </Grid.ColumnDefinitions>
    <TextBox Height="23"   Margin="66,62,187,0" Name="TxtTime" VerticalAlignment="Top" Grid.ColumnSpan="2"/>

    <Button  Content="Import" Height="23"  HorizontalAlignment="Left" Margin="141,179,0,0" Name="BtnImport" VerticalAlignment="Top" Width="75" Click="BtnImport_Click" Grid.Column="1" />
    <DatePicker Height="25" HorizontalAlignment="Left" Margin="64,108,0,0" Name="ObjDateFrom"  VerticalAlignment="Top" Width="115" Grid.Column="1" />
    <DatePicker Height="25" HorizontalAlignment="Left" Margin="218,108,0,0" Name="ObjDateTo" VerticalAlignment="Top" Width="115" Grid.Column="1" />
    <Label Content="Log" Height="28" HorizontalAlignment="Center" HorizontalContentAlignment="Center" Margin="234,28,39,0" Name="label2" VerticalAlignment="Top" Width="156" Grid.Column="1" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="218,62,0,0" Name="TxtTest" VerticalAlignment="Top" Width="182" Grid.Column="1" />
</Grid>

WPF表单新手:基本事件理解

根据您所写的内容,代码实际上是有效的,但没有给UI"足够的时间呼吸",这样您的更改就可以在用户界面上呈现。考虑更改为。。。

        Dispatcher.BeginInvoke((Action) (() => { 
            BtnImport.IsEnabled = false;
            TxtTest.Text = "Started at : " + DateTime.Now.ToString() + "'n";
        }));

在密集处理结束时使用对称的BeginInvoke,以便再次启用该按钮。这将减轻你的问题,并帮助你得到你想要的行为。

我还建议,部分声明为…

//Bunch of routines that each run in their own loops

是WPF BackgroundWorker的候选者,或者将代码传递给任务<>你可以等待。这样做将使UI保持响应,并允许您"实时"启用/禁用按钮和更新文本块。

BackgroundWorker或Task<>是所谓的"黄金解决方案",如果用户界面线程完全耗尽。有无数的样本,你可以很容易地剪切并粘贴到你的代码中。我推荐任务<>方法,因为它不依赖于WPF名称空间。

在最简单的形式中,你可以这样做。。。

        Task.Run(() =>
            {
                // lots of business processing code here
            });

并使用等待同步你的东西。。。