1

WPFアプリケーションがあります。自動非表示ペインを使用して、非常に複雑なユーザーコントロールをホストしています。ユーザーがペインをクリックすると、約10秒かかります。コントロールをロードするために、「ロード中...」ウィンドウを作成して、アプリが機能していることをユーザーに通知しようとしています。この待機ウィンドウには、画像を回転させるアニメーションがあります。私の問題は、ユーザーコントロールのロードと同じスレッドを使用しているため、2日経ってもホイールを回転させることができないことです。ペインを更新せずに実行すると、「読み込み中」ウィンドウは正常に機能します。私はいくつかのことを試しました-BackgroundWorker、Dispatcher.Invoke。ネットで見つけたすべての例は、UIをアクティブにしたままバックグラウンドタスクを実行することに関するものです。

リードはありますか?

4

1 に答える 1

1

私はこの質問を明確に得ていませんが、質問を得ることができる限りこの答えを出そうとしました.:-)

私のシナリオでは、ボタンのクリックで時間のかかるコントロールをロードする 1 つのメイン ウィンドウを作成しました。時間のかかるコントロールをロードしている間、10 秒間スリープ状態を維持しました。

メイン ウィンドウ コード:

Xaml -

<Window x:Class="Wpf.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Wpf"
    Title="MainWindow" Height="350" Width="525"
    x:Name="root">
<Window.Resources>
    <DataTemplate x:Key="loadingTemplate" DataType="ContentControl">
        <StackPanel>
            <TextBlock Text="Loading..." Margin="5"/>
        </StackPanel>
    </DataTemplate>

</Window.Resources>

<StackPanel x:Name="stpRootLayout">
    <Button Content="Click to load pane" Click="Button_Click"/>
    <Border BorderThickness="5" BorderBrush="Black"  Height="100">
    <ContentControl x:Name="cctPlaceHolder">

    </ContentControl>
    </Border>
</StackPanel>

Xaml.cs -

public delegate void LoadTimeConsumingControlDelegate();

public void LoadTimeConsumingControl()
    {
        //set our progress dialog text and value
        cctPlaceHolder.Content = new TimeConsumingControl();
    }

private void Button_Click(object sender, RoutedEventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        cctPlaceHolder.ContentTemplate = this.TryFindResource("loadingTemplate") as DataTemplate;
        System.Windows.Threading.Dispatcher cctDispatcher = cctPlaceHolder.Dispatcher;
        worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {
            LoadTimeConsumingControlDelegate update = new LoadTimeConsumingControlDelegate(LoadTimeConsumingControl);
            cctDispatcher.BeginInvoke(update);
        };

        worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
        {
            cctPlaceHolder.ContentTemplate = null;
        };

        worker.RunWorkerAsync();
    }

時間のかかるコントロール:

Xaml -

<UserControl x:Class="Wpf.TimeConsumingControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBlock Text="some text..................................................................................................."/>
</Grid>

Xaml.cs

public TimeConsumingControl()
    {
        InitializeComponent();
        Thread.Sleep(10000);
    }

データ テンプレートを読み込み中のテーマに置き換えます。

これがあなたが探していたものであることを願っています。そうでない場合は、私に連絡してください。

于 2013-02-18T13:57:10.533 に答える