- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在我的 ScrollViewer 的顶部和底部显示一个半不透明的箭头,如果它可以分别向上或向下滚动。我认为最好的选择是 DataTrigger,但我不确定我也能把它绑起来。我试图避免继承 ScrollViewer,但如果我必须这样做,我会的。有任何想法吗?
我正在使用.Net Framework 3.5(我希望我可以升级!)。
谢谢。 :)
最佳答案
可能的解决方案之一。它使用两个转换器来计算是否可以滚动。模板基于标准ScrollViewer
模板,但带有两个额外的文本 block 来显示信息(“箭头”)。
Window1.xaml
<Window x:Class="WpfApplication1.Window1"
Title="Window1" Height="300" Width="300"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1">
<Window.Resources>
<ResourceDictionary>
<WpfApplication1:ScrollViewerCanScrollUpConverter x:Key="ScrollViewerCanScrollUpConverter" />
<WpfApplication1:ScrollViewerCanScrollDownConverter x:Key="ScrollViewerCanScrollDownConverter" />
</ResourceDictionary>
</Window.Resources>
<Grid>
<ScrollViewer Background="Transparent">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid x:Name="Grid" Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Rectangle x:Name="Corner" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Grid.Column="1" Grid.Row="1"/>
<ScrollContentPresenter Margin="{TemplateBinding Padding}" x:Name="PART_ScrollContentPresenter" Grid.Column="0" Grid.Row="0" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False"/>
<ScrollBar Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Cursor="Arrow" x:Name="PART_VerticalScrollBar" ViewportSize="{TemplateBinding ViewportHeight}" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Value="{Binding Path=VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" Grid.Column="1" Grid.Row="0" AutomationProperties.AutomationId="VerticalScrollBar"/>
<ScrollBar Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Cursor="Arrow" x:Name="PART_HorizontalScrollBar" Orientation="Horizontal" ViewportSize="{TemplateBinding ViewportWidth}" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Value="{Binding Path=HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" Grid.Column="0" Grid.Row="1" AutomationProperties.AutomationId="HorizontalScrollBar"/>
<TextBlock x:Name="PART_UpTextBlock" VerticalAlignment="Top" Text="Can scroll up" Visibility="Collapsed" />
<TextBlock x:Name="PART_DownTextBlock" VerticalAlignment="Bottom" Text="Can scroll down" Visibility="Collapsed" />
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Value="True" Binding="{Binding Path=VerticalOffset, RelativeSource={RelativeSource Self}, Converter={StaticResource ScrollViewerCanScrollUpConverter}}">
<Setter TargetName="PART_UpTextBlock" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ScrollViewerCanScrollDownConverter}">
<Binding Path="VerticalOffset" RelativeSource="{RelativeSource Self}" />
<Binding Path="ExtentHeight" RelativeSource="{RelativeSource Self}" />
<Binding Path="ViewportHeight" RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</DataTrigger.Binding>
<Setter TargetName="PART_DownTextBlock" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ScrollViewer.Template>
<Border Margin="10" Height="400" Background="Yellow">
<TextBlock Text="Content" />
</Border>
</ScrollViewer>
</Grid>
</Window>
using System;
using System.Globalization;
using System.Windows.Data;
namespace WpfApplication1
{
public partial class Window1
{
public const double Epsilon = 0.001;
public Window1()
{
InitializeComponent();
}
}
public class ScrollViewerCanScrollUpConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Math.Abs((double)value) > Window1.Epsilon;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
public class ScrollViewerCanScrollDownConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double verticalOffset = (double)values[0];
double extentHeight = (double)values[1];
double viewportHeight = (double)values[2];
double maxOffset = Math.Max(0.0, extentHeight - viewportHeight);
return verticalOffset < maxOffset - Window1.Epsilon;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
}
关于.net - 如何将 DataTrigger 链接到 ScrollViewer 是否可以向上滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4035462/
我想使用带有 DataTrigger 的样式来定义 ResourceDictionary 中控件的一般外观。 是否可以在 View 中指定DataTrigger绑定(bind)路径?如果没有,是否有一
我需要根据用户与搜索功能的交互动态添加 DataTrigger,因此无法在 XAML 中完成。但是,从下面的 XAML 代码中可以看出我正在尝试做的事情的基本目标。它需要根据 ToggleButton
我有一个名为 OperativeCount 的值。当此数字大于 10 时,我希望 DataGridColumn 的颜色发生变化。类似于此; 10"
我在我的 XAML 中定义了一个 DataTrigger,我想在多个地方使用它。是否可以将其定义为资源然后共享? 这是我的触发器:
所以这是我的 XAML:
我正在尝试将我的一些 WPF 技能转换为 Silverlight,并且在我一直在开发的测试迷你应用程序中遇到了一个稍微奇怪的问题。在 WPF 中,我习惯于在样式中使用 DataTriggers 来根据
是否可以使用 DataTrigger 在 WPF 中设置 RotateTransform 的角度?如果是这样,如何? 最佳答案 当然,这样的事情应该有效
我知道我可以创建一个 setter 来检查值是否为 NULL 并执行某些操作。示例:
所以我刚刚加入了一个 Windows Phone 团队,他们倾向于按照以下方式做一些事情: 我查看了它并心想:代码重复,将 2 个元素加载到 UI,这(虽然很小)加载了不必要的内存 - 为什么在任
正如 WPF 经常发生的那样,我可能会以错误的方式处理事情,但我有以下情况: 我想根据 DataTrigger 应用样式,但您不能从样式内部更改样式:
我希望我的 TextBox 有一个 红色背景如果 ViewModel 属性 =“ 无效 ”。我必须改变什么才能有效? 这个版本告诉我背景没有合格的类型名称 .
我有几个项目控件,我需要为它们附加一个事件处理程序 PreviewMouseLeftButtonDown 事件仅在满足某个条件时发生。 我用数据触发器为我的控件设计了一种样式,我检查了它的绑定(bin
当我的绑定(bind)表字段时,我希望我的图像可见性属性设置为隐藏 Weblink = NULL **OR** Weblink = "" 使用 MultiDataTrigger,您可以按以下逻辑测试多
有没有人有一个成功的解决方法来根据基础数据对象的属性更改 Silverlight 中的样式,因为当值更改时,样式也会更改。我简要地使用了 WPF,它显然有 DataTrigger,它似乎涵盖了这一点,
【原创】 我有一个 ListBox有它的ItemsSource (这是在创建窗口时在后面的代码中完成的)数据绑定(bind)到 ObservableCollection . ListBox然后有以下D
我正在使用 MVVM,所以我需要绑定(bind)一个矩形形状的属性,该属性最终会对其进行动画处理。 我发现很少solutions并试图复制他们的方法,但故事范围没有发挥作用 我包括我的源代码
我有一个动画可以将边框(使用渲染转换变换)移动到它的宽度。此动画需要应用于多个边框,并且这些边框的宽度会有所不同。所以我将动画关键帧的 Value 属性绑定(bind)到边框的 ActualWidth
我有一个 WPF 数据触发器,该触发器设置为在值为 true 时触发。 我希望每次该值设置为 true 时都会触发此触发器,即使它之前是 true。不幸的是,它似乎只有在值从 true 更改为 fal
我有一个数据模板。它有两种视觉状态——展开、折叠。我添加了 2 个 GoToStateAction-s。第一个在数据上下文属性变为 True 时进入 Expanded 状态,第二个在同一属性变为 Fa
我是一名优秀的程序员,十分优秀!