.net 如何在MAUI中实现用鼠标滚轮改变滑块值?

wlwcrazw  于 2023-11-20  发布在  .NET
关注(0)|答案(2)|浏览(159)

其实问题就在标题里。
WPF solution不适合(或者我还没有想出如何适应它),我找不到任何其他具体的东西。
来自here的解决方案也无法调整,因为Microsoft.Maui.Platform.MauiSlider未转换为Microsoft.Maui. Platform.ContentPanel。

piv4azn7

piv4azn71#

基于尊敬的张丽云的回答,我为几个滑块元素形成了一个解决方案:

  1. public MainPage()
  2. {
  3. InitializeComponent();
  4. Microsoft.Maui.Handlers.SliderHandler.Mapper.AppendToMapping(nameof(Slider), (handler, view) =>
  5. {
  6. #if WINDOWS
  7. Microsoft.UI.Xaml.Controls.Slider? winSlider = view.Handler?.PlatformView as Microsoft.UI.Xaml.Controls.Slider;
  8. if (winSlider != null)
  9. {
  10. winSlider.PointerWheelChanged += (s, e) =>
  11. {
  12. int step = 1;
  13. switch(handler)
  14. {
  15. case slider1.Handler:
  16. step = 2; //here you can replace a fixed value with a field or property
  17. break;
  18. case slider2.Handler;
  19. step = 4; //here you can replace a fixed value with a field or property
  20. break;
  21. }
  22. view.Value += e.GetCurrentPoint(winSlider).Properties.MouseWheelDelta / 120 * step;
  23. };
  24. }
  25. #endif
  26. });
  27. }

字符串
其中slider1和slider1元素在XAML布局中声明为(示例):

  1. <Slider x:Name="slider1"/>
  2. <Slider x:Name="slider2"/>

展开查看全部
xj3cbfub

xj3cbfub2#

对于窗口,您可以为滑块添加PointerWheelChanged事件。将以下代码放入App的构造函数中:

  1. public App()
  2. {
  3. InitializeComponent();
  4. MainPage = new AppShell();
  5. Microsoft.Maui.Handlers.SliderHandler.Mapper.AppendToMapping(nameof(Slider), (handler, view) =>
  6. {
  7. #if WINDOWS
  8. var winslider = view.Handler.PlatformView as Microsoft.UI.Xaml.Controls.Slider;
  9. winslider.PointerWheelChanged += (s,e) =>
  10. {
  11. if (e.GetCurrentPoint(winslider).Properties.MouseWheelDelta>0)
  12. {
  13. view.Value++;
  14. }
  15. else
  16. {
  17. view.Value--;
  18. }
  19. };
  20. #endif
  21. });
  22. }

字符串
xaml中的滑块是:<Slider Minimum="0" Maximum="100"/>
但我找不到解决mac问题的办法。

更新:

如果你只想为一个特殊的Slider做这件事。你可以从App的构造函数中删除上面的代码。然后使用它:
在xaml中:

  1. <Slider Minimum="0" Maximum="100" x:Name="slider"/>


在Page的OnHandlerChanged方法中:

  1. protected override void OnHandlerChanged()
  2. {
  3. base.OnHandlerChanged();
  4. #if WINDOWS
  5. var winslider = slider.Handler.PlatformView as Microsoft.UI.Xaml.Controls.Slider;
  6. winslider.PointerWheelChanged += (s,e) =>
  7. {
  8. if (e.GetCurrentPoint(winslider).Properties.MouseWheelDelta>0)
  9. {
  10. slider.Value++;
  11. }
  12. else
  13. {
  14. slider.Value--;
  15. }
  16. };
  17. #endif
  18. }


这只适用于x:Name="slider"

展开查看全部

相关问题