即使参加晚会,我们的公司最终还是会慢慢向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>
答案 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
});
使用等待来同步你的东西...