为WPF ProgressBar编写“Progress Pie”样式

时间:2014-02-13 13:15:44

标签: c# wpf

我正在尝试为ProgressBar编写一个WPF样式,将标准栏变为“进度饼”。

这是我到目前为止所尝试的:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    mc:Ignorable="d">

    <Style x:Key="ProgressPie" TargetType="{x:Type ProgressBar}">
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ProgressBar}">
                    <Grid x:Name="TemplateRoot" SnapsToDevicePixels="true">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <Ellipse x:Name="PART_Track"
                                 Fill="{TemplateBinding Background}"
                                 HorizontalAlignment="Stretch"
                                 VerticalAlignment="Stretch"/>

                        <ed:Arc x:Name="PART_Indicator"
                                ArcThickness="1"
                                ArcThicknessUnit="Percent"
                                Fill="{StaticResource SomeStaticBrush}"
                                ToolTip="{TemplateBinding Value}"
                                EndAngle="{TemplateBinding Value}"/>

                        <ed:Arc x:Name="OuterPieBorder"
                                ArcThickness="{TemplateBinding BorderThickness}"
                                ArcThicknessUnit="Pixel"
                                Stroke="{TemplateBinding BorderBrush}"
                                StartAngle="0"
                                EndAngle="360"
                                HorizontalAlignment="Stretch"
                                VerticalAlignment="Stretch"
                                Margin="0"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

不幸的是,我至少有几个问题:

  • 似乎PART_Indicator的宽度绑定到模板的Value。怎么会?我还没有写任何东西。
  • 我找不到一种简单的方法来定位PART_Indicator,以便饼图的中心与PART_Track的中心重合;有什么建议吗?

1 个答案:

答案 0 :(得分:1)

  

似乎PART_Indicator的宽度绑定到模板的值。怎么会?我还没有写任何东西。

这就是模板的工作原理:) see this for more explanations.

关于你的第二个问题,我没有看到任何“神奇的答案”(我猜不存在),但是this answer might help you.

如果您可以阅读法语,或者您信任谷歌翻译,there is this one as well可以做您想做的事情,而且看起来非常完整。