【问题标题】:VS2010 for Windows Phone 7 & Blend crash with Mvvm-LightVS2010 for Windows Phone 7 & Blend 崩溃与 Mvvm-Light
【发布时间】:2010-09-08 07:46:16
【问题描述】:

这不是一个真正的问题,而是一个断言。发布此内容以便其他人可以避免此问题。

如果您使用 Mvvm-Light(可能还有其他 Mvvm 框架)并且您的 ViewModel 中的代码在 UI 线程以外的线程上运行,VS2010 和 Exression Blend 在尝试查看/编辑设计中的 XAML 时可能会崩溃模式。

例如,我有一个 CheckBox 绑定到由在后台线程上更新的对象实现的属性:

<CheckBox Content="Switch 1" 
          IsChecked="{Binding Switch1.PowerState, Mode=TwoWay}"
          Height="72" HorizontalAlignment="Left" Margin="24,233,0,0" 
          Name="checkBox1" VerticalAlignment="Top" Width="428" />

在 Switch 类(派生自 ViewModelBase)类中,我创建了一个计时器,它每 5 秒更改一次 PowerState 属性(从 true 变为 false 并再次返回)。

因为 VS2010/Blend 设计器在设计时运行我的代码,所以这段代码被调用并且计时器被触发。这两个应用程序都在我的计时器回调函数中崩溃了。

修复很简单:

请记住将您在设计时不想运行的任何代码包装在 IsInDesignMode 条件中。像这样。

    public OnOffSwitchClass()
    {
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
        }
        else
        {
            _timer = new System.Threading.Timer(TimerCB, this, TIMER_INTERVAL, TIMER_INTERVAL);
        }
    }

这为我解决了问题。希望对你有帮助。

【问题讨论】:

  • 要明确一点:这与 MVVM Light 没有直接关系,而是与 VS10 设计器和 Blend 在加载应用程序时运行代码这一事实有关。因为 MVVM Light 实现了可混合性(通过连接的方式),所以可能会发生这种情况。在这种情况下,可能需要将调试器附加到 Expression Blend(甚至 VS10 设计器)以查找问题的原因。

标签: silverlight visual-studio-2010 expression-blend windows-phone-7 mvvm-light


【解决方案1】:

您也可以使用DispatcherTimer 代替计时器。您会失去一点准确性,但另一方面,回调将在 UI 线程上调用,这可能会防止(或不会)崩溃。

【讨论】:

  • 安德烈亚斯:你当然是对的。但是,在此特定示例中使用 System.Threading.Timer 的目的是明确使用后台线程(此应用程序演示了如何在 WP7 应用程序中进行跨线程消息传递)。
  • 那么 DispatcherTimer 确实会失败。 :)
  • 想一想:PowerState 属性的值发生变化时会引发 PropertyChanged 吗?
  • 是的(在模型和视图模型中)。请参阅此问题,其中公开了我编写此示例的更多详细信息:stackoverflow.com/questions/3655422/…
  • 我想知道是否可以在 UI 线程之外引发 PropertyChanged 事件(这可能会对您遇到的崩溃提供一些见解),但查看您的代码并非如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多