代码之家  ›  专栏  ›  技术社区  ›  Mark

Silverlight BusyIndicator的Ajax样式?

  •  1
  • Mark  · 技术社区  · 16 年前

    我正在寻找一个示例样式,将Silverlight BusyIndicator的外观更改为更像Ajax应用程序的“旋转”外观。

    围绕谷歌的一圈会产生一些链接,指向人们在哪里创建新的控件来实现相同的事情(我怀疑他们提前约会了busyindicator),但如果可能的话,我宁愿剥皮busyindicator。

    有人朝正确的方向撞我吗?

    谢谢

    作记号

    2 回复  |  直到 15 年前
        1
  •  3
  •   Rumplin    15 年前

    我有自己的习惯 BusyIndicator 从Silverlight工具包

    以下是您需要的:

    1. 在样式文件中设置系统命名空间:

      xmlns:system=“clr-namespace:system;assembly=mscorlib”

    2. 将样式/模板放入样式文件:

      <ControlTemplate x:Key="AjaxBusyIndicatorControlTemplate" TargetType="toolkit:BusyIndicator">
          <Grid x:Name="ColorLayer">               
              <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup x:Name="VisibilityStates">
                      <VisualState x:Name="Hidden">
                          <Storyboard>
                              <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.001" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="busycontent">
                                  <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                      <DiscreteObjectKeyFrame.Value>
                                          <Visibility>Collapsed</Visibility>
                                      </DiscreteObjectKeyFrame.Value>
                                  </DiscreteObjectKeyFrame>
                              </ObjectAnimationUsingKeyFrames>
                              <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.001" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="overlay">
                                  <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                      <DiscreteObjectKeyFrame.Value>
                                          <Visibility>Collapsed</Visibility>
                                      </DiscreteObjectKeyFrame.Value>
                                  </DiscreteObjectKeyFrame>
                              </ObjectAnimationUsingKeyFrames>
                          </Storyboard>
                      </VisualState>
                      <VisualState x:Name="Visible">
                          <Storyboard>
                              <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.001" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="busycontent">
                                  <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                      <DiscreteObjectKeyFrame.Value>
                                          <Visibility>Visible</Visibility>
                                      </DiscreteObjectKeyFrame.Value>
                                  </DiscreteObjectKeyFrame>
                              </ObjectAnimationUsingKeyFrames>
                              <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.001" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="overlay">
                                  <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                      <DiscreteObjectKeyFrame.Value>
                                          <Visibility>Visible</Visibility>
                                      </DiscreteObjectKeyFrame.Value>
                                  </DiscreteObjectKeyFrame>
                              </ObjectAnimationUsingKeyFrames>
                          </Storyboard>
                      </VisualState>
                  </VisualStateGroup>
                  <VisualStateGroup x:Name="BusyStatusStates">
                      <VisualState x:Name="Idle">
                          <Storyboard>
                              <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.001" Storyboard.TargetProperty="(Control.IsEnabled)" Storyboard.TargetName="content">
                                  <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                      <DiscreteObjectKeyFrame.Value>
                                          <System:Boolean>True</System:Boolean>
                                      </DiscreteObjectKeyFrame.Value>
                                  </DiscreteObjectKeyFrame>
                              </ObjectAnimationUsingKeyFrames>
                          </Storyboard>
                      </VisualState>
                      <VisualState x:Name="Busy">
                          <Storyboard RepeatBehavior="Forever" AutoReverse="False">
                              <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="loader">
                                  <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                                  <EasingDoubleKeyFrame KeyTime="0:0:1" Value="359.999"/>
                              </DoubleAnimationUsingKeyFrames>
                              <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.001" Storyboard.TargetProperty="(Control.IsEnabled)" Storyboard.TargetName="content">
                                  <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                      <DiscreteObjectKeyFrame.Value>
                                          <System:Boolean>False</System:Boolean>
                                      </DiscreteObjectKeyFrame.Value>
                                  </DiscreteObjectKeyFrame>
                              </ObjectAnimationUsingKeyFrames>
                          </Storyboard>
                      </VisualState>
                  </VisualStateGroup>
              </VisualStateManager.VisualStateGroups>
              <ContentControl x:Name="content" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
              <Rectangle x:Name="overlay" Style="{TemplateBinding OverlayStyle}"/>
              <ContentPresenter x:Name="busycontent">
                  <Path x:Name="loader" Height="19" Width="19" Canvas.Left="0.5" Canvas.Top="0.5" Stretch="Fill" UseLayoutRounding="False" Stroke="Black" StrokeThickness="0.2" RenderTransformOrigin="0.5,0.5"
                      Data="M9.5,3 C5.9101491,3 3,5.9101491 3,9.5 C3,13.08985 5.9101491,16 9.5,16 C13.08985,16 16,13.08985 16,9.5 C16,5.9101491 13.08985,3 9.5,3 z M9.5,0 C14.746705,0 19,4.2532949 19,9.5 C19,14.746705 14.746705,19 9.5,19 C4.2532949,19 0,14.746705 0,9.5 C0,4.2532949 4.2532949,0 9.5,0 z">
                      <Path.RenderTransform>
                          <CompositeTransform/>
                      </Path.RenderTransform>
                      <Path.Fill>
                          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                              <GradientStop Color="#FF0089FF" Offset="0"/>
                              <GradientStop Color="White" Offset="1"/>
                          </LinearGradientBrush>
                      </Path.Fill>
                  </Path>
              </ContentPresenter>
          </Grid>
      </ControlTemplate>
      
      <Style x:Key="AjaxBusyIndicator" TargetType="toolkit:BusyIndicator"  >
          <Setter Property="Template" Value="{StaticResource AjaxBusyIndicatorControlTemplate}"/>
      </Style>
      
    3. 在XAML中使用它:

    <Grid x:Name="LayoutRoot" Background="White">
        <toolkit:BusyIndicator IsBusy="True" Style="{StaticResource AjaxBusyIndicator}">
            <TextBox Text="TEST test test" />
        </toolkit:BusyIndicator>
    </Grid>
    

        2
  •  1
  •   Shoaib Shaikh    16 年前

    好吧,这真是一个常见的场景……Silverlight开发人员通常使用 http://blogs.msdn.com/b/brada/archive/2009/03/20/silverlight-3-activity-control.aspx 这种类型的控件。但是,由于您的要求是像Ajax那样拥有它,我认为此链接可能会有所帮助: http://chrisa.wordpress.com/2008/10/09/a-wait-indicator-in-silverlight/

    以下是有关如何自定义忙指标数据模板的一些提示: http://www.jeff.wilcox.name/2009/11/busy-indicator-control/

    当做。