2011-04-19 64 views
5

我嘗試定製的.Net垂直進度條(使用Visual 2010),用下面的代碼:垂直進度條模板.NET

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

但是,它doesn't顯示進度,有什麼不對?

+0

WPF? Silverlight的? – 2011-04-19 23:39:17

+0

@威爾:這次不是問題。 :)關鍵提示是「使用Visual 2010」。 – 2011-07-27 20:02:07

+0

@GregD:哎呀,我以爲我正在清理一個過時的評論。沒有看到差異。現在讀你的答案...... – Will 2011-07-27 20:27:47

回答

1

從你的xaml,它看起來像你不綁定任何東西。 你必須有一些東西來告訴它更新進度,通常你會將它綁定到你的數據模型上的東西,或者在你的代碼隱藏中有一些方法來實現它。

+0

你們大家都很年輕,缺乏經驗。我們不認爲他對他:) – 2011-04-19 23:55:19

+0

地獄沒有​​。學習線程就像是一段經文。幾乎和將藤蔓綁在腳踝上並從竹塔上跳下一樣糟糕。 – Will 2011-04-19 23:56:20

+1

這是WPF。我使用VolumeMeter.Value = XX來更新代碼隱藏的值,但使用完全相同的模板,如果我將Orientation =「Horizo​​ntal」並交換「Height by Width」值,則它可以工作.... – Christian 2011-04-20 14:06:22

0

喜歡的東西:<Grid Height="{Binding CurrentValue}" VerticalAlignment="Bottom">

13

你可能會碰到的問題是在.NET 4.0中一個重大更改這是試圖改善WPF進度控制的性能結果的結果。 (有些東西,當然,它需要很糟糕)。參考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

哎呦,這是一個重大改變。 – Will 2011-07-27 20:30:01

+1

這工作太棒了! +1 – DanielB 2011-10-27 09:30:06

+0

不幸的是,如果你不記得翻轉開始點和結束點,這可能會對填充梯度造成嚴重破壞。 – erodewald 2012-06-14 19:34:46