你如何编写WPF中的throbber(“加载”或“等待”图形)?

时间:2010-11-17 19:50:49

标签: c# wpf wait

如何编写WPF中的“加载”或“等待”图形?

如果某人有一个页面需要加载大量信息,通常是在Flash网站上,你会看到某种循环旋转,这通常意味着有很多数据被加载而用户需要等待

这不仅仅是一个很好的效果。它具有现实世界的应用和重要性。如果有人打开没有此图形的表单或页面或窗口,而是看到一个应该显示信息的表单,而是看到空白字段,那么他的第一个想法可能就是没有信息可见。即使光标变为等待模式,这也可能是真的。与可能处于某种旋转状态的光标相比,广阔的空虚领域将更多地存在并压倒一个图像。

我想我可以把东西放在一起。我想我可以呈现一个旋转圆圈的gif,它在开头显示,然后在调用所有数据加载方法后隐藏。但也许有一些共享的共同图形可供免费使用,而且不知道究竟是什么叫这个东西,我不知道用什么名称或短语来搜索它。他们叫什么?

此外,也许已经有一些东西已经构建到WPF甚至MVVM中使用它。在那儿?此外,也许有人已经找到了一种方法,使整个表单或页面灰色和不活动,同时显示一个旋转的圆圈,并且已经足够友好地分享它。这是真的吗?

5 个答案:

答案 0 :(得分:3)

在我看来,你在这里问了一堆不同的问题。所以,虽然我通常不喜欢零碎的回复,但这里是:

  

但也许有某种共享   常见的图形免费使用   不知道究竟是什么   事情被称为,我不知道是什么   用于搜索的名称或短语   一。他们叫什么?

我确信您可以在网络上使用免版税图像。我可能会搜索“忙碌的光标”甚至是“沙漏”,因为直到最近,主要的操作系统才会渲染它们。

  

此外,也许已经有了一些东西   构建到WPF或WCF甚至MVVM   使用这个。有吗?

首先,我们最好明白条款:

  • MVVM没有任何“内置”它,因为它是一种编程模式,而不是框架。它有很多implementations,但我不知道是否包含特定的图形元素。可能!
  • WCF是Windows Communication Foundation,其库几乎肯定不包含任何图形元素。
  • WPF是Windows Presentation Foundation,您可以在这里找到(或定义自己的)图形元素。它确实包含progress bar,但是虽然您可以自定义任何WPF控件的外观,但它实际上是为了显示从起点到终点的进度。那可能不是你想要的。不过,WPF当然可以显示动画图像。这是an example from SO for displaying animated GIFs
  

另外,也许有人找到了   制作整个表格或页面的方法   显示时显示灰色且不活动   旋转的圆圈,一直很亲切   足以分享它。这是真的吗?

几乎可以肯定。同样,您可以采取多种方法。例如,this question中提到了其中一些。搜索“叠加”或“闪屏”可能会指向正确的方向。简而言之(在WPF中):

  • 通过设置控件的“Inactive属性和/或捕获Preview(Key|Mouse)Down个事件
  • ,使页面处于”无效状态“
  • 通过在其顶部显示半透明元素(例如GridRectangle来“灰显”该页面。根据你这样做的方式,它可能会处理使底层控件“处于非活动状态”(不要引用我这个,但我相信像Rectangle这样的元素会截取鼠标点击,所以用户无法点击在它下面控制......)

答案 1 :(得分:1)

使用后台工作程序,对于wpf中的循环进度条,请参阅http://www.codeproject.com/Articles/49853/Better-WPF-Circular-Progress-Bar.aspx以获取非常好的内容。

答案 2 :(得分:0)

答案 3 :(得分:0)

我不确定,只是一个想法。显示一个透明的模态窗口,其中包含旋转圆,直到后台线程加载数据。加载数据时。关闭模态窗口。

答案 4 :(得分:0)

您可以简单地使用附加属性

这是一篇包含完整示例代码的帖子(只是几个类) http://www.deanchalk.me.uk/post/WPF-e28093-Loading-Spinner-Via-MVVM-and-Attached-Properties.aspx

您的主要WPF Windows看起来像这样:

    <Window.Resources>
    <CollectionViewSource x:Key="DataList" Source="{Binding TestData}"  />
</Window.Resources>
<Grid Background="AliceBlue" app:AsyncNotifier.Trigger="{Binding IsDataLoading}" 
      app:AsyncNotifier.SpinnerText="Loading...">
    <TabControl Grid.RowSpan="2">
        <TabItem Header="TabItem">
            <Grid Background="#FFE5E5E5">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <ListBox ItemsSource="{Binding 
                    Source={StaticResource DataList}}" />
                <Button Content="Do Update" HorizontalAlignment="Left" Command="{Binding LoadData}"
                        VerticalAlignment="Top" Width="75" Grid.Row="1" Margin="0,5" />
            </Grid>
        </TabItem>
        <TabItem Header="TabItem">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
    </TabControl>
</Grid>