【问题标题】:XAML: Toggleswitch reset stateXAML:切换开关重置状态
【发布时间】:2015-11-29 01:17:25
【问题描述】:

我想执行以下操作。我有一个 ToggleSwitch,它的 Toggled 事件处理程序执行一些操作。如果此操作失败,我想将 ToggleSwitch 的状态重置为原来的状态。

我通过这样做来实现这一点:toggleSwitch.IsOn = !toggleSwitch.IsOn;

我的问题是,如果操作总是失败,这会再次引发 Toggled 事件,从而导致无限循环。

这是我的完整代码示例

    private async void ToggleSwitch_Toggled(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        ToggleSwitch toggleSwitch = sender as ToggleSwitch;
        success = dummyService.performAction(toggleSwitch.IsOn); 
        if (!success )
        {
            //raise dialog to inform user here
            toggleSwitch.IsOn = !toggleSwitch.IsOn;
        }
    }

我知道这种行为已经在不同的应用程序中实现,因此实现这一点并不难。

【问题讨论】:

    标签: c# wpf xaml uwp toggleswitch


    【解决方案1】:

    您可以执行这样的操作来分离和重新附加您的事件:

    if (!success )
    {
        toggleSwitch.Toggled -= ToggleSwitch_Toggled;
        try
        {
          toggleSwitch.IsOn = !toggleSwitch.IsOn;
        }
        finally
        {
          toggleSwitch.Toggled += ToggleSwitch_Toggled;
        }
    }
    

    【讨论】:

    • 感谢您的建议,听起来很有希望,但 yourToggledEvent 到底是什么。
    • ToggleSwitch_ToggledyourToggledEvent。他让您取消订阅该活动,然后更改切换值并最终重新订阅。这将防止它再次触发。
    • 我不明白 - 我如何在 ToggleSwitch_Toggled 方法中获取事件?只有 params 对象 sender 和 RoutedEventArgs
    • ToggleSwitch_Toggled 是。我会更新我的答案,以便您更好地理解它。
    • 绝对是最好的方法。我来这里是为了给出完全相同的答案。从方法中取消订阅事件,更改属性,然后重新订阅 :)
    【解决方案2】:

    我假设您只想在toggleswitch 开启时执行该操作。如果是这种情况,那么你可以试试这个:

    private async void ToggleSwitch_Toggled(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            ToggleSwitch toggleSwitch = sender as ToggleSwitch;
    
            if(toggleSwitch == null || !toggleSwitch.IsOn)
              return;
            // You are missing your await statement....
            success = await dummyService.performAction(toggleSwitch.IsOn); 
            if (!success )
            {
                //raise dialog to inform user here
                toggleSwitch.IsOn = !toggleSwitch;
            }
        }
    

    【讨论】:

    • 感谢您的建议,但无论如何都应该执行我的操作
    • 那么 Giangregorio 的答案就是要走的路。
    • 事件应该返回 void 而不是 Task (这种情况很少见)。您是否尝试过构建代码?
    • @Romasz 你应该参考Async/Await -Best practices。我认为你做了同样的事情,但返回类型不是他们看起来的那样。
    • @Romasz 重读我自己的链接后,在这种情况下您似乎是正确的。事件处理程序应该有一个返回类型 void.... 我会更正它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2023-03-17
    相关资源
    最近更新 更多