【问题标题】:Silverlight ProgressBar: Set IndeterminateGradientFill dynamically?Silverlight ProgressBar:动态设置 IndeterminateGradientFill?
【发布时间】:2011-04-25 17:24:26
【问题描述】:

我在 SL4 中设计了一个 ProgressBar,除了不确定的动画外,它几乎完成了。这是一种类型化的样式,ProgressBar 的宽度不会是固定值。我正在尝试在情节提要中设置“To”值,但我没有取得太大成功...

<DoubleAnimation Duration="00:00:.5" Storyboard.TargetProperty="(Shape.Fill).(LinearGradientBrush.Transform).(TransformGroup.Children)[0].X" Storyboard.TargetName="IndeterminateGradientFill" From="0" To="{Binding ElementName=ProgressBarRootGrid, Path=ActualWidth}"/>

有什么建议吗?

【问题讨论】:

    标签: animation silverlight-4.0 binding progress-bar


    【解决方案1】:

    我建议将 Shape 的 Horizo​​ntalAlignment 设置为 Stretch,然后为 RenderTransforms Scale X 属性设置动画。

    这应该让你开始:

    <UserControl x:Class="SilverlightTestImages.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
        <UserControl.Resources>
            <ControlTemplate x:Key="ProgressBarControlTemplate1" TargetType="ProgressBar">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Determinate"/>
                            <VisualState x:Name="Indeterminate">
                                <Storyboard RepeatBehavior="Forever">
                                    <DoubleAnimation Duration="0:0:1" To="1" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border BorderBrush="Black" BorderThickness="1" CornerRadius="2">
                        <Rectangle x:Name="rectangle" Fill="#FF1B6C0B" RadiusX="1" RadiusY="1" RenderTransformOrigin="0,0.5">
                            <Rectangle.RenderTransform>
                                <CompositeTransform ScaleX="0"/>
                            </Rectangle.RenderTransform>
                        </Rectangle>
                    </Border>
                </Grid>
            </ControlTemplate>
        </UserControl.Resources>
    
        <Grid x:Name="LayoutRoot" Background="White">
            <ProgressBar Height="10" VerticalAlignment="Bottom" Template="{StaticResource ProgressBarControlTemplate1}" IsIndeterminate="True"/>
        </Grid>
    </UserControl>
    

    更新

    由于某些设置翻译动画的方式,要完成类似于 VS2010 进度条的操作有点困难。 Silverlight 测试团队的 Jeff Wilcox 有一个很好的控件,可以根据您的需要进行调整。转到http://www.jeff.wilcox.name/2010/08/performanceprogressbar/ 并在“获取代码”下下载RelativeAnimatingContentControl.cs。然后使用他跟随动画,这应该接近你正在寻找的内容

    <UserControl
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:Microsoft_Phone_Controls_Unsupported="clr-namespace:Microsoft.Phone.Controls.Unsupported" 
        x:Class="SilverlightTestImages.MainPage"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
        <UserControl.Resources>
            <ControlTemplate x:Key="ProgressBarControlTemplate1" TargetType="ProgressBar">
                <Microsoft_Phone_Controls_Unsupported:RelativeAnimatingContentControl HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" >
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Determinate"/>
                            <VisualState x:Name="Indeterminate">
                                <Storyboard RepeatBehavior="Forever">
                                    <DoubleAnimation Duration="0:0:1" To="100.1" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="Background" d:IsOptimized="True"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border BorderBrush="#FFBCBCBC" BorderThickness="1" CornerRadius="2">
                        <Border.Background>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#FFF5F5F5"/>
                                <GradientStop Color="#FFE5E5E5" Offset="0.49"/>
                                <GradientStop Color="#FFB4B4B4" Offset="0.5"/>
                                <GradientStop Color="#FFC8C8C8" Offset="1"/>
                            </LinearGradientBrush>
                        </Border.Background>
                        <Grid>
                            <Border BorderBrush="#B2FFFFFF" BorderThickness="1" CornerRadius="2"/>
                            <Rectangle x:Name="Background" RadiusX="1" RadiusY="1" RenderTransformOrigin="0,0.5" Width="100" HorizontalAlignment="Left">
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                                        <GradientStop Color="#0041DE0C"/>
                                        <GradientStop Color="#9941DE0C" Offset="0.4"/>
                                        <GradientStop Color="#9941DE0C" Offset="0.6"/>
                                        <GradientStop Color="#0041DE0C" Offset="1"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                                <Rectangle.RenderTransform>
                                    <CompositeTransform TranslateX="-20.1"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                        </Grid>
                    </Border>
                </Microsoft_Phone_Controls_Unsupported:RelativeAnimatingContentControl>
            </ControlTemplate>
        </UserControl.Resources>
    
        <Grid x:Name="LayoutRoot" Background="White">
            <ProgressBar Height="20" Width="200" VerticalAlignment="Center" HorizontalAlignment="Center" Template="{StaticResource ProgressBarControlTemplate1}" IsIndeterminate="True" />
        </Grid>
    </UserControl>
    

    【讨论】:

    • 形状的 HA 设置为拉伸。一个样本会很有帮助。我基本上试图获得与 VS 的不确定状态栏相同的效果,单个绿色渐变在轨道上滑动。
    • 还有一个版本应该看起来接近VS2010进度条
    • 谢谢,本德威。我深入研究了开箱即用的动画,现在我明白了我的问题所在。您提供的代码非常有帮助。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 2010-09-14
    • 2015-07-06
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2010-09-14
    相关资源
    最近更新 更多