1

UI コンポーネントの Visibility が ViewModel プロパティにバインドされ、そのプロパティの PropertyChanged が実装されているにもかかわらず、UI がそれ自体の更新をスキップする可能性はありますか?

ビュー/XAML:

 <Border Visibility="{Binding ShowLoadingPanel, Converter={StaticResource BoolToHiddenConverter}}">
      <TextBlock Text="LOADING..." />
 </Border>

ビューモデル:

Public Property ShowLoadingPanel As Boolean
    Get
        Return _showLoadingPanel
    End Get
    Set(value As Boolean)
        _showLoadingPanel = value
        OnPropertyChanged("ShowLoadingPanel")
    End Set
End Property

ViewModel から以下を実行する場合:

 ShowLoadingPanel = True
 RunBigTask()  'runs a task that takes a long time
 ShowLoadingPanel = False

...XAML で定義された Border が表示されません。

ただし、ユーザーの操作が必要なものを追加すると、たとえば次のようになります。

 ShowLoadingPanel = True
 MsgBox("Click to continue")
 RunBigTask()  'runs a task that takes a long time
 ShowLoadingPanel = False

...その後、必要に応じて境界線が表示されます。

そんなことがあるものか?

4

3 に答える 3

4

UIスレッドの更新をブロックしているため、実際にはバックグラウンドスレッドで長時間実行タスクを実行する必要がありますVisibility...そのままでは、長時間実行タスクが完了すると更新されますVisibility

BackgroundWorkerユーザーがこれを行うためにオブジェクトを使用することは非常に一般的です。BackgroundWorkerMSDN のクラスページで、完全な動作例を見つけることができます。

に代わる一般的な方法はBackgroundWorker、オブジェクトを使用して、Task実行時間の長いプロセスを非同期で実行することです。TaskMSDNのTaskクラスページで、a を使用した完全な動作例を見つけることができます。

于 2013-10-30T13:27:19.410 に答える
2

Dispatcher をブロックしているため、レイアウトが更新されません。メッセージ ボックスを開くと、入れ子になったメッセージ ループがプッシュされます。これにより、メッセージ ボックスが閉じられるまで Dispatcher はそのキューの処理を続行できます。その間にレイアウトの更新が行われます。

通常の Windowを呼び出した場合も同じことが起こりShowDialog()ます。コードはブロックされますが、Dispatcher は引き続き実行されるため、UI は期待どおりに更新されます。コードは、ネストされたメッセージ ループがポップされるまで再開されません。これは、モーダル ダイアログ (メッセージ ボックスなど) を閉じると自動的に発生します。

于 2013-10-30T15:33:41.470 に答える
0

私は C# を使用しています。私たちの場合、Visiblity はブール値ではなく、列挙型です: Hidden / Visible/Collapsed の値を持つ System.Windows.Visibility です。

同じことがVBにも当てはまるようです:Public Property Visibility As Visibility

于 2018-05-14T07:53:35.463 に答える