首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用StyleTriggers的AutoHide进度条

使用StyleTriggers的AutoHide进度条
EN

Stack Overflow用户
提问于 2011-12-02 04:37:34
回答 3查看 3K关注 0票数 3

我想在WPF中隐藏一个使用数据绑定的进度条。只要属性为0,进度条就应该隐藏起来:我尝试以下代码

(信息:我当前的datacontext是一个持有整数属性‘CurrentIndex’的类)

代码语言:javascript
复制
<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)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-02 04:41:01

样式,请不要在控件本身上设置Visibility (local value > DP precedence )。

票数 2
EN

Stack Overflow用户

发布于 2011-12-02 05:05:00

使用可见性绑定和转换器的其他方式:

代码语言:javascript
复制
<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):

代码语言:javascript
复制
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();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-01-20 18:26:46

您的XAML几乎是正确的!

像定义进度条一样定义进度条:

代码语言:javascript
复制
<ProgressBar Minimum="0" 
             Maximum="100" 
             Value="{Binding CurrentIndex, UpdateSourceTrigger=PropertyChanged}"
             Name="MyAutoHidingProgressBar" />

不要忘记添加Name属性,并且不要在这里设置Visibility。它将始终覆盖在Style中设置的内容。

然后在<Window.Resources>中像平常一样定义一个Style

代码语言:javascript
复制
 <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>

这基本上是在检查进度条本身的值,而不是您的绑定。

作为最后一步,将样式添加到进度栏中:

代码语言:javascript
复制
Style="{StaticResource MyAutoHidingProgressBarStyle}"

现在,如果您的ProgressBarValue0,它将自动隐藏。如果触发器已满,您还可以轻松地添加触发器来隐藏它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8347935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档