- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的应用程序创建一个带有两个拇指的滑块,用作范围滑块,但遇到了问题。我的基本要求是获得一个带有刻度线和两个拇指的滑块,它们都设置为 IsSnapToTickEnabled="true"。
我在搜索帮助时找到了一些范围滑块的示例(例如 this one ),但我无法修改它以添加刻度线并强制拇指对齐刻度。不过,为链接中的范围滑块获取刻度线和捕捉工作将是理想的。
我尝试修改滑块的模板并向其添加另一个拇指,但随后我不知道如何获取所选拇指的值。
有没有人有一个带有两个拇指、刻度线和对齐刻度的滑块示例?我发现的所有范围滑块示例都使用两个相互重叠的滑块,并且它们都不允许刻度线或对齐刻度线。
谢谢。
最佳答案
我意识到这个问题已经三年多了。但是,我一直在使用具有多个拇指的滑块示例作为练习来了解有关 WPF 的更多信息,并且在我试图弄清楚如何执行此操作时遇到了这个问题。不幸的是,链接的示例似乎不再存在(一个很好的例子,说明了为什么 StackOverflow 问题和答案不应该使用对问题或答案至关重要的任何细节的链接)。
我查看了大量关于该主题的示例和文章,虽然我没有找到专门启用刻度线的示例和文章,但那里有足够的信息让我弄清楚。我找到了 one article特别好,因为它相当清晰和切中要害,同时揭示了一些非常有用的技术,它们是完成这项任务的关键。
我的最终结果是这样的:
因此,为了其他可能想要做同样事情的人,或者只是想更好地理解一般技术的人的利益,这里是如何制作一个支持基本滑块的各种刻度功能的双拇指滑块控件......
起点是UserControl
类本身。在 Visual Studio 中,添加一个新的 UserControl
类到项目。现在,添加您想要支持的所有属性。不幸的是,我还没有找到一种机制可以简单地将属性委托(delegate)给 UserControl
中的适当滑块实例。 ,因此这意味着为每个属性编写新属性。
根据先决条件(即其他成员需要声明的成员),我想要的功能之一是限制每个滑块的行程,使其不能被拖过另一个。我决定使用 CoerceValueCallback
来实现这个对于属性,所以我需要回调方法:
private static object LowerValueCoerceValueCallback(DependencyObject target, object valueObject)
{
DoubleThumbSlider targetSlider = (DoubleThumbSlider)target;
double value = (double)valueObject;
return Math.Min(value, targetSlider.UpperValue);
}
private static object UpperValueCoerceValueCallback(DependencyObject target, object valueObject)
{
DoubleThumbSlider targetSlider = (DoubleThumbSlider)target;
double value = (double)valueObject;
return Math.Max(value, targetSlider.LowerValue);
}
Minimum
,
Maximum
,
IsSnapToTickEnabled
,
TickFrequency
,
TickPlacement
, 和
Ticks
来自底层滑块,以及两个映射到各个滑块值的新属性,
LowerValue
和
HigherValue
.首先,我必须声明
DependencyProperty
对象:
public static readonly DependencyProperty MinimumProperty =
DependencyProperty.Register("Minimum", typeof(double), typeof(DoubleThumbSlider), new UIPropertyMetadata(0d));
public static readonly DependencyProperty LowerValueProperty =
DependencyProperty.Register("LowerValue", typeof(double), typeof(DoubleThumbSlider), new UIPropertyMetadata(0d, null, LowerValueCoerceValueCallback));
public static readonly DependencyProperty UpperValueProperty =
DependencyProperty.Register("UpperValue", typeof(double), typeof(DoubleThumbSlider), new UIPropertyMetadata(1d, null, UpperValueCoerceValueCallback));
public static readonly DependencyProperty MaximumProperty =
DependencyProperty.Register("Maximum", typeof(double), typeof(DoubleThumbSlider), new UIPropertyMetadata(1d));
public static readonly DependencyProperty IsSnapToTickEnabledProperty =
DependencyProperty.Register("IsSnapToTickEnabled", typeof(bool), typeof(DoubleThumbSlider), new UIPropertyMetadata(false));
public static readonly DependencyProperty TickFrequencyProperty =
DependencyProperty.Register("TickFrequency", typeof(double), typeof(DoubleThumbSlider), new UIPropertyMetadata(0.1d));
public static readonly DependencyProperty TickPlacementProperty =
DependencyProperty.Register("TickPlacement", typeof(TickPlacement), typeof(DoubleThumbSlider), new UIPropertyMetadata(TickPlacement.None));
public static readonly DependencyProperty TicksProperty =
DependencyProperty.Register("Ticks", typeof(DoubleCollection), typeof(DoubleThumbSlider), new UIPropertyMetadata(null));
public double Minimum
{
get { return (double)GetValue(MinimumProperty); }
set { SetValue(MinimumProperty, value); }
}
public double LowerValue
{
get { return (double)GetValue(LowerValueProperty); }
set { SetValue(LowerValueProperty, value); }
}
public double UpperValue
{
get { return (double)GetValue(UpperValueProperty); }
set { SetValue(UpperValueProperty, value); }
}
public double Maximum
{
get { return (double)GetValue(MaximumProperty); }
set { SetValue(MaximumProperty, value); }
}
public bool IsSnapToTickEnabled
{
get { return (bool)GetValue(IsSnapToTickEnabledProperty); }
set { SetValue(IsSnapToTickEnabledProperty, value); }
}
public double TickFrequency
{
get { return (double)GetValue(TickFrequencyProperty); }
set { SetValue(TickFrequencyProperty, value); }
}
public TickPlacement TickPlacement
{
get { return (TickPlacement)GetValue(TickPlacementProperty); }
set { SetValue(TickPlacementProperty, value); }
}
public DoubleCollection Ticks
{
get { return (DoubleCollection)GetValue(TicksProperty); }
set { SetValue(TicksProperty, value); }
}
Slider
组成
UserControl
的控件.所以我添加了两个
Slider
控件,将属性绑定(bind)到我的
UserControl
中的相应属性:
<Grid>
<Slider x:Name="lowerSlider"
VerticalAlignment="Center"
Minimum="{Binding ElementName=root, Path=Minimum}"
Maximum="{Binding ElementName=root, Path=Maximum}"
Value="{Binding ElementName=root, Path=LowerValue, Mode=TwoWay}"
IsSnapToTickEnabled="{Binding ElementName=root, Path=IsSnapToTickEnabled}"
TickFrequency="{Binding ElementName=root, Path=TickFrequency}"
TickPlacement="{Binding ElementName=root, Path=TickPlacement}"
Ticks="{Binding ElementName=root, Path=Ticks}"
/>
<Slider x:Name="upperSlider"
VerticalAlignment="Center"
Minimum="{Binding ElementName=root, Path=Minimum}"
Maximum="{Binding ElementName=root, Path=Maximum}"
Value="{Binding ElementName=root, Path=UpperValue, Mode=TwoWay}"
IsSnapToTickEnabled="{Binding ElementName=root, Path=IsSnapToTickEnabled}"
TickFrequency="{Binding ElementName=root, Path=TickFrequency}"
TickPlacement="{Binding ElementName=root, Path=TickPlacement}"
Ticks="{Binding ElementName=root, Path=Ticks}"
/>
</Grid>
UserControl
名称“root”,并在
Binding
中引用了该名称声明。大多数属性直接指向
UserControl
中的相同属性。 ,但当然是个人
Value
每个属性
Slider
控件映射到适当的
LowerValue
和
UpperValue
UserControl
的属性(property).
Slider
对象完全位于第一个之上,导致其轨道覆盖了第一个
Slider
拇指。这也不仅仅是视觉问题;第二个
Slider
位于顶部的对象接收所有鼠标点击,阻止第一个
Slider
从根本上调整。
UserControl
切换到“设计”模式Style
归因于
Slider
您的
UserControl
中的声明XAML,引用您刚刚创建的新样式。
Slider
控件实际上有两种主要的控件模板,一种用于水平方向,一种用于垂直方向。我将在这里描述水平模板的变化;我认为如何对垂直模板进行类似的更改是显而易见的。
Style
Slider
中的属性您的
UserControl
,单击样式名称并按 F12。这将带您进入主
Style
对象,您会在其中找到
Setter
对于水平模板(垂直模板由
Setter
中的
Trigger
控制,基于
Orientation
值)。单击水平模板的名称(我这样做时它是“SliderHorizontal”,但我想它可能会改变,当然对于其他类型的控件会有所不同)。
ControlTemplate
, 从不应使用的元素中删除所有视觉属性。这意味着删除一些元素,并删除
Background
,
BorderBrush
,
BorderThickness
,
Fill
等来自您无法完全删除的元素。就我而言,我删除了
RepeatButton
s 完全,并修改了我需要的其他元素,以便它们不显示或占用任何空间(因此它们不会收到鼠标点击)。我结束了这个:
<ControlTemplate x:Key="SliderHorizontal" TargetType="{x:Type Slider}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TickBar x:Name="TopTick" Fill="{TemplateBinding Foreground}" Height="4" Margin="0,0,0,2" Placement="Top" Grid.Row="0" Visibility="Collapsed"/>
<TickBar x:Name="BottomTick" Fill="{TemplateBinding Foreground}" Height="4" Margin="0,2,0,0" Placement="Bottom" Grid.Row="2" Visibility="Collapsed"/>
<Border x:Name="TrackBackground" Grid.Row="1" VerticalAlignment="center">
<Canvas>
<Rectangle x:Name="PART_SelectionRange" />
</Canvas>
</Border>
<Track x:Name="PART_Track" Grid.Row="1">
<Track.Thumb>
<Thumb x:Name="Thumb" Focusable="False" Height="18" OverridesDefaultStyle="True" Template="{StaticResource SliderThumbHorizontalDefault}" VerticalAlignment="Center" Width="11"/>
</Track.Thumb>
</Track>
</Grid>
</Border>
<!-- I left the ControlTemplate.Triggers element just as it was, no changes -->
</ControlTemplate>
Slider
不会改变。 IE。第二个滑块的样式被复制并硬编码到程序中,但该硬编码样式仍然取决于复制它的股票样式的布局。如果该股票样式发生变化,则第一个滑块的布局可能会发生变化,使第二个滑块不再对齐或以其他方式看起来不正确。
SliderHorizontal
模板,复制它和
Style
引用它,更改两者的名称,并更改
Style
的副本以便它引用复制的模板而不是原始模板。然后你只要修改副本,设置第一个
Slider
的样式到未修改
Style
,以及第二个
Slider
的样式到修改后的。
Slider
中一样工作。控件,拇指的中间是拇指值所在位置的指示器。这意味着当您将一个拇指拖动到另一个拇指时,它们会以第二个拇指在第一个拇指的顶部结束(即第一个拇指将无法拖动,直到您将第二个拇指移动到足以看到第一个拇指为止)。
关于带有两个拇指的 WPF slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395957/
如果滚动 Pane 的 View 组件足够大,则滚动条拇指很小,因此无法在 Windows L&F 上正确绘制。 这只是一个审美问题;滚动条功能正常,其他 L&F 似乎一切都很好。 有办法解决吗?也许
我对thumbor 很陌生,但我想知道是否可以使用我还不知道的特定选项来“放大”图像。 下面的简单示例: 到目前为止,我所理解的可能是,这可能意味着调整到特定区域的大小。但是我缺乏找到正确选项的经验(
我正在使用 Slider 控件来允许用户搜索视频流中的特定位置。我将 Slider 的 Value 属性绑定(bind)到 MediaElement 的 Position 属性。 我的问题是,当用户拖
我正在使用 nivo-slider,我正在尝试制作缩略图,但我无法让它工作。 这是我所拥有的: Nino Slider Demo Here is the tutorial on how to ,但我无
ASP .NET MVC3 购物车使用 Bootstrap 3。产品页面包含主图像和可变数量的缩略图。缩略图出现在单行 如果有很多缩略图,大白出现在它们的右边。 如何增强这种布局? 如何让拇指悬浮在购
我正在尝试使用 React 的样式化组件来设计 slider 样式,但我不知道如何设计拇指样式。我有一个看起来像这样的 CSS: .faderInput::-webkit-slider-thumb {
我正在尝试在单击 .thumb 时向 img 添加一个事件类。 我想做什么: 我得到的: $(document).ready(function() { $(".thumb").click(functi
Google 在这个问题上让我失望了。我正在研究是否可以更改 SeekBar 的 Pointer/Thumb 速度。示例:我将手指滑过屏幕一半,但指针只移动了四分之一。我的想法是在 OnStartTr
是否可以像在 UIKit 中使用 UISlider 那样在 SwiftUI 中更改 Slider 的缩略图?使用 UISlider,您所要做的就是:self.setThumbImage(UIImage
我的搜索栏有以下代码 seek_thumb 是一个名为 seek_thumb.9.png 的 9 补丁图像文件。无法识别此可绘制对象且未显示拇指的问题。但是,当我删除 .9 时。从文件名开始,然后我
我正在尝试找到一种灵活的跨浏览器解决方案来实现 png 图像作为我的范围输入的缩略图,因此我可以将其从这里转换: 对此: 在 chrome 中,css 标签“input[type=range]::-w
我想更改 JScrollBar 的外观。 我通过覆盖/扩展 ScrollBarUI 来做到这一点。 通过覆盖createIncreaseButton来改变箭头按钮的外观是没有问题的。和createDe
如何在 nimbus 中使用重击 slider 的默认箭头形状? 我设置了nimbus L&F,我的拇指形状是这样的圆形,但我想要一个像这样的三角形 。我怎样才能改变它或改回它的默认值(也就是说,没有
在一个应用程序中,我有一个包含数十个项目的 Spinner。 当用户点击微调器时,会出现一个弹出对话框,显示可能的选择列表。但是,由于有(排序的)数十个项目,我希望用户能够使用快速滚动拇指(如 Lis
当用户使用硬件音量按钮更改音量时,我希望我的 MPVolumeView Slider Thumb 将其自身动画化到该位置。我该怎么做? 最佳答案 创建一个 UIView mainVolumeSlide
如何使用 css 将图像设置为范围输入类型上的缩略图 slider ?它在 Internet Explorer 中不起作用。 Chrome 和 Firefox 没问题,但在 IE 上我的图像被隐藏了还
例如,LDR r0,[r1, #4]!,r1值将更改为r1+4然后加载值到r0,但是,当我尝试使用 LDR r0,[r1, r2]! 时,r1 没有改变。 我正在使用 TM4C123GH6PGE 和
我正在为我的网站创建一个范围 slider ,它需要在所有浏览器上看起来都一样。我现在在 IE 和 Edge 中遇到 slider 拇指大小的问题。我无法将拇指的高度增加到超过 slider 轨道 C
我是一名优秀的程序员,十分优秀!