我尝试使用以下代码自定义.Net垂直进度条(使用Visual 2010):
<ProgressBar Name="VolumeMeter" Orientation="Vertical" Margin="4,30,0,0" Value="50" HorizontalAlignment="Left" VerticalAlignment="Top" Height="300" Width="10">
<ProgressBar.Template>
<ControlTemplate TargetType="ProgressBar">
<Border BorderBrush="Green" BorderThickness="1">
<Grid Name="PART_Track" Background="Red">
<Rectangle Name="PART_Indicator" Fill="Blue"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Orientation" Value="Horizontal">
<Setter TargetName="PART_Indicator" Property="VerticalAlignment" Value="Stretch"/>
<Setter TargetName="PART_Indicator" Property="HorizontalAlignment" Value="Left"/>
</Trigger>
<Trigger Property="Orientation" Value="Vertical">
<Setter TargetName="PART_Indicator" Property="VerticalAlignment" Value="Bottom"/>
<Setter TargetName="PART_Indicator" Property="HorizontalAlignment" Value="Stretch"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ProgressBar.Template>
</ProgressBar>
但是,它没有显示进展,出了什么问题?
答案 0 :(得分:13)
您可能遇到的问题是.Net 4.0中破坏更改的结果,这是尝试提高WPF ProgressBar控件性能的结果。 (不可否认,它确实非常需要。)请参阅http://connect.microsoft.com/VisualStudio/feedback/details/571674/issue-with-vertical-progress-bar-on-4-0-framework
简短版本:在.Net 3.5及更早版本中,您可以创建进度条,它足够智能,可以自行调整垂直或水平方向。在.Net 4.0中,您必须创建您的进度条,就好像它是水平的一样,然后使用触发器并转换以在方向垂直时将其旋转为垂直方向。如果您正在使用.Net 4.0(我怀疑您是),这就是为什么您不可能让您的进度条按照您期望的方式运行。
可悲的是,这在MSDN中记录的非常。值得注意的是http://msdn.microsoft.com/en-us/library/ms750638.aspx处的示例没有提到这一点,或以任何方式解决它。同样,ProgressBar文档本身(http://msdn.microsoft.com/en-us/library/system.windows.controls.progressbar.aspx)也没有记录此演示基础的先前版本的这一重大变化。谢天谢地,感谢您提交的错误,或者我(也)认为我已经疯了。
现在这样做的正确方法如下:
<ControlTemplate TargetType="ProgressBar">
<Border x:Name="Root">
<!-- Visual tree goes here, be sure to include PART_Indicator and PART_Track -->
</Border>
<!-- Triggers must come after the Visual Tree so we can reference names. -->
<ControlTemplate.Triggers>
<Trigger Property="Orientation" Value="Vertical">
<!-- Rotate the progressbar so the left edge is the bottom edge -->
<Setter TargetName="Root" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="270" />
</Setter.Value>
</Setter>
<!--
Fix the render dimensions b/c what was the width is now height and vice-versa.
Note that we have to use {RelativeSource TemplatedParent} b/c {TemplateBinding}
can't be used in a setter's value.
-->
<Setter TargetName="Root" Property="Width"
Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height}"
/>
<Setter TargetName="Root" Property="Height"
Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}"
/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
答案 1 :(得分:1)
来自你的xaml,看起来你没有把它绑定到任何东西。 你必须有一些东西告诉它更新进度,通常你会把它绑定到你的datamodel上的东西,或者在你的代码隐藏中有一些方法来做它。
答案 2 :(得分:0)
类似于:<Grid Height="{Binding CurrentValue}" VerticalAlignment="Bottom">