2010-07-13 106 views
1

我正在尋找一個樣式來改變Silverlight BusyIndi​​cator的外觀,使其更像是AJAX應用程序的「旋轉輪」外觀。Silverlight BusyIndi​​cator的Ajax風格風格?

圍繞谷歌一圈,產生了一些鏈接到人們創造新的控制來實現同樣的事情(我懷疑他們預約了BusyIndi​​cator),但我寧願皮膚BusyIndi​​cator如果可能的話。

任何人都在正確的方向嗎?

感謝

馬克

回答

3

我做我自己的自定義BusyIndicator從Silverlight工具包

這裏是你需要的東西:

  1. 設置在樣式文件系統命名空間:

    的xmlns:系統=「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> 

+0

+1正是我所期待的。謝謝 – base2 2012-05-02 17:23:42

1

那麼真的是常見的場景.. 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/

問候。

+0

謝謝,但正如我所說,我不希望有一個新的控制,我要的風格BusyIndi​​cator – Mark 2010-07-14 04:47:57

+0

查看我剛添加到帖子的鏈接。希望這可以幫助 – 2010-07-14 06:02:12