在WPF进度条样式老气。 增量在酒吧。 如何实现与Vista或Windows-7黑幕辉光效果的

2019-07-30 23:58发布

在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>

Answer 1:

滚你自己应该不会太难。

创建具有标准进度条的特性的用户控件

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>


Answer 2:

你需要为了得到顺利进度条和动画焕发外观使用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模板,所有的控件:

  • http://arbel.net/2006/11/03/forcing-wpf-to-use-a-specific-windows-theme/

  • http://www.kennethham.com/wp/2010/11/force-wpf-to-use-windows-7aero-theming-in-classic-mode/

要么

如果你不希望所有的应用程序的控制要作为主题的Aero,然后只取样式/模板定义Aero的外观从Aero主题资源进度,并把它应用到你的进度。

  • 我在哪里可以下载微软的WPF标准的主题?

希望无论哪种方式,将让你的光辉进度条....注意,我没有XP以测试是否是这种情况。



Answer 3:

如果你想改变进度条的样子,你就必须重新界定其(控制)模板。
MS在这里解释这一点:
http://msdn.microsoft.com/en-us/library/ms750638.aspx
当写模板,得到焕发,你可以使用的BitmapEffect,具有OuterGlowBitmapEffect(!软件渲染),但最好是使用效果(更多最新的)。

也许你没有,如果你使用的进度条的效果,重新定义模板,它适合你。

请注意,你有很好的免费主题,为您在网络上的应用程序。



Answer 4:

您可以使用以下,这是公认的答案一个调整模拟动画:

<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?