locked
Toggle Switch 的 IsOn 属性 和 toggled 事件怎么分开? RRS feed

  • 问题

  • 调试的时候发现一个问题,只要执行 toggleSwitch.IsOn = bool 就会触发toggled 事件。代码如下:

    private void Toggled(object sender, RoutedEventArgs e) { if (switch.IsOn) { switch.IsOn = false; }

    else

    {

    switch.IsOn = true;

    } }

    执行的时候发现,只要点一下toggle switch,这段代码就会不停的循环。

    我想要的仅仅是switch的状态变成另一种,而不是触发toggled事件。

    我想知道怎么解决这个问题...谢谢!

    (toggled事件一定要保留...)

    2014年8月11日 15:56

答案

  • 我们需要一个标记来标识失败后的情况。

    bool IsSthFailed = false;
    private void switch_Toggled(object sender, RoutedEventArgs e)
    {
        if (!IsSthFailed)
        {
            if (ts.IsOn)
            {
                IsSthFailed = true;
                ts.IsOn = false;
                IsSthFailed = false;
            }
            else
            {
                IsSthFailed = true;
                ts.IsOn = true;
                IsSthFailed = false;
            }
        }
    }
    如上面代码所示,当IsOn属性被改变之前,我们把标记设置为true,这样Toggled事件就不会被重复触发了。

    而在IsOn属性改变之后,标记重置为false,这样下次Toggled动作就会被正确执行。


    希望我的答案能帮助更多的人。

    • 已建议为答案 shao.meng 2014年8月12日 6:59
    • 已标记为答案 lin010151 2014年8月12日 7:19
    2014年8月12日 4:51

全部回复

  • 你好。

    ToggleSwitch会在Toggled事件发生时自动切换 On/Off 状态,所以在代码中不需要为它设置IsOn属性。

    Toggled事件的解释就是:在 On/Off 状态为此 ToggleSwitch 更改时发生。

    去掉你的Toggled事件里关于设置IsOn属性的代码即可。


    希望我的答案能帮助更多的人。

    2014年8月12日 1:22
  • 还是会错我的意思了...

    或许我应该把代码写成这样...

    private void Toggled(object sender, RoutedEventArgs e) { if (switch.IsOn) { switch.IsOn = false;

    // 实际上这句不会执行 textblock.Text = "就是不让你知道我已经 开 了"; } else { switch.IsOn = true;

    // 实际上这句也不会执行 textblock.Text = "就是不让你知道我已经 关 了"; } }

    希望有人能懂...


    • 已编辑 lin010151 2014年8月12日 2:46 代码解释
    2014年8月12日 2:42
  • 我大概明白你的意思了,你是想让用户可以执行Toggle事件,但是ToggleSwitch控件的IsOn状态不变吗?

    IsOn状态是直接和ToggleSwitch控件的可用状态关联的,如果不想它的状态被用户改变,直接设置IsEnabled就可以了。


    希望我的答案能帮助更多的人。

    2014年8月12日 2:52
  • 还是不太对...toggle switch只要是在IsEnabled == true下,每点一次就会从On(Off)变成Off(On)。IsEnabled == false的时候完全没法触发toggled事件。

    假设有一个处于off状态的toggle switch,我点一次(手动触发toggled事件),在toggle switch变成了On的时候,后台在执行开启工作,但出于某些原因开启失败,toggle switch自动跳回Off状态(IsEnabled状态一直为true)。

    自动跳回Off那里出了问题...

    谢谢



    2014年8月12日 3:47
  • 我们需要一个标记来标识失败后的情况。

    bool IsSthFailed = false;
    private void switch_Toggled(object sender, RoutedEventArgs e)
    {
        if (!IsSthFailed)
        {
            if (ts.IsOn)
            {
                IsSthFailed = true;
                ts.IsOn = false;
                IsSthFailed = false;
            }
            else
            {
                IsSthFailed = true;
                ts.IsOn = true;
                IsSthFailed = false;
            }
        }
    }
    如上面代码所示,当IsOn属性被改变之前,我们把标记设置为true,这样Toggled事件就不会被重复触发了。

    而在IsOn属性改变之后,标记重置为false,这样下次Toggled动作就会被正确执行。


    希望我的答案能帮助更多的人。

    • 已建议为答案 shao.meng 2014年8月12日 6:59
    • 已标记为答案 lin010151 2014年8月12日 7:19
    2014年8月12日 4:51
  • 也许可以...我去试试

    谢谢你的耐心解答

    2014年8月12日 7:18