【问题标题】:How to show a Isbusy indication right when a window opens如何在窗口打开时立即显示 Isbusy 指示
【发布时间】:2013-11-12 21:54:18
【问题描述】:

当窗口打开时网格 1-3 正在加载时,我试图显示一个视觉指示“isbusy”。在使用“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>

【问题讨论】:

  • 我在这里没有看到繁忙的指示器控件...您是否使用 Telerik 的 BusyIndicator 控件来实现此目的?

标签: wpf telerik wpf-controls wpfdatagrid


【解决方案1】:

您可以使用 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();

【讨论】:

    【解决方案2】:

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

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

    假设您使用 VM first 技术,其中 VM 在视图之前创建(即在视图的构造函数中注入),您可以在 VM 的构造函数中将 IsBusy 设置为 True 并将其设置回 false 时网格或完成加载。还要确保IsBusy 提升PropertyChanged

    【讨论】:

    • 当我尝试这个时,我得到的内容只能设置一次
    • @Robert 我的错,我是凭记忆写下来的,抱歉。更新了答案
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2012-09-30
    相关资源
    最近更新 更多