在WPF进度条样式老气。 增量在酒吧。 如何实现与Vista或Windows-7黑幕辉光效果的进度条?
图片http://quickshare.my3gb.com/download/2.JPG
即使检查了进度的性能。 但是,没有到发光效果效果相关的属性。
此外,有没有任何动画或正常进度条不同的东西/
谢谢进阶
编辑代码
<ProgressBar Height="41" HorizontalAlignment="Left" Margin="372,215,0,0" Name="progressBar1" VerticalAlignment="Top" Width="150">
</ProgressBar>
滚你自己应该不会太难。
创建具有标准进度条的特性的用户控件
Value
Maximum
Minimum
可以创建派生属性,其通过使用一公式计算出条的大小:
ProgressBarWidth = (Value / (Maximum + Minimum) * ControlWidth) - Padding
其中,当值,最大值或最小值被更新改变
这个绑定在你的进度条控件模板中的“条”的宽度 - 这样,当Value属性被更新,进度条将调整。
如何使你的酒吧看起来是你的,但我猜你只是想看中的负载填充/渐变/发光效果 - 你可以混合添加这些
免责声明:公式可能不正确!
如果您想尝试推出自己的,这里有一个我刚怀孕了,这似乎工作确定
public partial class MyProgressBar : UserControl
{
public MyProgressBar()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MyProgressBar_Loaded);
}
void MyProgressBar_Loaded(object sender, RoutedEventArgs e)
{
Update();
}
private static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(MyProgressBar), new PropertyMetadata(100d, OnMaximumChanged));
public double Maximum
{
get { return (double)GetValue(MaximumProperty); }
set { SetValue(MaximumProperty, value); }
}
private static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(MyProgressBar), new PropertyMetadata(0d, OnMinimumChanged));
public double Minimum
{
get { return (double)GetValue(MinimumProperty); }
set { SetValue(MinimumProperty, value); }
}
private static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(MyProgressBar), new PropertyMetadata(50d, OnValueChanged));
public double Value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
private static readonly DependencyProperty ProgressBarWidthProperty = DependencyProperty.Register("ProgressBarWidth", typeof(double), typeof(MyProgressBar), null);
private double ProgressBarWidth
{
get { return (double)GetValue(ProgressBarWidthProperty); }
set { SetValue(ProgressBarWidthProperty, value); }
}
static void OnValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
(o as MyProgressBar).Update();
}
static void OnMinimumChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
(o as MyProgressBar).Update();
}
static void OnMaximumChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
(o as MyProgressBar).Update();
}
void Update()
{
// The -2 is for the borders - there are probably better ways of doing this since you
// may want your template to have variable bits like border width etc which you'd use
// TemplateBinding for
ProgressBarWidth = Math.Min((Value / (Maximum + Minimum) * this.ActualWidth) - 2, this.ActualWidth - 2);
}
}
该XAML
<UserControl x:Class="WpfApplication1.MyProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" x:Name="uc">
<Grid>
<Border Background="White">
<Border BorderBrush="Gray" BorderThickness="1">
<Grid>
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFE5E5E5" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Grid.Background>
<Grid Width="{Binding ProgressBarWidth, ElementName=uc}" HorizontalAlignment="Left">
<Grid.Background>
<LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
<GradientStop Color="#FFCBFFD0" Offset="0" />
<GradientStop Color="#FF62EF73" Offset="1" />
<GradientStop Color="#FFAEE56D" Offset="0.39" />
</LinearGradientBrush>
</Grid.Background>
</Grid>
</Grid>
</Border>
</Border>
</Grid>
</UserControl>
结果:
就像我说的,这样的事情是很容易的,但仍考虑重新定义模板或使用原来的,因为它不上合适的操作系统支持glowyness
这是在我的控制模板增加了“百分比”依赖属性并绑定到:
代码更新Percent
为
Percentage = Math.Min((int)(Value / (Maximum + Minimum) * 100), 100);
编辑2:
我搞砸与填充,并添加了白色的内边框,所以它看起来更有光泽。 唯一缺少的是有光泽的动画
前一个是我的控制,底部一个是默认的一个WPF
请记住,这一切可能只是通过编辑进度条控件模板
下面是更新XAML:
<UserControl x:Class="WpfApplication1.MyProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" x:Name="uc">
<Grid>
<Border Background="White" BorderBrush="Gray" BorderThickness="1">
<Border BorderBrush="White" BorderThickness="1">
<Grid>
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFE5E5E5" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Grid.Background>
<Grid Width="{Binding ProgressBarWidth, ElementName=uc, FallbackValue=200}" HorizontalAlignment="Left">
<Grid.Background>
<LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
<GradientStop Color="#FF8BBA91" Offset="0" />
<GradientStop Color="#FF8BBA91" Offset="1" />
<GradientStop Color="#FF9ED76A" Offset="0.8" />
<GradientStop Color="#FF9ED76A" Offset="0.2" />
</LinearGradientBrush>
</Grid.Background>
</Grid>
<Border>
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#89E2E2E2" Offset="0" />
<GradientStop Color="#C1FFFFFF" Offset="0.5" />
<GradientStop Color="Transparent" Offset="0.52" />
</LinearGradientBrush>
</Border.Background>
</Border>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Percentage, ElementName=uc}"></TextBlock>
</Grid>
</Border>
</Border>
</Grid>
</UserControl>
你需要为了得到顺利进度条和动画焕发外观使用Aero主题(如Windows 7基本,或Windows 7)在Windows中的个性化设置。
Vista和Windows 7具有Aero主题。 它的Windows XP发布时根本不存在。 也有人在Windows 8中删除一刀切更标准的外观。 如果切换到Windows经典,那么你得到的是旧矮胖的酒吧寻找的进度条。
WPF有一组不同的月神,航空,皇家,经典.....定义的模板是做什么的是看主题系统当前正在使用,然后这使得决定使用哪一套WPF模板。
所以,当你在XP,而不会继续使用Aero一套模板的机会。
如果由于某种原因,你想拥有Windows时不使用Aero主题与航空为主题的进度条看起来更然后有2级主要的解决方案。
该解决方案:
你可以强迫你的WPF应用程序使用Aero主题的WPF模板,所有的控件:
要么
如果你不希望所有的应用程序的控制要作为主题的Aero,然后只取样式/模板定义Aero的外观从Aero主题资源进度,并把它应用到你的进度。
希望无论哪种方式,将让你的光辉进度条....注意,我没有XP以测试是否是这种情况。
如果你想改变进度条的样子,你就必须重新界定其(控制)模板。
MS在这里解释这一点:
http://msdn.microsoft.com/en-us/library/ms750638.aspx
当写模板,得到焕发,你可以使用的BitmapEffect,具有OuterGlowBitmapEffect(!软件渲染),但最好是使用效果(更多最新的)。
也许你没有,如果你使用的进度条的效果,重新定义模板,它适合你。
请注意,你有很好的免费主题,为您在网络上的应用程序。
您可以使用以下,这是公认的答案一个调整模拟动画:
<Grid Background="LightGray">
<Grid Width="{Binding ProgressBarWidth, ElementName=uc}" HorizontalAlignment="Left">
<Grid.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[1].(GradientStop.Offset)" From="-1" To="0" Duration="0:0:1.5" RepeatBehavior="Forever"/>
<DoubleAnimation Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[2].(GradientStop.Offset)" From="0" To="1" Duration="0:0:1.5" RepeatBehavior="Forever"/>
<DoubleAnimation Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[3].(GradientStop.Offset)" From="1" To="2" Duration="0:0:1.5" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
<Grid.Background>
<LinearGradientBrush>
<GradientStop Color="#FF218ED6" Offset="0.0" />
<GradientStop Color="#FF4BA5E0" Offset="0.4" />
<GradientStop Color="#FF8ECCF5" Offset="0.5" />
<GradientStop Color="#FF4BA5E0" Offset="0.6" />
<GradientStop Color="#FF218ED6" Offset="1.0" />
</LinearGradientBrush>
</Grid.Background>
</Grid>
</Grid>
预习:
文章来源: Progress bar style in WPF is old fashioned. Increments in Bars. How to implement a progress bar with vista or windows-7 shady glow effect?