1

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

我有几个问题希望这个社区可以帮助我... b/c 我发现即使我正在阅读世界上所有的教程,使用 WPF,有很多不同的方法来处理最基本的你以前用表格做的事情,我只需要一个 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>

4

1 回答 1

1

根据您编写的内容,代码实际上可以工作,但没有给 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 的候选者或将代码传递给您可以等待的 Task<>。这样做将使 UI 保持响应,并让您启用/禁用按钮并“实时”更新文本块。

如果 UI 线程完全耗尽,BackgroundWorker 或 Task<> 就是所谓的“黄金解决方案”。那里有无数的示例,您可以轻松地将其剪切并粘贴到您的代码中。我推荐 Task<> 方法,因为它不依赖于 WPF 命名空间。

以最简单的形式,你可以这样做......

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

并使用 await 同步你的东西...

于 2013-07-07T19:17:22.533 回答