在Visual Studio社区2017中找不到类型ObservableDictionary

时间:2017-05-15 01:05:12

标签: c# visual-studio xaml

在包含以下代码的Visual Studio社区MainPage.xaml.cs文件中:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Xaml.Media.Animation;
using System.Collections.ObjectModel;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace App2
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        Random random = new Random();
        ///private NavigationHelper navigationHelper; ///not needed in Visual Studio 2017
        private ObservableDictionary defaultViewModel = new ObservableDictionary();
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void startButton_Click(object sender, RoutedEventArgs e)
        {
            AddEnemy();
        }

        private void AddEnemy()
        {
            ContentControl enemy = new ContentControl();
            enemy.Template = Resources["EnemyTemplate"] as ControlTemplate;
            AnimateEnemy(enemy, 0, playArea.ActualWidth - 100, "(Canvas.Left)");
            AnimateEnemy(enemy, random.Next((int)playArea.ActualHeight - 100), random.Next((int)playArea.ActualHeight - 100), "(Canvas.Top)");
            playArea.Children.Add(enemy);
        }

        private void AnimateEnemy(ContentControl enemy, double from, double to, string propertyToAnimate)
        {
            Storyboard storyboard = new Storyboard() { AutoReverse = true, RepeatBehavior = RepeatBehavior.Forever };
            DoubleAnimation animation = new DoubleAnimation()
            {
                From = from,
                To = to,
                Duration = new Duration(TimeSpan.FromSeconds(random.Next(4, 6)))
            };

            Storyboard.SetTarget(animation, enemy);
            Storyboard.SetTargetProperty(animation, propertyToAnimate);
            storyboard.Children.Add(animation);
            storyboard.Begin();
        }
    }
}

......行

private ObservableDictionary defaultViewModel = new ObservableDictionary();

生成以下错误消息:

Error   CS0246  The type or namespace name 'ObservableDictionary' could not 
be found (are you missing a using directive or an assembly reference?)

我应该包含什么库才能使此错误消息消失?

1 个答案:

答案 0 :(得分:0)

我知道这个问题太旧了,但是Head First C#使用了一个Common文件夹,其中包含此ReadMe:

  

Common目录包含可简化应用程序开发的类和XAML样式。

     

这些不仅方便,而且大多数Visual都需要   Studio项目和项目模板。如果您需要其中一种的变体   StandardStyles中的样式,建议您在   您自己的资源字典。右键单击样式控件时   在设计图面中,上下文菜单包括用于编辑   复制以简化此过程。

     

Common目录中的类构成项目的一部分,并且可能是   进一步增强以满足您的需求。何时应注意   更改现有方法和属性,因为更改不兼容   要求对包含在各种Visual中的代码进行相应的更改   Studio模板。例如,其他页面添加到您的项目   编写时假设其中的原始方法和属性   通用类仍然存在,并且类型名称具有   不变。

在VS2013解决方案的common文件夹中(也有一个VS2012,具有完全不同的类),这些是cs文件: enter image description here

要使用这些类,您必须添加:

using Save_the_Humans.Common;

HFC#从未在书中引用或提及这些类别。我假设它们当时是样板代码。他们包装了一些接口和字典:

public class ObservableDictionary : IObservableMap<string, object>
{
    private class ObservableDictionaryChangedEventArgs : IMapChangedEventArgs<string>
    {
        public ObservableDictionaryChangedEventArgs(CollectionChange change, string key)
        {
            this.CollectionChange = change;
            this.Key = key;
        }

        public CollectionChange CollectionChange { get; private set; }
        public string Key { get; private set; }

...

您也可以从带有them的VS2012版本或从我的repository的仅VS2013版本获得C#代码-不仅是公用文件夹-;从他们的存储库中,您无法打开或导入VS2017-至少我不能;我的是用VS2017制作的。

希望它可以帮助某人。