如何在窗口打开时显示Isbusy指示

时间:2013-11-12 21:54:19

标签: wpf telerik wpf-controls wpfdatagrid

我正在尝试显示视觉指示“isbusy”,而当窗口打开时网格1-3正在加载。我已经能够在使用“telerik:RadToggleButton isbusy”加载网格后显示加载指示,但我想在窗口打开时和加载网格之前显示它。有人可以提前向我指出正确的方向。     

 <Window.Resources/>

<UserControl Name="tbMain" HorizontalAlignment="Left">        
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="25"></RowDefinition>
        </Grid.RowDefinitions>
        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
            <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
                <telerik:RadGridView (1)/>
                <telerik:RadGridView (2)/>
                <telerik:RadGridView (3)/>
            </StackPanel>
        </ScrollViewer

        <DockPanel Grid.Row="1" Background="SkyBlue">
            <Button x:Name="btnAcceptMerge" Content="Accept Merge" DockPanel.Dock="Left"/>
            <Button x:Name="btnCancel"  Content="Cancel Merge" Click="btnCancel_Click" DockPanel.Dock="Right"/>
            <TextBlock Text=""/>
        </DockPanel>
    </Grid>
 </UserControl>
 </Window>

2 个答案:

答案 0 :(得分:2)

您可以使用Xceed工具包的繁忙控制。使用它你必须使用backgroundworker。

下面是完整的解决方案。

XAML:

首先,您必须添加Xceed工具包的命名空间引用。

xmlns:xctk="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"

之后你必须使用BusyIndi​​cator环绕你的网格,你也可以实现进步。

    <xctk:BusyIndicator.BusyContentTemplate>
        <DataTemplate>
            <StackPanel Margin="0" Background="#FFD1DEF0" >

                <TextBlock  Text="Generating......" />

                <StackPanel Margin="4">
                     <ProgressBar Value="{Binding Path=DataContext.ProgressValue, RelativeSource={RelativeSource Mode=FindAncestor, 
        AncestorType=Window}}" Height="15"/>
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </xctk:BusyIndicator.BusyContentTemplate>
    <xctk:BusyIndicator.OverlayStyle>
        <Style TargetType="Rectangle">
            <Setter Property="Fill" Value="Transparent" />

        </Style>
    </xctk:BusyIndicator.OverlayStyle>
    <xctk:BusyIndicator.ProgressBarStyle>
        <Style TargetType="ProgressBar">
            <Setter Property="IsIndeterminate" Value="False"/>
            <Setter Property="Visibility" Value="Collapsed"/>
            <Setter Property="Maximum" Value="100"/>
        </Style>
    </xctk:BusyIndicator.ProgressBarStyle>

         <telerik:RadGridView (1)/>
            <telerik:RadGridView (2)/>
            <telerik:RadGridView (3)/>
 </xctk:BusyIndicator>
ViewModel中的

在VM构造函数中

,您应该将IsVMBusy属性设置为true。

        var worker = new BackgroundWorker();
        worker.DoWork += (o, ea) =>
          {
    ///your task
     };
        worker.RunWorkerCompleted += (o, ea) =>
        {
            IsVMBusy = false;
          };
         worker.RunWorkerAsync();

答案 1 :(得分:0)

您可以使用telerik的BusyIndi​​cator控件来围绕网格,并将其绑定到VM上的IsBusy属性。

          <telerik:BusyIndicator IsBusy="{Binding IsBusy}">
            <StackPanel>
               <telerik:RadGridView (1)/>
               <telerik:RadGridView (2)/>
               <telerik:RadGridView (3)/> 
            </StackPanel>
          </telerik:BusyIndicator/>

假设您使用VM第一种技术,其中VM在视图之前创建(即在视图的构造中注入它),您可以在VM的构造函数中将IsBusy设置为True并设置它当网格或完成加载时返回false。另外,请确保IsBusy加注PropertyChanged