5

それで、RSS フィードのタイトルを取得して ListBox に入れる小さな WPF XAML があります。

ただし、ロードには約2秒かかります。

データがそこにあるまで、ある種のAJAXy回転グラフィックをListBoxに配置するにはどうすればよいですか?

コードは次のとおりです。

<Window x:Class="WpfApplication5.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <StackPanel.Resources>
            <XmlDataProvider x:Key="ExternalColors" Source="http://www.tanguay.info/web/rss" XPath="/"/>
        </StackPanel.Resources>
        <TextBlock Text="RSS Feeds:"/>
        <ListBox Name="lbColor" Height="200" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource ExternalColors}, XPath=//item/title}"/>

        <TextBlock Text="You selected this feed:"/>
        <TextBox
            Text="{Binding ElementName=lbColor, Path=SelectedValue}"
            Background="{Binding ElementName=lbColor, Path=SelectedValue}">
        </TextBox>
    </StackPanel>
</Window>
4

4 に答える 4

6

これに対する私の解決策は、データと WPF の間に非同期レイヤーを実装することです。これにより、データ側の遅延から WPF が完全に分離され、トリガーしてバインドするための優れたイベントとプロパティが得られます。

これをView Model または Presenter Model アーキテクチャの上に構築しました。基本についてのブログ投稿と、非同期ビュー モデルへのアプローチについての長い記事を書きました。

スピナーの XAML は次のとおりです。にDataContextは、読み込みを行うビュー モデルが必要です。に応じてStateLoadingIndicatorが表示され、再び折りたたまれます。

<UserControl x:Class="App.WPF.CustomControls.LoadingIndicator"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Height="20"
             Width="20">
    <UserControl.Style>
        <Style TargetType="{x:Type UserControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding State}"
                             Value="Active">
                    <Setter Property="Visibility"
                            Value="Collapsed" />
                </DataTrigger>
                <DataTrigger Binding="{Binding State}"
                             Value="Loading">
                    <Setter Property="Visibility"
                            Value="Visible" />
                </DataTrigger>
                <DataTrigger Binding="{Binding State}"
                             Value="Invalid">
                    <Setter Property="Background"
                            Value="Red" />
                    <Setter Property="Visibility"
                            Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>
    <UserControl.Triggers>
        <EventTrigger RoutedEvent="UserControl.Loaded">
            <BeginStoryboard>
                <Storyboard TargetName="Rotator"
                            TargetProperty="Angle">
                    <DoubleAnimation By="360"
                                     Duration="0:0:2"
                                     RepeatBehavior="Forever" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </UserControl.Triggers>
    <Rectangle Stroke="Aqua"
               StrokeThickness="2"
               Width="10"
               Height="10">
        <Rectangle.RenderTransform>
            <RotateTransform x:Name="Rotator"
                             Angle="0"
                             CenterX="5"
                             CenterY="5" />
        </Rectangle.RenderTransform>
    </Rectangle>
</UserControl>

[出典著作権 © 2009 dasz.at OG ; この作品はMITライセンスの下でライセンスされています。]

于 2009-02-13T12:58:37.383 に答える
1

次のビデオは mix08 からのもので、やりたいことを正確に実行する手順を説明しています。

パート1

パート2

(可能であれば連続して見てください。シルバーライトですが、正しい方向に向けます。)

楽しんで。

于 2009-01-23T16:42:26.567 に答える
1

spinny-loady-thingy を作成して、ListBox の AdornerLayer に追加できます。

于 2009-01-23T16:38:16.577 に答える
0

イベントと一緒にのIsAsynchronousプロパティを利用できます(私は試していません): ドキュメントをご覧ください。;-)XmlDataProviderDataChanged

于 2009-01-23T17:47:39.320 に答える