来自Forms的WPF新手:基本事件理解

时间:2013-07-07 16:45:56

标签: c# .net wpf data-binding event-handling

即使参加晚会,我们的公司最终还是会慢慢向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

         }

当我尝试禁用按钮并更新文本框以及提到的那些例程时...例程运行JUST FINE ..但是按钮从未被禁用,文本框是否也得到更新?

我有一种感觉我仍然不明白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>

1 个答案:

答案 0 :(得分: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的候选者或将代码传递给任务&lt;&gt;你可以等待。这样做可以保持UI响应,让您启用/禁用按钮并“实时”更新文本块。

BackgroundWorker或任务&lt;&gt;如果UI线程完全被淘汰,那就是所谓的“黄金解决方案”。有很多样本可以轻松剪切并粘贴到您的代码中。我推荐任务&lt;&gt;方法,因为它不依赖于WPF名称空间。

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

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

使用等待来同步你的东西...