【问题标题】:Writing a "Progress Pie" style for WPF ProgressBar为 WPF ProgressBar 编写“进度饼”样式
【发布时间】:2014-02-13 22:02:36
【问题描述】:

我正在尝试为 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 的中心重合;有什么建议吗?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    似乎 PART_Indicator 的宽度与模板的 Value 绑定。怎么来的?我还没有写任何东西。

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

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

    如果你会读法语,或者你相信谷歌翻译,there is this one as well 可以满足你的需求,而且看起来很完整。

    【讨论】:

    • 谢谢,在等待答案的同时,我也发现了这一点。总结一下: * PART_Indicator 的宽度由模板设置为Value * PART_Track,显然没有什么可做的。 * Arc 不允许本地指定中心点的位置,以实现自定义形状是必要的。
    • 你明白了......但我不明白为什么这是一个问题......你没有义务声明 PART_Indicator,是吗?
    • 我不确定,我已经尝试重命名它并且应用程序仍然可以编译;但是,我在尝试显示进度条时发生了崩溃。
    • 好吧,我没试过 :) 用 Visility="Collapsed" & x:Name="PART_Indicator" 加一个假边框,然后!
    • 我想这会起作用,但另一个问题仍然存在。我得想点别的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2012-06-21
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多