AutoHide Progressbar с StyleTriggers - PullRequest
       34

AutoHide Progressbar с StyleTriggers

3 голосов
/ 02 декабря 2011

Я хотел бы скрыть индикатор прогресса в WPF, используя привязку данных. Всякий раз, когда свойство равно 0, индикатор выполнения должен скрываться: я пытаюсь следующий код

(Информация: мой текущий текст данных - это класс, который содержит целочисленное свойство 'CurrentIndex')

<ProgressBar Minimum="0" Maximum="100" Value="{Binding CurrentIndex, UpdateSourceTrigger=PropertyChanged}" Visibility="Visible">
    <ProgressBar.Style>
        <Style TargetType="{x:Type ProgressBar}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding CurrentIndex}" Value="0">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ProgressBar.Style>
</ProgressBar>

Что не так с этим кодом? Почему индикатор выполнения все еще отображается, когда CurrentIndex равен 0? (в модели сзади значение CurrentIndex по умолчанию равно 0, когда элемент управления загружен)

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

приоритет DP , не устанавливайте Visibility на самом элементе управления (локальное значение> стиль).

0 голосов
/ 20 января 2016

Ваш XAML был почти верен!

Определите свой индикатор выполнения, как вы это сделали:

<ProgressBar Minimum="0" 
             Maximum="100" 
             Value="{Binding CurrentIndex, UpdateSourceTrigger=PropertyChanged}"
             Name="MyAutoHidingProgressBar" />

Не забудьте добавить свойство Name И не устанавливайте VisibilityВот.Он всегда будет переопределять то, что установлено в вашем Style.

. Затем определите Style как нормальное в вашем <Window.Resources>

 <Window.Resources>
    <Style TargetType="ProgressBar" x:Key="MyAutoHidingProgressBarStyle">
       <Style.Triggers>
           <DataTrigger Binding="{Binding ElementName=MyAutoHidingProgressBar, Path=Value}" Value="0">
                <Setter Property="Visibility" Value="Hidden"></Setter>
           </DataTrigger>
       </Style.Triggers>
    </Style>
</Window.Resources>

.Значение самого индикатора выполнения, а не привязки.

В качестве последнего шага добавьте стиль на свой индикатор выполнения:

Style="{StaticResource MyAutoHidingProgressBarStyle}"

Теперь ваш ProgressBar будет автоматически скрываться, если его Valueэто 0.Вы также можете легко добавить триггер, чтобы скрыть его, если он заполнен.

0 голосов
/ 02 декабря 2011

Другой способ использовать привязку видимости и конвертер:

<Grid>
<Grid.Resources>
    <App:VisibilityConverter x:Key="VisibilityConverter" />
</Grid.Resources>
<ProgressBar Minimum="0" Maximum="100" Value="{Binding CurrentIndex, UpdateSourceTrigger=PropertyChanged}" 
             Visibility="{Binding CurrentIndex, Mode=OneWay, Converter={StaticResource VisibilityConverter}}" />
</Grid>

Код конвертера (VisibilityConverter.cs):

public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == 0 ? Visibility.Hidden : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
...