1

パーティーには遅れましたが、私たちの会社はデスクトップ プログラミングのニーズのために、ゆっくりではありますが確実に WPF に移行しています。

このコミュニティが私を助けてくれることを望んでいたいくつかの質問があります... b/c 世界中のすべてのチュートリアルを読んでいますが、WPF を使用すると、最も基本的なものにアプローチする方法が非常に多くあることがわかります。 Forms で行っていたことを、101 が必要なだけです...たとえば...

このBASICコードが機能しない理由を、欲求不満のWPF初心者に教えてもらえますか?

        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<>はいわゆる「ゴールデンソリューション」です。コードに簡単にカット アンド ペーストできる無数のサンプルがあります。WPF 名前空間に依存しないため、Task<> アプローチをお勧めします。

最も単純な形式では、これを行うことができます...

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

そして、await を使用してデータを同期します...

于 2013-07-07T19:17:22.533 に答える