WPF - 当 ScrollViewer 滚动时设置图像可见性

标签 wpf xaml

我在 WPF 用户控件上有一个 ScrollViewer,我想要实现的是在 ScrollViewer 的顶部和底部显示阴影图像,但是当滚动条位于顶部时隐藏顶部阴影,当滚动条位于底部时隐藏底部阴影。

换句话说,我需要以某种方式将图像的 Visibility 属性绑定(bind)到 ScrollViewer 的偏移量。下面的代码显然是不正确的,但应该说明我想要做什么。

<Grid>
    <Image Source="Shadow.png" VerticalAlignment="Top">
        <Image.Resources>
            <Style TargetType="Image">
                <Style.Triggers>
                    <Trigger SourceName="Scroller" Property="VerticalOffset" Value="GREATER THAN ZERO OR LESS THAN MAX">
                        <Setter Property="Visibility" Value="Collapsed" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Image.Resources>
    </Image>
    <ScrollViewer Height="200" x:Name="Scroller">
        <ContentControl />
    </ScrollViewer>
</Grid>

最佳答案

这是我要做的:

首先,您需要一个 IMultiValueConverter:

public class ScrollOffsetToVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values == null)
            throw new ArgumentException("Values cannot be null.");
        if (values.Count() != 2)
            throw new ArgumentException("Incorrect number of bindings (" + values.Count() + ")");
        if (parameter == null)
            throw new ArgumentException("Parameter cannot be null.");

        var top = parameter.ToString().ToUpper() == "TOP";

        var offset = Double.Parse(values[0].ToString());
        var maxHeight = Double.Parse(values[1].ToString());

        return (top && offset == 0) || (!top && offset == maxHeight) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后,您可以使用此转换器为图像的 Visibility 属性应用 Setter。

<Image.Style Source="Shadow.png" VerticalAlignment="Top">
    <Style>
        <Setter Property="Image.Visibility">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ScrollOffsetToVisibilityConverter}" ConverterParameter="Top">
                    <Binding ElementName="Scroller" Path="VerticalOffset"/>
                    <Binding ElementName="Scroller" Path="ScrollableHeight"/>
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
</Image.Style>

如果滚动条位于顶部或底部,只需传入“top”或“bottom”(或更准确地说,不是“top”),ConverterParameter 就会返回“Visible”。

关于WPF - 当 ScrollViewer 滚动时设置图像可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28677108/

相关文章:

WPF 布局 : elements growing, 但没有正确缩小

WPF-调整 child 大小以填补 parent

c# - 如何在不添加对类库的引用的情况下访问另一个类库中的 View 模型和项目模型

wpf - 带有 MultiTriggers 的 SourceName

c# - 根据绑定(bind)值使用不同的 XAML 模板

c# - 当绑定(bind)到 WPF DataGrid 时,此 View 不允许使用 DataGrid 版本 'EditItem'

c# - 将 WPF 数据网格列标题绑定(bind)到代码后面的属性

WPF DataGrid.GroupStyle 与 MVVM

c# - 绑定(bind)到 ListView 上 ObservableCollection 中的前 N ​​项

C# WPF 组合框选择第一项