WPF:如何设置垂直滑块的动态数字范围?

2024-01-02

我目前正在处理一个 WPF MVVM 项目,该项目有一个由多个视图使用的用户控件,但具有不同的值范围。 这是我需要的一个例子。

正如您所看到的,控件必须根据我需要在滑块中显示的值以不同的行为做出响应(无论数字如何,这只是一个示例)。 问题之一是该项目是使用 MVVM 设计模式开发的,因此“代码隐藏”不应该是一个好的选择(但如果它解决了问题,对我来说就很好),所以我认为这可能是一个在 XAML 中做到这一点有点困难。

我之前展示的图片是通过在滑块旁边创建一个带有几个文本块的网格以静态方式完成的,但不可能保留此解决方案,因为我必须在需要时创建一个新的解决方案。 我想通过使用具有设定高度的 StackPanel 或 DockPanel 来启动解决方案...但如果您想一点,当您想显示两个值时,这不是一个好的选择,因为您需要为每个值指定垂直对齐值,这听起来不太好。

我认为唯一的方法是进行覆盖或允许滑块根据滑块的高度显示刻度...有没有办法做这样的事情?

我只是写了几行代码,但没有任何相关的内容,因为我不知道如何解决这个任务。我不需要代码,我需要想法。


我们一起工作,所以我将留下我们找到的解决方案,以防其他人感兴趣。

首先我们创建了 2 个类。

1) 一个继承自 SLIDER 的类,具有 2 个中间范围(图像中的绿色数字)的依赖属性,如下所示:

class NumberedSlider : System.Windows.Controls.Slider
    {
        public static readonly DependencyProperty RangeMinProperty = DependencyProperty.Register(
                 "RangeMinSlider", typeof(int), typeof(NumberedTickBar), new FrameworkPropertyMetadata(0));

        public int RangeMin
        {
            get { return (int)base.GetValue(RangeMinProperty); }
            set { base.SetValue(RangeMinProperty, value); }
        }

        public static readonly DependencyProperty RangeMaxProperty = DependencyProperty.Register(
                  "RangeMaxSlider", typeof(int), typeof(NumberedTickBar), new FrameworkPropertyMetadata(0));

        public int RangeMax
        {
            get { return (int)base.GetValue(RangeMaxProperty); }
            set { base.SetValue(RangeMaxProperty, value); }
        }
    }

2) 滑块 TickBar 的类,它将呈现数字:

public class NumberedTickBar : TickBar
    {
        public static readonly DependencyProperty RangeMinProperty = DependencyProperty.Register(
            "RangeMin", typeof (int), typeof (NumberedTickBar), new FrameworkPropertyMetadata(0));

        public int RangeMin
        {
            get { return (int) base.GetValue(RangeMinProperty); }
            set { base.SetValue(RangeMinProperty, value); }
        }

        public static readonly DependencyProperty RangeMaxProperty = DependencyProperty.Register(
            "RangeMax", typeof (int), typeof (NumberedTickBar), new FrameworkPropertyMetadata(0));

        public int RangeMax
        {
            get { return (int) base.GetValue(RangeMaxProperty); }
            set { base.SetValue(RangeMaxProperty, value); }
        }

        protected override void OnRender(DrawingContext dc)
        {
            Size size = new Size(base.ActualWidth, base.ActualHeight);

            int tickCount;

            if ((this.Maximum - this.Minimum)%this.TickFrequency == 0)
                tickCount = (int) ((this.Maximum - this.Minimum)/this.TickFrequency);
            else
                tickCount = (int) ((this.Maximum - this.Minimum)/this.TickFrequency) + 1;

            double tickFrequencySize = (size.Height*this.TickFrequency/(this.Maximum - this.Minimum));

            // Draw each tick text
            for (int i = 0; i <= tickCount; i++)
            {
                int value = Convert.ToInt32(this.Minimum + this.TickFrequency*i);

                string text = Convert.ToString(value, 10);
                FormattedText formattedText;
                if (value >= this.RangeMin && value <= this.RangeMax)
                    formattedText = new FormattedText(text, CultureInfo.GetCultureInfo("en-us"),
                                                      FlowDirection.LeftToRight, new Typeface("Arial Rounded MT Bold"), 16,
                                                      Brushes.Green);
                else
                    formattedText = new FormattedText(text, CultureInfo.GetCultureInfo("en-us"),
                                                      FlowDirection.LeftToRight, new Typeface("Arial Rounded MT Bold"), 16,
                                                      Brushes.DarkBlue);

                dc.DrawText(formattedText, new Point(30, (tickFrequencySize*(tickCount - i)-6)));
            }
        }
    }

然后我们替换了垂直滑块的控制模板上的刻度栏,如下例所示:

股票行情指示器上带有标签的垂直滑块 https://stackoverflow.com/questions/15391127/wpf-vertical-slider-with-labels-on-the-ticker

还添加了依赖属性的 2 个新值:

 <common:NumberedTickBar   Margin="0,0,0,10" x:Name="TopTick" 
                                      SnapsToDevicePixels="True" Placement="Left" 
                                      Fill="{StaticResource GlyphBrush}" Width="4" 
                                      RangeMax="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RangeMax}"
                                      RangeMin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RangeMin}"/>

最后,在用户控件的 xaml 中,我们有一些如下代码:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50*"/>
            <ColumnDefinition Width="50*"/>
        </Grid.ColumnDefinitions>
        <Grid>
            <common:NumberedSlider x:Name="SliderValue" MinHeight="180" Margin="5 15 5 15" Orientation="Vertical" 
                                   Maximum="89" 
                                   Minimum="77" 
                                   Value="{Binding BarValue, Mode=TwoWay}"  
                                   TickFrequency="1" 
                                   IsSnapToTickEnabled="True" 
                                   RangeMin="82" 
                                   RangeMax="85"
                                   IsEnabled="{Binding SliderEnabled}"/>
        </Grid>
        <Grid Grid.Column="1">
            <ProgressBar Orientation="Vertical" Width="70" 
                         Minimum="{Binding ElementName=SliderValue,Path=Minimum}" 
                         Maximum="{Binding ElementName=SliderValue,Path=Maximum}" 
                         Value="{Binding ElementName=SliderValue, Path=Value}" Margin="0 14" Background="Gray" MinHeight="200"
                         Foreground="{Binding ColorBar, Converter= {StaticResource setSteelPointLevelConverter}}"                          />
        </Grid>
    </Grid>

希望这种方法可以帮助其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF:如何设置垂直滑块的动态数字范围? 的相关文章

  • 检查 Active Directory 帐户是否被锁定 (WPF C#)

    大家好 这是我的第一篇文章 我有一些从 Codeplex 中提取的简单 AD 代码http www codeproject com Articles 18102 Howto Almost Everything In Active Direc
  • 时间:2019-03-17 标签:c#datagridsqlpopulation

    我正在使用一个小型应用程序 用户可以在其中从 SQL 检索特定数据并用数据填充数据网格 用户可以从 SQL 数据库检索数据 在文本框中写入条形码 然后就会出现他搜索的数据 到目前为止我使用了这段代码 try if e Key Key Ent
  • MVVM 中模型的职责是什么?

    我一直对 模型 应该或不应该包含什么感到有点困惑 教程和示例经常相互矛盾 到目前为止 我一直在谨慎行事 我的模型只暴露 UI 内容 例如用于绑定到视图的属性以及验证逻辑 但是模型中包含其他业务逻辑是否可以接受 假设我想通过网络服务控制机械泵
  • StockTrader RI > 控制器、演示者,WTF?

    我目前正在学习如何通过 Prism 复合 WPF 项目高级使用 WPF 我观看了很多视频和示例 演示应用程序 StockTraderRI 让我提出了这个问题 以下各部分的具体作用是什么 SomethingService 好的 这是管理数据的
  • 在wpf中快速生成ViewModel属性?

    看完之后本文 http msdn microsoft com en us magazine dd419663 aspx a 在我的中有以下代码PersonViewModel class public Jurisdiction Country
  • WPF DataGrid 双向绑定

    我有财产UserSet其中包含来自ObservableCollection
  • 如何将启动时窗口的位置定位到用户屏幕的右侧?

    我目前正在用 C 创建一个类似侧边栏的 WPF 应用程序 当用户启动应用程序时 我希望窗口自动将其自身定位到用户屏幕的一侧 我尝试了一些方法和谷歌搜索 但没有找到任何帮助 这是我正在尝试做的事情的一个例子 http prntscr com
  • WPF:名称空间中不存在该名称[重复]

    这个问题在这里已经有答案了 我正在使用 VS2013 构建 C WPF 应用程序 并且具有以下类定义 在正在运行的应用程序的同一程序集中 namespace MyNamespace public class MyKey public MyK
  • “该类型不包含任何可访问的构造函数” - 具有无参数构造函数

    我正在尝试加载一个类作为静态资源
  • 范围输入拇指随着时间的推移而偏移

    我查遍了 Stackoverflow 似乎所有带有拇指标签的范围滑块都有这个问题 例如 这个答案 https stackoverflow com a 35419875几乎没有 但仍然有 基本上你可以计算value max得到left范围值标
  • 给 MVVM 中的 View 一些命令

    假设我有一些用户控制权 用户控件有一些子窗口 用户控制用户想要关闭某种类型的子窗口 用户控制代码后面有一个方法 public void CloseChildWindows ChildWindowType type 但我无法调用此方法 因为我
  • CanExecute 何时被调用?

    在演示中 我有一个按钮可以切换布尔字段isAsking 我创建了一个命令 该命令仅在以下情况下执行isAsking true 一旦我按下切换按钮 okButton IsEnable立即更改 这表明该命令发现了更改isAsking 我感到很困
  • 打印 WPF 位图图像

    打印位图图像的最佳方法是什么 我有 System Drawing 背景 所以我正在考虑将其转换为位图 然后打印它 但我认为可能有更好的方法 Thanks 根据 Drew 的回答 最好测量并安排传递给 PrintVisual 方法的容器 这将
  • wpf自定义控件:另一个矩形内的可拖动/可调整大小的矩形

    我正在研究一个带有两个矩形的控件 一个在另一个矩形内 我希望用户能够拖动内部矩形 调整其大小 如果可能的话 也可以在外部矩形的边界内旋转它 这些值应该是可绑定的 以便我可以在更新时将这些值存储在我的数据源中 是否已经有这样的控件或者有人有任
  • 文本框的自定义日期格式

    有关的 将3个文本框绑定在一起 相同的日期时间不同的格式 https stackoverflow com questions 35581427 binding 3 textboxes together same datetime diffe
  • 如何在 WPF 中更改按钮 MouseOver 的背景?

    我的页面上有一个带有以下 XAML 的按钮
  • 绑定到后面代码中的相对源

    在我的 UserControl 中 我的 XAML 中有以下代码
  • IPython笔记本交互功能:如何设置滑块范围

    我在 Ipython 笔记本中编写了下面的代码 生成一个由参数 a 控制的 sigmoid 函数 a 定义了 sigmoid 中心的位置 b 定义了其宽度 matplotlib inline import numpy as np impor
  • 如何检查应用程序的另一个实例是否正在运行[重复]

    这个问题在这里已经有答案了 有人可以展示如何检查程序的另一个实例 例如 test exe 是否正在运行 如果是 则停止加载应用程序 如果存在该实例 想要一些严肃的代码吗 这里是 var exists System Diagnostics P
  • 如何让窗口最大化时所有控件按比例调整大小?

    当我单击最大化按钮时 窗口最大化 但控件未按比例调整大小 使控件相应调整大小的最佳方法是什么 我正在使用MVVM 这是我的代码

随机推荐

  • Laravel 4-重定向到 javascript 代码 Blade 模板内的路由

    我正在尝试使用 javascript 和 Blade 引擎编写一个简单的重定向 这是我想要做的一个示例 JavaScript 代码 p Click the button to go to the home page p
  • 如何加快 Pandas 中最近的搜索速度(也许通过矢量化代码)

    我有两个数据框 每个都包含位置 X Y 和该点的值 对于第一个数据框中的每个点 我想找到第二个数据框中最接近的点 然后找到差异 我的代码可以工作 但它使用 for 循环 速度很慢 关于如何加快速度有什么建议吗 我知道为了性能而摆脱 pand
  • 如何解读Windows任务管理器?

    我运行的是 Windows 7 RC1 它使用与 Vista 相同的 WTM 当我查看流程时 有一些列我不确定有什么区别 内存 工作集 内存 私有工作集 内存 提交大小 谁能告诉我它们是什么 从以下article http cybernet
  • Minimagick 上传期间出现错误“composite -compose Over -gravity North”

    我正在尝试通过以下方式上传图像gem carrierwave gt 1 1 0 and gem mini magick gt 4 7 0 上传图像 我收到这个错误 我正在使用此代码上传图像 MiniMagick Tool Convert n
  • Firefox 与 contextmenu 事件同时触发 click 事件

    接下来的代码记录窗口对象上触发的事件 FIDDLE https jsfiddle net Makha92 kh8roneh 1 var logEvent function var count 1 timer 0 buffer functio
  • 当我在java中加载excel时出现错误

    我正在尝试用 java 读取一个简单的 xlsx private void readExcelData String excel throws Exception FileInputStream file new FileInputStre
  • PayPal REST API 交叉参考交易与付款

    我已成功使用 REST PHP API 完成了 PayPal 付款 但是 我想知道如何将 REST 交易与 PayPal Web 用户界面交叉引用 在 REST 方面 我有付款 ID getID 在交易被批准之前收到 看起来像 PAY 5B
  • Cocos 2d-x 中带有贝塞尔曲线的圆角矩形

    是否可以使用 DrawNode 对象绘制一个圆角矩形 我认为使用贝塞尔曲线是可能的 但我做了一些尝试 但我认为我无法处理它 查看 API 我只发现这两个函数 绘制四边形贝塞尔曲线 const Vec2 origin const Vec2 c
  • RTSP 身份验证:摘要问题

    我需要向流媒体服务器验证我的 RTSP 流 挑战如下 RTSP 1 0 401 Unauthorized WWW Authenticate Digest realm Streaming Server nonce 76bfe6986d3e76
  • 如何使用 Open CV 检测哈欠

    我正在开发一个 iOS 应用程序 需要检测用户何时打哈欠 我所做的是包括 Open CV 并使用 Haar Cascade 查找面孔 然后在面孔内查找嘴巴 也使用 HaarCascade 我遇到的麻烦是 我相信像做 face y mouth
  • UWP 共享功能在 Windows 10 Mobile 中不起作用

    我使用一个按钮创建了一个非常简单的 UWP 应用程序 点击它应该显示内置的共享弹出窗口分享一个PDF file 事实上 我让它适用于 Windows 10 桌面 但不适用于移动设备 弹出窗口不会出现在屏幕上 PDF 文件以字节数组形式出现
  • 保存某个范围内的所有信息并稍后恢复

    有没有办法将字体分配给范围 假设我有一个对象 myFont 我可以写 with Range A1 Font Bold myFont Bold Size myFont Size same with other properties end w
  • 如何通过滚动更改导航栏背景?

    我是网络开发新手 对于我的一个项目 我想在用户滚动时更改导航栏的背景 我希望它看起来像这样 https www nlogic co understanding vlan hopping attacks https www nlogic co
  • Java 问题中的暴力数独求解器算法

    除了求解方法之外 算法中的一切似乎都运行良好 当它使用可解数独板执行程序时 它会说无法解决 我已经尝试了解决方法中我能想到的一切 我尝试过调试 但在测试第一行后失败 有什么建议么 这是到目前为止的完整代码 public class Sudo
  • 我应该如何对具有许多子功能的功能进行单元测试?

    我希望更好地理解我应该测试具有许多子步骤或子功能的函数 假设我有以下功能 Modify the state of class somehow public void DoSomething DoSomethingA DoSomethingB
  • Visual Studio 的 .vsmdi 文件有多重要?

    这是场景 用户 A 已通过 Visual Studio 2010 创建了单元测试 测试项目和单元测试源代码已签入版本控制 用户B 从版本控制中获取测试项目和单元测试源代码 然后 用户 B 打开测试项目并收到一条消息 加载 blah blah
  • 如何正确使用同步链接哈希图

    尝试通过子类化链接哈希映射来制作 lru 映射 地图通过 collections synchronized 运行 映射的所有用法都被同步块包围 如果它们全部被删除 单元测试也会失败 人们可能会认为它们是不必要的 因为地图是通过 collec
  • “react-router”不包含名为“BrowserRouter”的导出

    我正在使用 React router 版本 5 5 1 并尝试在我的index js file src index js 14 8 21 react router does not contain an export named Brows
  • 如何从 Linux 与 SDL 2 对 Windows 进行交叉编译

    我尝试在 Arch Linux 64 位 上使用 SDL 2 和 mingw w64 g 编译器编译一个简单的 C 程序 为此 我从以下位置下载了 SDL2 devel 2 0 4 mingw tar gzhere https www li
  • WPF:如何设置垂直滑块的动态数字范围?

    我目前正在处理一个 WPF MVVM 项目 该项目有一个由多个视图使用的用户控件 但具有不同的值范围 这是我需要的一个例子 正如您所看到的 控件必须根据我需要在滑块中显示的值以不同的行为做出响应 无论数字如何 这只是一个示例 问题之一是该项