尽管聚会迟到了,但我们公司最终还是缓慢但肯定地转向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>
根据您所写的内容,代码实际上是有效的,但没有给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
});
并使用等待同步你的东西。。。