2011-07-20 57 views
2

下完全不是那麼回事(ProgressValue是DataContext的設定值。)如何創建當值爲0時隱藏的ProgressBar?

<StatusBarItem Grid.Column="1"> 
    <StatusBarItem.Resources> 
     <Style TargetType="ProgressBar"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ProgressValue}" Value="0"> 
        <Setter Property="Visibility" Value="Hidden"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StatusBarItem.Resources> 
    <ProgressBar Value="{Binding ProgressValue}" Grid.Column="1" Width="80" Height="13"> 
    </ProgressBar> 
</StatusBarItem> 

回答

4

嘗試指定的最小(和最大)值。設置好後,它似乎適用於我的代碼版本。

有了這個XAML:

<StatusBarItem x:Name="Feedback" Grid.Row="1"> 
     <StatusBarItem.Resources> 
      <Style TargetType="ProgressBar"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding}" Value="0"> 
         <Setter Property="Visibility" Value="Hidden"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </StatusBarItem.Resources> 
     <ProgressBar Value="{Binding Mode=OneWay}" Minimum="0" Maximum="10" Grid.Column="1" Width="80" Height="13"> 
     </ProgressBar> 
    </StatusBarItem> 

這個代碼MainWindows.xaml.cs的構造函數(僅用於測試目的)

int value = 10; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Feedback.DataContext = value; 

     Timer t = new Timer(500); 
     t.Elapsed += (s, e) => 
      { 
       if (value > 0) Dispatcher.Invoke(new Action(() => { Feedback.DataContext = --value; })); 
       else t.Stop(); 
      }; 

     t.Start(); 
    } 

我得到的進度條從10往下走到0時進度條消失。

6

嘗試在其ValueChanged事件設置進度的Visibility屬性:

private void progressBar1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { 
    progressBar1.Visibility = (progressBar1.Value == 0) ? Visibility.Hidden : Visibility.Visible; 
} 
+0

然而,使用後臺代碼來做這件事不是很乾淨。另外,不適用於鬆散的XAML。 –

0

例XAML:

<ProgressBar> 
    <ProgressBar.Resources> 
     <src:DoubleToVisibilityConverter x:Key="_doubleToVisibilityConverter" /> 
    </ProgressBar.Resources> 
    <ProgressBar.Visibility> 
     <Binding 
      RelativeSource="{RelativeSource Self}" 
      Path="Value" 
      Converter="{StaticResource _doubleToVisibilityConverter}" 
     /> 
    </ProgressBar.Visibility> 
</ProgressBar> 

和代碼:

public class DoubleToVisibilityConvertor : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     double input = 0; 

     if (value is double) 
     { 
      input = (double)value; 
     } 
     else if (value is int) 
     { 
      input = (int)value; 
     } 
     else if (value is string) // Useful if input of converter is written in XAML 
     { 
      if (!double.TryParse((string)value, out input)) 
       return Binding.DoNothing; 
     } 
     else 
     { 
      return Binding.DoNothing; 
     } 

     return (input > 0 ? Visibility.Visible : Visibility.Collapsed); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

聲明:從存儲器寫入,未編譯或測試。

相關問題