所以我有一个小的WPF XAML获取我的RSS提要的标题并将它们放在ListBox中。
但是,加载大约需要2秒钟。
如果数据存在,我如何在ListBox中放置某种AJAXy旋转图形?
以下是代码:
<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>
答案 0 :(得分:6)
我的解决方案是在我的数据和WPF之间实现异步层。这完全解除了WPF与数据端的任何延迟,并为我提供了很好的事件和属性来触发和绑定。
我在View Model or Presenter Model architecture之上构建了这个。我写过a blog post about the basics和更长篇文章my approach to asynchronous View Models。
这是微调器的XAML。在DataContext
中,它需要执行加载的视图模型。 State
取决于其LoadingIndicator
,会使其自身可见并再次崩溃。
<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 License许可的。]
答案 1 :(得分:1)
您可以创建spinny-loady-thingy并将其添加到ListBox的AdornerLayer。
答案 2 :(得分:1)
答案 3 :(得分:0)
您可以利用IsAsynchronous
的{{1}}属性以及XmlDataProvider
事件(我没有尝试过):查看文档。 ; - )