【问题标题】:Xamarin.Forms - How was slider ValueChanged event raised?Xamarin.Forms - 如何引发滑块 ValueChanged 事件?
【发布时间】:2017-01-23 21:48:01
【问题描述】:

有没有一种有效的方法来确定 Xamarin.Forms.ValueChangedEventArgs 事件是由用户输入还是由程序更新引发的?

我在 XAML 中创建了一个滑块,我需要确保事件处理程序中的代码仅在滑块的值被用户更改时才执行,如果值以编程方式更改则不执行任何操作。

基本上,我正在寻找与 Xamarin.Android 中的 SeekBar.ProgressChangedEventArgs.FromUser 属性等效的 Xamarin.Forms。

有什么想法吗?谢谢!

【问题讨论】:

  • 程序启动时是否在任何地方初始化值?也许这就是引发事件的原因。您可以在事件处理程序中放置一个断点,然后检查调用堆栈以查看更改的来源。
  • @ChrisDunaway 我有意在不同点以编程方式更改滑块的值,但我希望事件处理程序忽略这些。事件处理程序仅应在用户通过手动滑动更改滑块时做出响应。
  • 我知道的唯一方法是在您以编程方式更改它们之前设置一个布尔值,然后检查事件处理程序中的布尔值。
  • 我想过这个问题,但我不确定在这种情况下它对我的效果如何,因为滑块实际上是我正在构建的音频播放器的进度条。它的值每秒以编程方式更新,但用户仍然需要能够移动滑块以寻找音频的不同部分。
  • 您使用 ValueChangedEventArgs 的事实告诉我您没有进行正确的数据绑定,这就是您首先遇到此问题的原因。即使您没有使用正确的 MVVM,您仍然可以将您的视图对象绑定到类似视图模型的数据结构中的字段,此时您可以确切地知道您是否手动更改了它。

标签: c# event-handling xamarin.forms


【解决方案1】:

MVVM 的重点是滑块绑定的属性应该代表滑块位置,仅此而已。就您的视图模型逻辑代码的其余部分而言,滑块属性 IS 是滑块。您不会为了确定从何处设置其值而对整个控件进行子类化,因为该逻辑在使用您的控件的代码中更容易执行。 MVVM 没有什么不同,即将这种逻辑放在视图控件绑定的属性中会破坏模式,因为该属性应该与控件属性具有 1:1 的关系。

从您的描述看来,您正在尝试做这样的事情:

public int SliderPos
{
    set
    {
        if (valueChangedManually()) // <-- magic function
            ManualChangeFunction();
    }
    // ... etc ...
}

void ChangeSliderPosManually()
{
    SliderPos = 100;
}

如果是这样,那么您需要改为这样做:

public int SliderPos
{
    set
    // ... etc ...
}

void ChangeSliderPosManually()
{
    ManualChangeFunction();
    SliderPos = 100;
}

结果相同,但逻辑由调用代码处理。如果在任何时候 SliderPos 的值自发改变并且您没有调用 ManualChangeFunction,那么您知道它一定是由滑块控件触发的。

如果您确实需要知道何时更改是滑块与代码的结果,那么可以将行为添加到控件本身,将通知发送回您的视图模型层,但这会有点复杂并且在在我开发 MVVM 的 10 年左右的时间里,我想不出有一次我见过真正需要这样做。

【讨论】:

    【解决方案2】:

    虽然这是一篇旧文章,但它仍然具有相关性。原因是我最近开发了一个音乐播放器应用程序。当我使用 Xamarin.Forms slider 时,它会引发 ValueChanged 事件,无论值是由 User 还是 programmatically 手动更改的。

    解决方案是使用xamarin-range-slider。 Nuget 可用于 xamarin 表单以及本机项目。它有事件UpperValueChangedLowerValueChanged。当User 拖动滑块时会引发这些事件。他们没有触发滑块值的编程更改。

    【讨论】:

      猜你喜欢
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多