垂直进度栏模板.net

Peñ*_*eña 5 .net progress-bar

我尝试使用以下代码自定义.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>
Run Code Online (Sandbox Code Playgroud)

但是,它没有显示进展,有什么不对?

Gre*_*g D 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>
Run Code Online (Sandbox Code Playgroud)


Mua*_*Dib 1

从您的 xaml 来看,您似乎没有将其绑定到任何东西。您必须有一些东西告诉它更新进度,通常您会将其绑定到数据模型上的某些东西,或者在代码隐藏中使用某种方法来执行此操作。