Quantcast
Channel: Category Name
Viewing all 10804 articles
Browse latest View live

Find and save for later on Bing

$
0
0


One of the great things about search is that you have the world of information at your fingertips. Yet you don’t always have time to explore everything you find right at the moment you discover it. Now, with the new My Saves search capability offered on Bing, you can easily stash video, images and shopping searches you find while using Bing, and view them later on your PC or mobile device, as long as you’re signed in.



Let’s take the upcoming Thanksgiving holiday as an example. Today, searching for the ‘best ways to cook a turkey’ on Bing turns up several video search results to choose from. With the new My Saves searching feature, you can save where you found them by hovering on the video result and clicking ‘Save.’ Then decide later which will be the crowd pleaser. This action saves that searched item to ’My Saves’ where you can come back and view it later when it’s convenient for you.


 
The same feature exists for image search. For example, use Bing’s image search for holiday place setting ideas and save the results you like.  You can then go to the image source to research prices, purchase the item or, when you’re at the store for the item, use the image to get to the web source and ensure you get the right item.


 
Finally, an area we’re especially excited about is shopping. Let’s say you look for an adorable 'Thanksgiving decorations' in image search. For shopping searches, you’ll see a blue banner above images that reads, ‘See shopping results’. Clicking on this will filter your results to images of products you can purchase. You can save your favorite search results and access them from ‘My Saves’ at a later time so you don’t feel pressured to make a purchase on the fly. Once your decision is made and you no longer need a saved item, you can easily delete the relevant searched products.
 


 
We're focused on delivering an experience where you can easily search, find and save search results across all your devices. We hope you enjoy this new feature on Bing and look forward to hearing your thoughts.  If you have other ideas for how we can make your search, find and save experience even better, go to Bing Listens and share your thoughts. Please note, the features may not be released in all markets yet.
 
- The Bing Team


 
 

Visual Studio Tools for Unity 3 Preview

$
0
0

Today at Connect() we announced the release of the Visual Studio Tools for Unity 3 Preview. VSTU is Microsoft’s free Visual Studio add-on that enables a rich programming and debugging experience for working with the Unity gaming tools and platform.

VSTU 3 Preview is part of the «Game Development with Unity» workload that you can install from the Visual Studio 2017 RC installer. With this workload, Unity developers can install just what they need to write and debug cross-platform Unity games with Visual Studio 2017 RC.

VSTU 3 Preview is also available for Visual Studio 2015 Update 3 on the Visual Studio Gallery at the following link:

VSTU 3 focuses on improving on the fundamentals of an IDE: code editing and debugging. The highlights of this release include:

Code Coloration for Unity messages: Unity messages (or event functions) now stand out from other methods in the editor. By default, they’ll be colored like keywords, but you can change them to your liking. In this screenshot they’re configured to be colored in bright orange.

IntelliSense: VSTU 3 Preview plugs into Visual Studio’s C# IntelliSense engine to provide code completion for Unity messages. Just start declaring a method, and if you’re in a class that supports Unity messages, our IntelliSense will kick-in and show you the list of Unity messages your script can implement.

Improved Expression Evaluator: The expression evaluator is responsible for displaying the values of the Locals and the results of the expressions you input into the Watch and Immediate Window. We’ve improved our expression evaluator to behave closer to the .NET debugger that C# developers know and love.

If you have any suggestion or encounter any issue with VSTU 3 Preview, please report it via Report a Problem either from the installer or the Visual Studio IDE itself. Track your feedback on the developer community portal. For suggestions, let us know through UserVoice. Please share your feedback and help us ship a great VSTU 3!

Jb Evain, Principal Software Engineer Manager
@jbevain

Jb runs the Visual Studio Tools for Unity experience He has a passion for developer tools and programming languages, and has been working in developer technologies for over a decade.

Whats’s new for iOS and Android developers using JavaScript?

$
0
0

With the release of Visual Studio 2017 RC this week, we’re introducing you to the latest and greatest release of the Visual Studio Tools for Apache Cordova (TACO). In this release, we’re tackling the big problems – the issues we know you face every day as mobile developers. They fall into two major themes:

  1. Fast, reliable builds. The new Visual Studio Installer, combined with offline installation of a fully validated toolchain of 3rd party components, provides for faster builds that are also easier to troubleshoot and fix.
  2. Incredible edit-debug speed. A new browser-based simulator enables you to code fast and see the results immediately in the browser. Live reload, plugin simulation and support for Ionic Framework give VS the fastest developer workflow on the market.

Fast, reliable builds

When we talk with Cordova developers, by far the most common issues are around environment setup and building applications. This makes sense, because building is what Cordova is all about – i.e. building a native application using the native target platform SDKs. Our data indicate that 26% of developers using TACO encounter an error during their first build due mostly to issues with NPM and network firewalls. In this release, we set out to fix that.

A fast install that just works

With the new Visual Studio Installer, we created a Mobile development with JavaScript workload that is designed to give you a quick install that “just works.”

For this workload, we trimmed the total number of toolchain dependencies and applied an extra layer of testing. Using our new validated “toolsets”, mobile developers get all the components required for pre-release development – including open source packages like Cordova – so even those of you who require offline installation are good-to-go! In early trials, most developers could go from “download” to “code” within 15 minutes.

As your app moves from prototype to production, Visual Studio will prompt you to install any missing dependencies. For example, if you’re missing the Android SDK when you try to deploy to a device, Visual Studio will offer to grab it for you. Isn’t that nice? This lets you start simple and progressively install more complex toolchain dependencies as your app grows.

Toolsets

In addition to streamlining installation, we’ve worked hard to make sure builds are reliable in a wide variety of environments. Most build issues reported to us are related to a combination of npm failures, network firewalls and incompatibilities in the local toolchain. To help you get (and stay) on the right track, we’re introducing the concept of TACO “Toolsets.” A Toolset combines a set of validated tools into a single package which can be used by Visual Studio. For example, the default Cordova 6.3.1 toolset includes Cordova 6.3.1, Node 4.4.3, and NPM 2.15.0. Regardless of what else is installed on your computer, TACO will use a sandboxed toolset when building your application. By using a known combination of tools, you can be confident that builds will work as expected. If you’re more of an independent tinkerer, there’s also an option to use the Global instance of any toolchain dependency, so you maintain total control.

To configure the toolset your project will use, open config.xml and go to the Toolset section of the editor. Toolsets are built, maintained and distributed by Microsoft. Our team will release new toolsets shortly after new versions of iOS, Android and Windows become available, so make sure to check Visual Studio for updates often.

Making it easier to understand build errors

Finally, to help troubleshoot build errors when they happen, we’ve made a small and important change to make it easier to wade through build output. We’ve color-coded errors in the build output pane for easier reading and have added headers to call out steps in the build output to help you identify where in the build process there was a failure.

Beyond being helpful, it’s also a fun excuse to use some ASCII art.

Incredible edit-debug speed

This release introduces to Visual Studio a popular feature from our Visual Studio Code Cordova Tools extension: Cordova Simulate. For those that have been using TACO for a while, Cordova Simulate replaces the Ripple emulator that we have been using for in-browser simulation of mobile apps. It provides for a local, fast, browser-based workflow that fits with modern web developer practices that lets you do almost all your mobile development without touching an emulator or device.

Like Ripple, Cordova Simulate will empower you to:

  • Test at varying devices sizes.
  • Simulate geolocation, compass, and accelerometer settings.
  • Live reload for images, stylesheets, JavaScript, and HTML.
  • Use browser developer tools like a DOM explorer and JavaScript debugger, all from within Visual Studio.

Going beyond Ripple, Cordova Simulate then lets you:

  • Simulate even more plugins like Camera, Contacts, File, Media, and more (see the documentation for details).
  • Simulate your app in a dedicated browser window rather than an iframe.
  • Save API responses for custom or uncommon plugins.

Look for an upcoming deep-dive post on this blog which will take you through all the details of this new tool.

Try out Visual Studio 2017 RC and let us know what you think

Beyond the features highlighted here, we’ve also fixed numerous bugs in the product and re-written the build process to increase stability and decrease heavy build times. If you’re interested in trying out Cordova to build mobile apps, please try out this release and let us know what you think!

As you work with the tools, share your thoughts: send us direct emails, talk with us on Stack Overflow, send us a tweet on Twitter, or provide feedback for our documentation directly on our documentation site.

To get updates about future pre-release software, consider joining our TACO insiders, we’d love to work with you.

Jordan Matthiesen (@JMatthiesen)
Program Manager, JavaScript mobile developer tools
Jordan works at Microsoft on JavaScript tooling for web and mobile application developers. He’s been a developer for over 18 years, and currently focuses on talking to as many awesome mobile developers as possible. When not working on dev tools, you’ll find him enjoying quality time with his wife, 4 kids, dog, cat, and a cup of coffee.

Azure App Services Continuous Delivery

$
0
0

We are continuously working on improving and simplifying the deployment experience to Azure from Visual Studio Team Services. As a part of that effort, we are excited to announce preview of the Continuous Delivery feature we have added for App Services in the Azure portal.

Continuous Delivery simplifies setting up a robust deployment pipeline, you can setup a pipeline right from the Azure portal that builds, runs tests, and deploys to staging slot and then to production for every code commit/batch of code commits.

Later, you can easily extend this deployment automation to handle any other operations your application nee ds to do during deployment. For example, provision additional Azure resources, run custom scripts, or upgrading database. You can even choose to deploy automatically or setup manual approval for any deployment going to production.

You can start using this feature by navigating to your app’s menu blade in the Azure portal and clicking on APP DEPLOYMENT > Continuous Delivery (Preview).

azure-cd-entry-point

Setting up continuous delivery is a four-step wizard. In the first two steps, we ask you to choose the source code repository and fill in the framework details. This helps us build and package the application for deployment. Currently we are supporting Visual Studio Team Services and Github as source repositories and we have plans to expand this list. Similarly on the application types we are starting with ASP.NET and ASP.NET core and we will enhance to other web applications as well.

azure-cd-source-blade

The last two steps are optional and you can choose to opt in for setting up a load test and staging environment.

If you choose to setup a load test environment we will create a new Azure App Service (you can also choose an existing App Service) and setup a load test with 25 virtual users concurrently accessing the Azure App Service for a duration of 60 seconds.

Similarly, if you opted in for setting up a staging environment then we will publish your latest changes first to staging slot and then promote to production. You can either choose an existing Azure App Service slot or create a new one.

Azure CD Deploy Blade

As a part of the Continuous Delivery setup The following sequence of events occurs:

  • Azure Continuous Delivery creates a build and a release definition in the Team Services account you specified, together with a service endpoint to connect to Azure.
  • If you chose to create a new Azure App Service instance for load tests, and/or a new slot for staging, these are created in your Azure subscription.
  • After setup has completed successfully, a build is triggered that builds and packages the application for deployment.
  • After the build has completed successfully, a new release is created and the deployment triggered.
  • If you chose to include a load test, the latest changes are first deployed to the Azure App Service you selected, and then the load test is executed after the deployment succeeds.
  • If you chose to use a staging slot, the latest changes are deployed to the staging slot and then a slot swap is performed to complete the continuous delivery workflow.

After all these actions have completed, the Azure portal shows the logs.

azure-cd-deploy-status

In the “Successfully set up Continuous Delivery…” item, choose the Build Definition link to open the project containing your app in Team Services, and see the summary for the build definition. Choose Edit to see the tasks that have been added and configured.

You can verify that continuous deployment is occurring from the repository containing your app by pushing a change to the repository. Your app should update to reflect the changes shortly after the push to the repository completes.

Refer to documentation to learn more about Continuous Delivery to Azure App Services.

Try out Release Management in Visual Studio Team Services.

For any questions, comments and feedback – please reach out to Gopinath.ch AT microsoft DOT com.

Thanks

Gopinath

Release Management Team

Twitter: @gopinach

Team Services November Extensions Roundup

$
0
0

This month, I’ve got two fun new extensions that have lots of potential; both of them are highly trending – taking some of the top spots for our most downloaded extensions over the last 30 days. I hope you enjoy these and have a Happy Thanksgiving!

Activity Feed

See it in the Marketplace: https://marketplace.visualstudio.com/items?itemName=davesmits.VSTSActivityFeed

I am a big fan of dashboard widgets and having a glanceable view of what’s going on in my projects. With Activity Feed, you get two great things: an activity feed experience for Team Services, and a publisher who is committed to making this extension better over time. Activity Feed lets you see the most recent changes from four core areas right now, with plans to add more:

  • Work Items
  • Commits
  • Pull Requests
  • Builds

activityfeed

The widget offers configurable sizes (as usual of widgets), and a second level of customization for determining what types of activity should be shown:

  1. Work Item Types – show specific work item types from you project
  2. Area Paths – limit to the area paths you care about
  3. Repositories – keep the widget focused on the repositories that matter
  4. Build Definitions – keep up to date with all of your builds, or highlight the important ones

Dave is the kind of publisher that is highly engaged with his community; he’s always on the lookout for feedback to improve the extension. He even posts his roadmap and other ideas he’s entertaining directly into his Marketplace page. Go check this one out!

Microsoft Teams Integration

See it in the Marketplace: https://marketplace.visualstudio.com/items?itemName=fortifyvsts.hpe-security-fortify-vsts

Microsoft Office recently launched its newest addition to the Office family. ‘Microsoft Teams’ is a group-chat platform for large or small teams and offers instant access to everything you may need in Office 365. The launch of Microsoft Teams is great news for Office 365 customers, and now we have the Team Services integration to go with it!teams-codepushedThis integration lets your team stay up to date with alerts from

  • Work items
  • Pull requests
  • Code commits
  • Builds
  • Releases

To set up this integration, you need to add Team Services as a connector to your team inside Microsoft Teams. Team Services is already baked in as an option, so if you’ve installed Microsoft Team, that’s all you’ll need. To bring events from Team Services into Microsoft Teams, click the ellipsis or ‘…’ on the top nav of your team channel. Select Connectors and then scroll through the list to find the Team Services icon and follow the steps to connect to your Team Services account.

capture

After that, you’ll select your project, the event type, and corresponding details you care about. The full instructions for Getting Started are here. Have fun sharing information with your team faster than ever!

    Are you using an extension you think should be featured here?

    I’ll be on the lookout for extensions to feature in the future, so if you’d like to see yours (or someone else’s) here, then let me know on Twitter!

    @JoeB_in_NC

    The Data Science Workloads in Visual Studio 2017 RC

    $
    0
    0

    From getting an automatic photo tag on Facebook, to a product recommendation online, to searching your photos using keywords, or getting a fraud alert on your credit card, … Machine Learning and Data Science are all around us in one form or another.

    Today we’re delighted to announce that Visual Studio 2017 RC now has dedicated workloads for Data Storage and Data Science. These two stacks provide you with all backend and tooling you need to build your next generation intelligent apps and services.

    Let’s take a look at the workloads in a bit more detail:

    1.  Data storage and processing– Big Data Storage and Advanced Analytics
    2.  Data Science– All the tooling you need to analyze, build models, and create smart apps
      • Python Tools for Visual Studio – Desktop, Web, Scientific, Data Science/ML
      • R Tools for Visual Studio – Primarily Stats and Data Science/ML
      • F# – A functional-first .Net language suited for a variety of data processing tasks

    Why R and Python?

    While Python has been available for a while, R is the new entry in the VS family of languages. R is the most popular Data Science / Stats focused language and comes with a rich ecosystem of ready to use packages.

    There are many “language popularity” rankings out there and all of them should be taken with a grain of salt, but it’s safe to say that if you’re doing Analytics, R and Python should be in your toolbox:

    Most of the Microsoft Storage and Analytics technologies either already have R/Python support (direct or via SDKs), or will be having them soon. Let’s look at the tooling next.

    Python Tools for Visual Studio

    VS 2017 RC provides rich integration for Python, covering various scenarios from machine learning to desktop to IoT to the web. It supports most interpreters such as CPython (2.x, 3.x), IronPython, Jython, PyPy, … along with the Anaconda distro and access to thousands of packages on PyPI. For the list of new features for Python, please see the product release notes.

    R Tools for Visual Studio

    RTVS turns VS into a powerful R IDE that includes the usual features you’d expect like intellisense, debugging, REPL, History, etc. and advanced ones such as Stored Procedures with R that run in a SQL database, multiple independent plots, to Remoting. Remoting is very powerful in that it allows all the features of RTVS to be run on a remote machine (as if you had used Terminal Server). It is perfect for when you want to use your laptop on a subset of data locally, and then connect to a large server and continue to use the full IDE features and finally deploy your code:

    Visual Studio supports both the standard CRAN R version and the enhanced Microsoft R which provides various performance and enterprise focused features.

    F#

    F# is a programming language that provides support for functional programming in addition to traditional object-oriented and imperative (procedural) programming. It is a great language for data processing and has a strong third-party ecosystem for accessing, manipulating, and processing data. The Visual F# tools in Visual Studio provide support for developing F# applications and extending other .NET applications by using F# code. F# is a first-class member of .NET, and retains a strong resemblance to the ML family of functional languages.

    There’s a package for that!

    Beyond Visual Studio integration, the Data Science workload comes preinstalled with hundreds of packages that cover just about any Advanced Analytics related scenario from image processing to bio-informatics to astronomy. The Data Science workload by default includes:

    • The Microsoft R Client– a Microsoft enhanced version of R that provides multi-core, pkg versioning and distributed memory support
    • The Anaconda Python distro– a cross-platform collection of curated Python packages from Continuum.io for machine learning, scientific computing and web scenarios.

    Azure Python SDK

    Azure now has SDKs covering just about every service and language, including Python. The Python Azure SDK has full support for core compute, storage, networking, keyvault and monitoring services, on par with .Net. Management coverage includes services such as Data Lake Store and Data Lake Analytics, SQL Database, DocumentDB, etc. Data support examples include SQL Database, SQL Server, DocumentDB and Data Lake Store File System.

    Join our team (virtually)!

    The entire Data Science stack, from tools to libraries, is open source and hosted on github. We’d like to invite you to check out the code base, fork it, file a bug, or if you’d like, add a feature! You can find the repos here:

    One more thing: Free interactive Python & R Notebooks!

    While Visual Studio is a highly productive desktop IDE, sometimes you just need a “REPL on steroids” to do some slicing and dicing and plotting of your data right in the browser and possibly sharing the results:

    Azure notebooks is a free, hosted Jupyter notebook service:

    Jupyter is like OneNote if it supported running code: it supports text (as Markdown), code, inline graphics, etc. It currently supports R, Python 2, Python 3 (with Anaconda distros). F# is coming soon. The best to learn about Azure Notebooks is to try one of the samples:

    The free service is particularly useful for faculty/students, giving webinars, product demos, sharing live reports, etc. Check out some of the thousands of high quality notebooks out there.

    Conclusion

    Data Science helps transform your data into intelligent action. Watch this Connect(); video on Data Science and Web Development to learn more. The Visual Studio Data Science workload is our first foray into providing you with everything needed to build the next generation of intelligent apps, whether on the desktop, cloud, IoT or mobile. Take it for a spin, check out the built-in libraries and packages, peruse CRAN and PyPI for even more, and let us know what you think!

    For problems, let us know via the Report a Problem option in the upper right corner, either from the installer or the Visual Studio IDE itself or by filling an issue on Github repositories for PTVS or RTVS. You may also leave suggestions on User Voice.

    Shahrokh Mortazavi, Partner PM, Visual Studio Cloud Platform Tools

    Shahrokh Mortazavi currently works in the Developer Division of Microsoft on Python and Node.js tool chain. Previously, he was in the High Performance Computing group at Microsoft. He worked on the Phoenix Compiler tool chain (code gen, analysis, JIT) at Microsoft Research and for 10 years led Sun Microsystems’ Code Generation & Optimization compiler backend teams.

    Live Unit Testing in Visual Studio 2017 RC

    $
    0
    0

    We are very proud to introduce a new feature in Visual Studio 2017 called Live Unit Testing ! This feature will make it easy for you to maintain quality and test coverage during rapid development and take your productivity to a whole new level. Imagine you are fixing a bug in a code base which you may not be completely familiar with. With Live Unit Testing you can know right away, as you are making edits to fix the bug, that you did not break any other part of the system. Getting this feedback, in-situ, as you type will give you extra confidence, make you more productive and why not, even enjoying fixing bugs and writing unit tests!

    Live Unit Testing automatically runs the impacted unit tests in the background as you edit code, and visualizes the results and code coverage live, in the editor, in real-time. In addition to giving feedback on the impact that your changes had on the existing tests, you also get immediate feedback on whether the new code you added is already covered by one or more existing tests. This will gently remind you to write unit tests as you are making bug fixes or adding features. You will be on your way to the promised land where there is no test debt in your code base!

    Live Unit Testing is present in the Enterprise edition of Visual Studio 2017 and it’s available for C# and VB projects that target the .NET Framework. It uses VB and C# compilers to instrument the code at compile time. Next, it runs unit tests on the instrumented code to generate data which it analyzes to understand which tests are covering which lines of code. It then uses this data to run just those tests that were impacted by the given edit providing immediate feedback on the results in the editor itself. As more edits are made or more tests are added or removed, it continuously updates the data which is used to identify the impacted tests.

    How to start Live Unit Testing

    Enabling Live Unit Testing is as simple as going to the Test command at the top level menu bar and starting it as shown in image below.

    Live Unit Testing in Visual Studio works with three popular unit testing frameworks; namely, MSTest, xunit and NUnit. When using these, you will need to ensure that the adapters and frameworks meet or exceed the minimum versions given below. Please remove older adapter and test framework references from your existing projects ( make sure you remove the reference to “Microsoft.VisualStudio.QualityTools.UnitTestFramework”) and add the new ones if Live Unit Testing is not working for you. You can get all of these from NuGet.org.

    • For xunit you will need xunit.runner.visualstudio version 2.2.0-beta3-build1187 and xunit 2.0 (or higher versions)
    • For NUnit you will need NUnit3TestAdapter version 3.5.1 and NUnit version 3.5.0 (or higher versions)
    • For MSTest you will need MSTest.TestAdapter 1.1.4-preview and MSTest.TestFramework 1.0.5-preview (or higher versions)

    Live Unit Testing experience

    Once enabled, Live Unit Testing helps you quickly see whether the code you’re writing is covered and if the tests that cover it are passing, without leaving the editor. Unit test results and coverage visualizations appear on a line-by-line basis in the code editor as shown in sample image below:

    clip_image001 If a line of executable code is covered by at least one failing test, Live Unit Testing will decorate it with a red “×”.

    clip_image002 If a line of executable code is covered by only passing tests, Live Unit Testing will decorate it with a green “√”.

    clip_image003 If a line of executable code is not covered by any test, Live Unit Testing will decorate it with a blue dash.

    The real-time code coverage and test result information provided by Live Unit Testing removes the burden of manually selecting and running tests. The live feedback also serves to notify you instantly if your change has broken the program – if inline visualizations shift from green “√”s to red “×”s, you know you broke one or more tests.

    At any point in time you can hover over the “√” or “×” to see how many tests are hitting the given line as seen in image below.

    You can click on the check or “×” to see what tests are hitting the given line as shown in image below.

    When hovering over the failed test in the tool tip, it expands to provide additional info to give more insight into the failure as shown in image below.

    Additionally, you can navigate directly to the failed test by clicking on it in the tool tip. Then, from the failed test, you can easily debug to the product code, make edits, and continue, all while Live Unit Testing runs in the background. There is no need to stop and restart Live Unit Testing for the debug, edit and continue cycle.

    At any time, you can temporarily pause or completely stop live unit testing; for example, when you are in the middle of a refactoring and you know that your tests will be broken for a while. It is as simple as going to the Test command in top level menu bar and clicking the desired action, as shown below.

    When paused, you will not see any coverage visualization in the editor. When you are ready to see them again, you can un-pause it by clicking “Continue” in the Live Unit Testing menu. When in pause mode, Live Unit Testing still keeps all the data that it had collected thus far. On “Continue,” Live Unit Testing will do the necessary work to catch up with all the edits that have been made while it was paused, and will update the glyphs appropriately.

    You can also stop Live Unit Testing completely if you desire. When Live Unit Testing is started again after it has been stopped, it will take longer to show the glyphs than when it was un-paused. This is because it loses all data when it is stopped.

    Conclusion

    Live Unit Testing will improve your developer productivity, test coverage and quality of software. .NET developers out there, please do check out this feature in Visual Studio 2017. For developers who are part of a team that practices test-driven development, Live Unit Testing gamifies their workflow; in other words, all their tests will be failing at first, and as they implement each method they will see them turn green. It will evoke the same feeling as a nod of approval from your coach, who is watching you intently from the sidelines, as you practice your art!

    Watch this Live Unit Testing video, where we demonstrate this feature.

    Joe Morris, Senior Program Manager, Visual Studio
    @_jomorris

    Joe has been with Microsoft for 19 years, with a particular focus on static analysis and developer productivity for the last three years.

    Manish Jayaswal, Principal Engineering Manager, Visual Studio

    Manish has years of management experience in commercial software development with deep technical expertise in compiler technology, debugger, programming languages, quality assurance and engineering system.

    Announcing UWP Community Toolkit 1.2

    $
    0
    0

    Following our commitment to ship new versions at a fast pace, I’m thrilled to announce the availability of UWP Community Toolkit 1.2. If you want to get a first glance, you can install the UWP Community Toolkit Sample App directly from the Windows Store.

    • The focus of this version was to stabilize current features while adding the most wanted ones that were missing. A full list of features and changes is available in the release notes. Here’s a quick preview:
    • New Helpers. we worked on providing 7 new helpers to help with everyday tasks:
      • BackgroundTaskHelper to help you work with background tasks
      • HttpHelper to help you deal with HTTP requests in a secure and reliable way
      • PrintHelper to help you print XAML controls
      • DispacherHelper to help you work with tasks that need to run on UI thread
      • DeepLinkHelper to simplify the management of your deep links
      • WebViewExtensions to allow you to bind HTML content to your Webview
      • SystemInformation to gather all system information into a single and unique class
    • New Controls
      • We introduced a new control named MasterDetailView that helps developers create master/detail user experiences

    controls-masterdetailsview

    • Updates. We updated the following features:
      • ImageCache was improved to provide a more robust cache
      • HeaderedTextBlock and PullToRefreshListView now accept ContentTemplate customization
      • Facebook service now supports paging when requesting data
      • Renamed BladeControl to BladeView. BladeView now also derives from ItemsControl. This will allow for more common convention like data binding and will make the control aligned with SDK naming. To guarantee backward compatibility, we kept the previous control and flagged it as obsolete. This way, developers can still reference the new version and everything will work just fine. A compiler warning will just encourage you to use the new version. The current plan is to keep obsolete classes until next major version and then remove them.

    We saw an increasing number of contributions from the community of 48 developers that led to several new features and improvements. We also observed some healthy dialogue about what should be include or not in the toolkit, architecture best practices, and feature prioritization that is going drive even higher quality of the toolkit.

    For example, I would like to share the story behind the MasterDetailView. The story began with an issue created on the GitHub repo: “We need a MasterDetailView.” Immediately, the community reacted with  tremendous energy, discussing the implementation details, features wanted and the philosophy behind the control. We even ended up with two different implementations at some point (the community then voted and discussed to define which best fit with the toolkit principles). If you want to understand how a united community can create wonderful code, I encourage you to read this thread.

    You can find the roadmap of the next release here.

    If you have any feedback or if you’re interested in contributing, see you on GitHub!

    Download Visual Studio to get started!


    ICYMI – Microsoft Connect, Linux, WIP and a new Insider Preview Build

    $
    0
    0

    Just when you thought you’d seen it all at the MVP Summit, we come back with a few exciting announcements from Connect. We want to thank you again for joining us, and if you couldn’t make it this time, continue reading to see what you might’ve missed.

    Connect(); 2016

    Connect, the annual Visual Studio-centered developer conference, announced the latest version of our favorite IDE, a preview for the new Visual Studio Mac edition, Team Foundation Server 2017 and a preview for Visual Studio Mobile Center. On top of that, we announced our platinum-level partnership with the Linux foundation. We’re thrilled to finally share all of these updates with you – follow the links below to learn more.

    UWP Community Toolkit Update 1.2

    Our goal with this update was to stabilize current features while adding the most wanted ones that were missing. Check out the blog to see the full list of updates, additions and assorted bells and whistles.

    Windows Insider Preview Build 14971

    Coming to you in this week’s build: improved reading experience in Microsoft Edge, new opportunities in 3D, PowerShell updates and a whole bunch of PC fixes.

    And that’s all! Make sure to tweet us if you have any questions or comments and, as always, see you next week.

    Download Visual Studio to get started.

    The Windows team would love to hear your feedback.  Please keep the feedback coming using our Windows Developer UserVoice site. If you have a direct bug, please use the Windows Feedback tool built directly into Windows 10.

    Windows 10 SDK Preview Build 14965 Released

    $
    0
    0

    Today, we released a new Windows 10 Anniversary SDK Preview to be used in conjunction with Windows 10 Insider Preview (Build 14965 or greater). The Preview SDK is a pre-release and cannot be used in a production environment. Please only install the SDK on your test machine. The Preview SDK Build 14965 contains bug fixes and under development changes to the API surface area. If you are working on an application that you need to submit to the store, you should not install the preview.

    The Preview SDK can be downloaded from the developer section on Windows Insider.

    For feedback and updates to the known issues, please see the developer forum.  For new feature requests, head over to our Windows Platform UserVoice.

    Things to note:

    What’s New

    Known Issues Windows SDK

    • Wrong GenXBF.DLL
      If you installed a previous Windows SDK flight, either version 14951 or 14931, you may have an incorrect GenXBF.dll installed. Please follow the following steps after installing the Windows 10 SDK Preview build 14965.
    1. Exit Visual Studio
    2. Open an Administrative command prompt
    3. Type the following:

      DEL “c:\Program Files (x86)\Windows Kits\10\bin\x86\genxbf.dll”

      DEL “c:\Program Files (x86)\Windows Kits\10\bin\x64\genxbf.dll”

    1. Run Control Panel
    2. Select Uninstall a Program
    3. Highlight Windows Software Development Kit – Windows 10.0.14965.1000
    4. Click Change
    5. Select Repair
    6. Click Next

    Windows SDK setup will restore the missing GenXBF.dlls  with the appropriate version.

    • Visual Studio 2017 fails with HRESULT: 0x80041FE2 when trying to create C++ UWP apps targeting build 14965 SDK

    This is a known problem. Here are steps to address this issue in your project file:

    1. Close the project
    2. Open up the project file in notepad or your favorite editor
    3. Add the following to the project file:
        false
    4. Reopen the project in Visual Studio

    Known Issues Microsoft Emulator

    Microsoft Emulator Preview for Windows 10 Mobile (10.0.14965.0) crashes when launching

    Impact:

    Please note that there is a bug impacting the usage of hardware accelerated graphics in the latest release of the Mobile Emulator. Follow the instructions below to temporarily disable hardware accelerated graphics in the emulator and use the emulator with software rendered graphics (WARP).

    NOTE: The following registry setting will impact any and all Microsoft Emulators installed on your machine. You will need to remove this registry setting in order to re-enable hardware accelerated graphics in the emulator.

    1. Create the following registry subkey if it doesn’t exist: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Xde\10.0
    2. Right click the 10.0 folder, point to New, and then click DWORD Value.
    3. Type DisableRemoteFx, and then press Enter.
    4. Double-click DisableRemoteFx, enter 1 in the Value data box, select the Decimal option, and then click OK.

    API Updates and Additions

    The following API changes are under development and new or updated for this release of the SDK.

    namespace Windows.ApplicationModel.Preview.Notes {
      public sealed class NotesWindowManagerPreview {
        void SetFocusToPreviousView();
        IAsyncAction SetThumbnailImageForTaskSwitcherAsync(SoftwareBitmap bitmap);
        void ShowNoteRelativeTo(int noteViewId, int anchorNoteViewId, NotesWindowManagerPreviewShowNoteOptions options);
        void ShowNoteWithPlacement(int noteViewId, IBuffer data, NotesWindowManagerPreviewShowNoteOptions options);
      }
      public sealed class NotesWindowManagerPreviewShowNoteOptions
    }
    namespace Windows.Devices.Gpio {
      public sealed class GpioInterruptBuffer
      public struct GpioInterruptEvent
      public enum GpioOpenStatus {
        MuxingConflict = 3,
        UnknownError = 4,
      }
      public sealed class GpioPin : IClosable {
        GpioInterruptBuffer InterruptBuffer { get; }
        ulong InterruptCount { get; }
        void CreateInterruptBuffer();
        void CreateInterruptBuffer(int minimumCapacity);
        void StartInterruptBuffer();
        void StartInterruptBuffer(GpioPinEdge edge);
        void StartInterruptCount();
        void StartInterruptCount(GpioPinEdge edge);
        void StopInterruptBuffer();
        void StopInterruptCount();
      }
    }
    namespace Windows.Devices.Gpio.Provider {
      public interface IGpioInterruptBufferProvider
      public interface IGpioPinProvider2
      public struct ProviderGpioInterruptEvent
    }
    namespace Windows.Devices.I2c {
      public enum I2cTransferStatus {
        ClockStretchTimeout = 3,
        UnknownError = 4,
      }
    }
    namespace Windows.ApplicationModel {
      public sealed class Package {
        IAsyncOperation GetContentGroupAsync(string name);
        IAsyncOperation> GetContentGroupsAsync();
        IAsyncOperation SetInUseAsync(bool inUse);
        IAsyncOperation> StageContentGroupsAsync(IIterable names);
        IAsyncOperation> StageContentGroupsAsync(IIterable names, bool moveToHeadOfQueue);
      }
      public sealed class PackageCatalog {
        event TypedEventHandler PackageContentGroupStaging;
        IAsyncOperation AddOptionalPackageAsync(string optionalPackageFamilyName);
      }
      public sealed class PackageContentGroup
      public sealed class PackageContentGroupStagingEventArgs
      public enum PackageContentGroupState
    }
    namespace Windows.ApplicationModel.Activation {
      public enum ActivationKind {
        ContactPanel = 1017,
        LockScreenComponent = 1016,
      }
      public sealed class ContactPanelActivatedEventArgs : IActivatedEventArgs, IActivatedEventArgsWithUser, IContactPanelActivatedEventArgs
      public interface IContactPanelActivatedEventArgs
      public sealed class LockScreenComponentActivatedEventArgs : IActivatedEventArgs
      public sealed class ToastNotificationActivatedEventArgs : IActivatedEventArgs, IActivatedEventArgsWithUser, IApplicationViewActivatedEventArgs, IToastNotificationActivatedEventArgs {
        int CurrentlyShownApplicationViewId { get; }
      }
    }
    namespace Windows.ApplicationModel.Background {
      public sealed class GattCharacteristicNotificationTrigger : IBackgroundTrigger {
        public GattCharacteristicNotificationTrigger(GattCharacteristic characteristic, BluetoothEventTriggeringMode eventTriggeringMode);
        BluetoothEventTriggeringMode EventTriggeringMode { get; }
      }
      public sealed class GattServiceProviderTrigger : IBackgroundTrigger
    }
    namespace Windows.ApplicationModel.Contacts {
      public sealed class ContactAnnotation {
        string ContactGroupId { get; set; }
        string ContactListId { get; set; }
      }
      public enum ContactAnnotationOperations : uint {
        Share = (uint)32,
      }
      public sealed class ContactAnnotationStore {
        IAsyncOperation> FindAnnotationsForContactGroupAsync(string contactGroupId);
        IAsyncOperation> FindAnnotationsForContactListAsync(string contactListId);
      }
      public sealed class ContactGroup
      public sealed class ContactGroupMember
      public sealed class ContactGroupMemberBatch
      public sealed class ContactGroupMemberReader
      public enum ContactGroupOtherAppReadAccess
      public static class ContactManager {
        public static IAsyncOperation IsShowFullContactCardSupportedAsync();
      }
      public sealed class ContactManagerForUser {
        void ShowFullContactCard(Contact contact, FullContactCardOptions fullContactCardOptions);
      }
      public sealed class ContactPanel
      public sealed class ContactPanelClosingEventArgs
      public sealed class ContactPanelLaunchFullAppRequestedEventArgs
      public sealed class ContactPicker {
        User User { get; }
        public static ContactPicker CreateForUser(User user);
        public static IAsyncOperation IsSupportedAsync();
      }
      public sealed class ContactStore {
        IAsyncOperation CreateContactGroupAsync(string displayName);
        IAsyncOperation CreateContactGroupAsync(string displayName, string userDataAccountId);
        IAsyncOperation> FindContactGroupsAsync();
        IAsyncOperation> FindContactGroupsByRemoteIdAsync(string remoteId);
        IAsyncOperation GetContactGroupAsync(string contactGroupId);
      }
      public sealed class PinnedContactIdsQueryResult
      public sealed class PinnedContactManager
      public enum PinnedContactSurface
    }
    namespace Windows.ApplicationModel.Core {
      public sealed class CoreApplicationView {
        IPropertySet Properties { get; }
      }
    }
    namespace Windows.ApplicationModel.DataTransfer {
      public sealed class DataTransferManager {
        public static void ShowShareUI(ShareUIOptions shareOptions);
      }
      public sealed class ShareUIOptions
    }
    namespace Windows.ApplicationModel.Email {
      public sealed class EmailMessage {
        IVector ReplyTo { get; }
        EmailRecipient SentRepresenting { get; set; }
      }
    }
    namespace Windows.ApplicationModel.Store.LicenseManagement {
      public static class LicenseManager {
        public static IAsyncAction RefreshLicensesAsync(LicenseRefreshOption refreshOption);
      }
      public enum LicenseRefreshOption
    }
    namespace Windows.ApplicationModel.UserDataAccounts {
      public sealed class UserDataAccount {
        bool CanShowCreateContactGroup { get; set; }
        bool IsProtectedUnderLock { get; set; }
        IPropertySet ProviderProperties { get; }
        IAsyncOperation> FindContactGroupsAsync();
        IAsyncOperation> FindUserDataTaskListsAsync();
        IAsyncOperation TryShowCreateContactGroupAsync();
      }
      public sealed class UserDataAccountStore {
        IAsyncOperation CreateAccountAsync(string userDisplayName, string packageRelativeAppId, string enterpriseId);
      }
    }
    namespace Windows.ApplicationModel.UserDataTasks {
      public sealed class UserDataTask
      public sealed class UserDataTaskBatch
      public enum UserDataTaskDaysOfWeek : uint
      public enum UserDataTaskDetailsKind
      public enum UserDataTaskKind
      public sealed class UserDataTaskList
      public sealed class UserDataTaskListLimitedWriteOperations
      public enum UserDataTaskListOtherAppReadAccess
      public enum UserDataTaskListOtherAppWriteAccess
      public sealed class UserDataTaskListSyncManager
      public enum UserDataTaskListSyncStatus
      public static class UserDataTaskManager
      public sealed class UserDataTaskManagerForUser
      public enum UserDataTaskPriority
      public enum UserDataTaskQueryKind
      public sealed class UserDataTaskQueryOptions
      public enum UserDataTaskQuerySortProperty
      public sealed class UserDataTaskReader
      public sealed class UserDataTaskRecurrenceProperties
      public enum UserDataTaskRecurrenceUnit
      public sealed class UserDataTaskRegenerationProperties
      public enum UserDataTaskRegenerationUnit
      public enum UserDataTaskSensitivity
      public sealed class UserDataTaskStore
      public enum UserDataTaskStoreAccessType
      public enum UserDataTaskWeekOfMonth
    }
    namespace Windows.ApplicationModel.UserDataTasks.DataProvider {
      public sealed class UserDataTaskDataProviderConnection
      public sealed class UserDataTaskDataProviderTriggerDetails
      public sealed class UserDataTaskListCompleteTaskRequest
      public sealed class UserDataTaskListCompleteTaskRequestEventArgs
      public sealed class UserDataTaskListCreateOrUpdateTaskRequest
      public sealed class UserDataTaskListCreateOrUpdateTaskRequestEventArgs
      public sealed class UserDataTaskListDeleteTaskRequest
      public sealed class UserDataTaskListDeleteTaskRequestEventArgs
      public sealed class UserDataTaskListSkipOccurrenceRequest
      public sealed class UserDataTaskListSkipOccurrenceRequestEventArgs
      public sealed class UserDataTaskListSyncManagerSyncRequest
      public sealed class UserDataTaskListSyncManagerSyncRequestEventArgs
    }
    namespace Windows.Gaming.Input {
      public sealed class FlightStick : IGameController
      public enum FlightStickButtons : uint
      public struct FlightStickReading
      public enum GameControllerSwitchKind
      public enum GameControllerSwitchPosition
      public sealed class RawGameController : IGameController
    }
    namespace Windows.Gaming.Input.Custom {
      public sealed class HidGameControllerProvider : IGameControllerProvider
      public interface IHidGameControllerInputSink : IGameControllerInputSink
    }
    namespace Windows.Graphics.Printing.PrintTicket {
      public interface IPrintTicketSchemaDisplayableElement : IPrintTicketSchemaElement
      public interface IPrintTicketSchemaElement
      public interface IPrintTicketSchemaOption : IPrintTicketSchemaDisplayableElement, IPrintTicketSchemaElement
      public interface IPrintTicketSchemaParameterDefinition : IPrintTicketSchemaElement
      public interface IPrintTicketSchemaValue
      public sealed class PrintTicketSchemaCapabilities : IPrintTicketSchemaElement
      public sealed class PrintTicketSchemaFeature : IPrintTicketSchemaDisplayableElement, IPrintTicketSchemaElement
      public sealed class PrintTicketSchemaParameterInitializer : IPrintTicketSchemaElement
      public enum tagSchemaParameterDataType
      public enum tagSchemaSelectionType
      public enum tagValueType
      public sealed class WorkflowPrintSchemaTicket : IPrintTicketSchemaElement
      public sealed class XmlNode
    }
    namespace Windows.Graphics.Printing.Workflow {
      public interface IPrinterPropertyBag
      public sealed class PrinterQueue
      public sealed class PrintTaskBackgroundSessionManager
      public sealed class PrintTaskConfig
      public sealed class PrintTaskForegroundSessionManager
      public sealed class PrintTaskSessionState
      public enum PrintTaskSessionStatus
      public sealed class PrintTaskSetupEventArgs
      public sealed class PrintTaskSubmissionController
      public sealed class PrintTaskSubmittedEventArgs
      public sealed class PrintTaskTarget
      public sealed class PrintTaskUIActivatedEventArgs : IActivatedEventArgs
      public sealed class PrintTaskXpsDataAvailableEventArgs
      public sealed class SourceContent
      public sealed class SpoolStreamContent
      public sealed class StreamTarget
      public sealed class WorkflowTaskContext
      public sealed class WorkflowTriggerDetails
      public sealed class XpsOmContent
      public sealed class XpsOmReceiver
    }
    namespace Windows.Management.Deployment {
      public enum DeploymentOptions : uint {
        EnableStreamedInstall = (uint)128,
        RequiredContentGroupOnly = (uint)256,
      }
      public sealed class PackageManager {
        IAsyncOperationWithProgress AddPackageAsync(Uri packageUri, IIterable dependencyPackageUris, DeploymentOptions deploymentOptions, PackageVolume targetVolume, IIterable optionalPackageFamilyNames, IIterable externalPackageUris);
        IAsyncOperationWithProgress RegisterPackageByFamilyNameAsync(string mainPackageFamilyName, IIterable dependencyPackageFamilyNames, DeploymentOptions deploymentOptions, PackageVolume appDataVolume, IIterable optionalPackageFamilyNames);
        IAsyncOperationWithProgress StagePackageAsync(Uri packageUri, IIterable dependencyPackageUris, DeploymentOptions deploymentOptions, PackageVolume targetVolume, IIterable optionalPackageFamilyNames, IIterable externalPackageUris);
      }
    }
    namespace Windows.Management.Policies {
      public sealed class BinaryPolicy
      public sealed class BooleanPolicy
      public static class BrowserPolicies
      public sealed class BrowserPoliciesForUser
      public sealed class Int32Policy
      public sealed class StringPolicy
    }
    namespace Windows.Media {
      public sealed class MediaExtensionManager {
        void RegisterMediaExtensionForAppService(IMediaExtension extension, AppServiceConnection connection);
      }
      public sealed class MediaMarkerSpeechSentenceBoundary : IMediaMarker
      public sealed class MediaMarkerSpeechWordBoundary : IMediaMarker
      public static class MediaMarkerTypes {
        public static string SentenceBoundary { get; }
        public static string WordBoundary { get; }
      }
      public struct MediaTimeRange
    }
    namespace Windows.Media.Capture {
      public sealed class MediaCaptureInitializationSettings {
        bool AlwaysPlaySystemShutterSound { get; set; }
      }
    }
    namespace Windows.Media.Core {
      public sealed class ChapterCue : IMediaCue
      public sealed class DataCue : IMediaCue {
        PropertySet Properties { get; }
      }
      public sealed class ImageCue : IMediaCue
      public sealed class MediaBindingEventArgs {
        void SetAdaptiveMediaSource(AdaptiveMediaSource mediaSource);
        void SetStorageFile(IStorageFile file);
      }
      public sealed class MediaSource : IClosable, IMediaPlaybackSource {
        AdaptiveMediaSource AdaptiveMediaSource { get; }
        MediaStreamSource MediaStreamSource { get; }
        MseStreamSource MseStreamSource { get; }
        Uri Uri { get; }
      }
      public sealed class MediaStreamSource : IMediaSource {
        IReference MaxSupportedPlaybackRate { get; set; }
      }
      public enum TimedMetadataKind {
        ImageSubtitle = 6,
      }
      public enum TimedTextFontStyle
      public sealed class TimedTextSource {
        public static TimedTextSource CreateFromStreamWithIndex(IRandomAccessStream stream, IRandomAccessStream indexStream);
        public static TimedTextSource CreateFromStreamWithIndex(IRandomAccessStream stream, IRandomAccessStream indexStream, string defaultLanguage);
        public static TimedTextSource CreateFromUriWithIndex(Uri uri, Uri indexUri);
        public static TimedTextSource CreateFromUriWithIndex(Uri uri, Uri indexUri, string defaultLanguage);
      }
      public sealed class TimedTextStyle {
        TimedTextFontStyle FontStyle { get; set; }
        bool IsLineThroughEnabled { get; set; }
        bool IsOverlineEnabled { get; set; }
        bool IsUnderlineEnabled { get; set; }
      }
    }
    namespace Windows.Media.Core.Preview {
      public static class SoundLevelBroker
    }
    namespace Windows.Media.MediaProperties {
      public static class MediaEncodingSubtypes {
        public static string D16 { get; }
        public static string L16 { get; }
        public static string L8 { get; }
        public static string Vp9 { get; }
      }
      public enum SphericalVideoFrameFormat
      public sealed class VideoEncodingProperties : IMediaEncodingProperties {
        SphericalVideoFrameFormat SphericalVideoFrameFormat { get; }
      }
    }
    namespace Windows.Media.Playback {
      public enum AutoLoadedDisplayPropertyKind
      public sealed class CurrentMediaPlaybackItemChangedEventArgs {
        MediaPlaybackItemChangedReason Reason { get; }
      }
      public sealed class MediaPlaybackItem : IMediaPlaybackSource {
        AutoLoadedDisplayPropertyKind AutoLoadedDisplayProperties { get; set; }
        bool IsDisabledInPlaybackList { get; set; }
        double TotalDownloadProgress { get; }
      }
      public enum MediaPlaybackItemChangedReason
      public sealed class MediaPlaybackList : IMediaPlaybackSource {
        IReference MaxPlayedItemsToKeepOpen { get; set; }
      }
      public sealed class MediaPlaybackSession {
        bool IsMirroring { get; set; }
        MediaPlaybackSphericalVideoProjection SphericalVideoProjection { get; }
        event TypedEventHandler BufferedRangesChanged;
        event TypedEventHandler PlayedRangesChanged;
        event TypedEventHandler SeekableRangesChanged;
        event TypedEventHandler SupportedPlaybackRatesChanged;
        IVectorView GetBufferedRanges();
        IVectorView GetPlayedRanges();
        IVectorView GetSeekableRanges();
        bool IsSupportedPlaybackRateRange(double rate1, double rate2);
      }
      public sealed class MediaPlaybackSphericalVideoProjection
    }
    namespace Windows.Media.Protection.PlayReady {
      public interface IPlayReadyLicenseSession2 : IPlayReadyLicenseSession
      public sealed class PlayReadyLicense : IPlayReadyLicense {
        bool ExpiresInRealTime { get; }
        bool InMemoryOnly { get; }
        Guid SecureStopId { get; }
        uint SecurityLevel { get; }
      }
      public sealed class PlayReadyLicenseAcquisitionServiceRequest : IMediaProtectionServiceRequest, IPlayReadyLicenseAcquisitionServiceRequest, IPlayReadyServiceRequest {
        PlayReadyLicenseIterable CreateLicenseIterable(PlayReadyContentHeader contentHeader, bool fullyEvaluated);
      }
      public sealed class PlayReadyLicenseSession : IPlayReadyLicenseSession, IPlayReadyLicenseSession2 {
        PlayReadyLicenseIterable CreateLicenseIterable(PlayReadyContentHeader contentHeader, bool fullyEvaluated);
      }
    }
    namespace Windows.Media.SpeechSynthesis {
      public sealed class SpeechSynthesisOptions
      public sealed class SpeechSynthesizer : IClosable {
        SpeechSynthesisOptions Options { get; }
      }
    }
    namespace Windows.Media.Streaming.Adaptive {
      public sealed class AdaptiveMediaSource : IClosable, IMediaSource {
        IReference DesiredSeekableWindowSize { get; set; }
        AdaptiveMediaSourceDiagnostics Diagnostics { get; }
        IReference MaxSeekableWindowSize { get; }
        IReference MinLiveOffset { get; }
        void Close();
        AdaptiveMediaSourceCorrelatedTimes GetCorrelatedTimes();
      }
      public sealed class AdaptiveMediaSourceCorrelatedTimes
      public sealed class AdaptiveMediaSourceDiagnosticAvailableEventArgs
      public sealed class AdaptiveMediaSourceDiagnostics
      public enum AdaptiveMediaSourceDiagnosticType
      public sealed class AdaptiveMediaSourceDownloadBitrateChangedEventArgs {
        AdaptiveMediaSourceDownloadBitrateChangedReason Reason { get; }
      }
      public enum AdaptiveMediaSourceDownloadBitrateChangedReason
    }
    namespace Windows.Networking.NetworkOperators {
      public sealed class MobileBroadbandAccount {
        Uri AccountExperienceUrl { get; }
      }
      public sealed class MobileBroadbandDeviceInformation {
        string SimGid1 { get; }
        string SimPnn { get; }
        string SimSpn { get; }
      }
    }
    namespace Windows.Payments {
      public interface IPaymentItem
      public sealed class PaymentAddress
      public static class PaymentAppRegistration
      public sealed class PaymentCurrencyAmount
      public sealed class PaymentDetails
      public sealed class PaymentDetailsModifier
      public sealed class PaymentItem : IPaymentItem
      public static class PaymentMediator
      public sealed class PaymentMerchantInfo
      public sealed class PaymentMethodData
      public enum PaymentOptionPresence
      public sealed class PaymentOptions
      public sealed class PaymentRequest
      public sealed class PaymentRequestChangedEventArgs
      public delegate IAsyncOperation PaymentRequestChangedEventHandler(PaymentRequest paymentRequest, PaymentRequestChangedEventArgs args);
      public sealed class PaymentRequestChangedEventResult
      public enum PaymentRequestChangeSource
      public enum PaymentRequestCompletionStatus
      public enum PaymentRequestStatus
      public sealed class PaymentRequestSubmitResult
      public sealed class PaymentResponse
      public sealed class PaymentShippingOption : IPaymentItem
      public sealed class PaymentToken
      public sealed class PaymentTransaction
      public sealed class PaymentTransactionAcceptResult
    }
    namespace Windows.Perception.Spatial.Preview {
      public interface ISpatialAnchorStorage
      public sealed class SpatialAnchorMetadata
      public enum SpatialAnchorStorageContentChange
      public sealed class SpatialAnchorStorageContentChangedEventArgs
      public sealed class SpatialElement
      public sealed class SpatialElementChangedEventArgs
      public sealed class SpatialElementStore
    }
    namespace Windows.Perception.Spatial.Preview.Sharing {
      public interface ISpatialSharingSession
      public interface ISpatialSharingSessionHost
      public interface ISpatialSharingSessionManager
      public sealed class SessionChangedEventArgs
      public sealed class SessionInviteReceivedEventArgs
      public sealed class SessionMessageReceivedEventArgs
      public sealed class SessionParticipantEventArgs
      public sealed class SessionParticipantLeftEventArgs
      public sealed class SpatialSharingDevice
      public sealed class SpatialSharingQueryResult
      public sealed class SpatialSharingSession : ISpatialAnchorStorage, ISpatialSharingSession
      public sealed class SpatialSharingSessionHost : ISpatialSharingSessionHost
      public sealed class SpatialSharingSessionInvite
      public sealed class SpatialSharingSessionManager : ISpatialSharingSessionManager
      public sealed class SpatialSharingSessionParticipant
      public enum SpatialSharingSessionState
      public sealed class SpatialSharingSessionToken
    }
    namespace Windows.Security.Cryptography.Certificates {
      public sealed class CertificateExtension
      public sealed class CertificateRequestProperties {
        IVector Extensions { get; }
        SubjectAlternativeNameInfo SubjectAlternativeName { get; }
        IVector SuppressedDefaults { get; }
      }
      public sealed class SubjectAlternativeNameInfo {
        IVector DistinguishedNames { get; }
        IVector DnsNames { get; }
        IVector EmailNames { get; }
        CertificateExtension Extension { get; }
        IVector IPAddresses { get; }
        IVector PrincipalNames { get; }
        IVector Urls { get; }
      }
    }
    namespace Windows.Services.Cortana {
      public enum CortanaPermission
      public enum CortanaPermissionsChangeResult
      public sealed class CortanaPermissionsManager
    }
    namespace Windows.Services.Maps {
      public sealed class EnhancedWaypoint
      public static class MapRouteFinder {
        public static IAsyncOperation GetDrivingRouteFromEnhancedWaypointsAsync(IIterable waypoints);
        public static IAsyncOperation GetDrivingRouteFromEnhancedWaypointsAsync(IIterable waypoints, MapRouteDrivingOptions options);
      }
      public static class MapService {
        public static MapServiceDataUsagePreference DataUsagePreference { get; set; }
      }
      public enum MapServiceDataUsagePreference
      public enum WaypointKind
    }
    namespace Windows.Services.Maps.OfflineMaps {
      public sealed class OfflineMapPackage
      public sealed class OfflineMapPackageQueryResult
      public enum OfflineMapPackageQueryStatus
      public sealed class OfflineMapPackageStartDownloadResult
      public enum OfflineMapPackageStartDownloadStatus
      public enum OfflineMapPackageStatus
    }
    namespace Windows.System {
      public sealed class DispatcherQueue
      public delegate void DispatcherQueueHandler();
      public delegate IAsyncAction DispatcherQueueHandlerAsync();
      public sealed class DispatcherQueueOptions
      public enum DispatcherQueuePriority
      public sealed class DispatcherQueueTimer
    }
    namespace Windows.System.Preview.RemoteSessions {
      public enum BinaryChannelTransportMode
      public sealed class RemoteSession
      public sealed class RemoteSessionAddedEventArgs
      public sealed class RemoteSessionBinaryChannel
      public sealed class RemoteSessionBinaryMessageReceivedEventArgs
      public enum RemoteSessionConnectionStatus
      public sealed class RemoteSessionConnectResult
      public sealed class RemoteSessionDisconnectedEventArgs
      public enum RemoteSessionDisconnectedReason
      public sealed class RemoteSessionInfo
      public sealed class RemoteSessionInvitationManager
      public sealed class RemoteSessionInvitationReceivedEventArgs
      public sealed class RemoteSessionJoinRequest
      public sealed class RemoteSessionJoinRequestedEventArgs
      public sealed class RemoteSessionParticipant
      public sealed class RemoteSessionParticipantChangedEventArgs
      public sealed class RemoteSessionRemovedEventArgs
      public sealed class RemoteSessionUpdatedEventArgs
      public sealed class RemoteSessionWatcher
    }
    namespace Windows.System.Profile {
      public static class EducationSettings
    }
    namespace Windows.System.RemoteSystems {
      public sealed class RemoteSystem {
        IAsyncOperation GetResourceAvailableAsync(string query);
      }
    }
    namespace Windows.System.RemoteSystems.Preview {
      public static class RemoteSystemResourceQuery
    }
    namespace Windows.UI.Composition {
      public class CompositionDrawingSurface : CompositionObject, ICompositionSurface {
      }
      public sealed class CompositionGraphicsDevice : CompositionObject {
        CompositionVirtualDrawingSurface CreateVirtualDrawingSurface(Size sizePixels, DirectXPixelFormat pixelFormat, DirectXAlphaMode alphaMode);
      }
      public sealed class CompositionVirtualDrawingSurface : CompositionDrawingSurface, ICompositionSurface
      public sealed class CompositionVisualSurface : CompositionObject, ICompositionSurface
      public sealed class CompositionWindowBackdropBrush : CompositionBrush
      public sealed class Compositor : IClosable {
        CompositionVisualSurface CreateVisualSurface();
        CompositionWindowBackdropBrush CreateWindowBackdropBrush();
      }
      public sealed class LayerVisual : ContainerVisual {
        CompositionShadow Shadow { get; set; }
      }
      public class Visual : CompositionObject {
        Vector3 RelativeOffset { get; set; }
        Vector2 RelativeSize { get; set; }
        Visual TransformParent { get; set; }
      }
    }
    namespace Windows.UI.Core {
      public sealed class CoreWindow : ICorePointerRedirector, ICoreWindow {
        event TypedEventHandler ResizeCompleted;
        event TypedEventHandler ResizeStarted;
      }
    }
    namespace Windows.UI.Input {
      public static class KnownSimpleHapticsControllerWaveforms
      public sealed class RadialController {
        event TypedEventHandler ButtonHolding;
        event TypedEventHandler ButtonPressed;
        event TypedEventHandler ButtonReleased;
      }
      public sealed class RadialControllerButtonClickedEventArgs {
        SimpleHapticsController SimpleHapticsController { get; }
      }
      public sealed class RadialControllerButtonHoldingEventArgs
      public sealed class RadialControllerButtonPressedEventArgs
      public sealed class RadialControllerButtonReleasedEventArgs
      public sealed class RadialControllerConfiguration {
        RadialController ActiveControllerWhenMenuIsSuppressed { get; set; }
        bool IsMenuSuppressed { get; set; }
      }
      public sealed class RadialControllerControlAcquiredEventArgs {
        bool IsButtonPressed { get; }
        SimpleHapticsController SimpleHapticsController { get; }
      }
      public sealed class RadialControllerMenuItem {
        public static RadialControllerMenuItem CreateFromFontGlyph(string displayText, string glyph, string fontFamily);
        public static RadialControllerMenuItem CreateFromFontGlyph(string displayText, string glyph, string fontFamily, Uri fontUri);
      }
      public sealed class RadialControllerRotationChangedEventArgs {
        bool IsButtonPressed { get; }
        SimpleHapticsController SimpleHapticsController { get; }
      }
      public sealed class RadialControllerScreenContactContinuedEventArgs {
        bool IsButtonPressed { get; }
        SimpleHapticsController SimpleHapticsController { get; }
      }
      public sealed class RadialControllerScreenContactEndedEventArgs
      public sealed class RadialControllerScreenContactStartedEventArgs {
        bool IsButtonPressed { get; }
        SimpleHapticsController SimpleHapticsController { get; }
      }
      public sealed class SimpleHapticsController
      public sealed class SimpleHapticsControllerFeedback
    }
    namespace Windows.UI.Input.Core {
      public sealed class RadialControllerIndependentInputSource
    }
    namespace Windows.UI.Input.Inking {
      public enum InkPersistenceFormat
      public sealed class InkPresenterProtractor : IInkPresenterStencil
      public sealed class InkPresenterRuler : IInkPresenterStencil {
        bool AreTickMarksVisible { get; set; }
        bool IsCompassVisible { get; set; }
      }
      public enum InkPresenterStencilKind {
        Protractor = 2,
      }
      public sealed class InkStroke {
        uint Id { get; }
        IReference StrokeDuration { get; set; }
        IReference StrokeStartedTime { get; set; }
      }
      public sealed class InkStrokeBuilder {
        InkStroke CreateStrokeFromInkPoints(IIterable inkPoints, Matrix3x2 transform, IReference strokeStartedTime, IReference strokeDuration);
      }
      public sealed class InkStrokeContainer : IInkStrokeContainer {
        InkStroke GetStrokeById(uint id);
        IAsyncOperationWithProgress SaveAsync(IOutputStream outputStream, InkPersistenceFormat inkPersistenceFormat);
      }
    }
    namespace Windows.UI.Input.Spatial {
      public sealed class SpatialHoldCompletedEventArgs {
        SpatialPointingPose TryGetPointingPose(SpatialCoordinateSystem coordinateSystem);
      }
      public sealed class SpatialHoldStartedEventArgs {
        SpatialPointingPose TryGetPointingPose(SpatialCoordinateSystem coordinateSystem);
      }
      public sealed class SpatialInteractionDetectedEventArgs {
        SpatialPointingPose TryGetPointingPose(SpatialCoordinateSystem coordinateSystem);
      }
      public enum SpatialInteractionKind
      public sealed class SpatialInteractionSource {
        bool SupportsPointing { get; }
      }
      public sealed class SpatialInteractionSourceEventArgs {
        SpatialInteractionKind InteractionKind { get; }
        SpatialPointingPose TryGetPointingPose(SpatialCoordinateSystem coordinateSystem);
      }
      public sealed class SpatialInteractionSourceState {
        bool IsGrasped { get; }
        bool IsPrimaryPressed { get; }
        bool IsSecondaryPressed { get; }
        SpatialPointingPose TryGetPointingPose(SpatialCoordinateSystem coordinateSystem);
      }
      public sealed class SpatialPointerPose {
        SpatialPointingPose TryGetPointingPose(SpatialInteractionSource source);
      }
      public sealed class SpatialPointingPose
      public sealed class SpatialTappedEventArgs {
        SpatialPointingPose TryGetPointingPose(SpatialCoordinateSystem coordinateSystem);
      }
    }
    namespace Windows.UI.Notifications {
      public sealed class NotificationData
      public enum NotificationUpdateResult
      public sealed class ToastCollection
      public sealed class ToastCollectionManager
      public sealed class ToastNotification {
        NotificationData Data { get; set; }
      }
      public sealed class ToastNotificationHistoryChangedTriggerDetail {
        string CollectionId { get; }
      }
      public static class ToastNotificationManager {
        public static ToastNotificationManagerForUser Current { get; }
      }
      public sealed class ToastNotificationManagerForUser {
        IAsyncOperation GetHistoryForToastCollectionIdAsync(string collectionId);
        ToastCollectionManager GetToastCollectionManager();
        ToastCollectionManager GetToastCollectionManager(string appId);
        IAsyncOperation GetToastNotifierForToastCollectionIdAsync(string collectionId);
      }
      public sealed class ToastNotifier {
        NotificationUpdateResult Update(NotificationData data, string tag);
        NotificationUpdateResult Update(NotificationData data, string tag, string group);
      }
    }
    namespace Windows.UI.Text {
      public enum TextDecorations : uint
    }
    namespace Windows.UI.ViewManagement {
      public sealed class ApplicationView {
        IAsyncOperation TryConsolidateAsync();
      }
      public sealed class ApplicationViewConsolidatedEventArgs {
        bool IsAppInitiated { get; }
      }
    }
    namespace Windows.UI.WebUI {
      public sealed class WebUIContactPanelActivatedEventArgs : IActivatedEventArgs, IActivatedEventArgsDeferral, IActivatedEventArgsWithUser, IContactPanelActivatedEventArgs
      public sealed class WebUILockScreenComponentActivatedEventArgs : IActivatedEventArgs, IActivatedEventArgsDeferral
    }
    namespace Windows.UI.Xaml {
      public sealed class BringIntoViewOptions
      public class FrameworkElement : UIElement {
        public static void DeferTree(DependencyObject element);
      }
      public class UIElement : DependencyObject {
        double KeyTipHorizontalOffset { get; set; }
        public static DependencyProperty KeyTipHorizontalOffsetProperty { get; }
        KeyTipPlacementMode KeyTipPlacementMode { get; set; }
        public static DependencyProperty KeyTipPlacementModeProperty { get; }
        double KeyTipVerticalOffset { get; set; }
        public static DependencyProperty KeyTipVerticalOffsetProperty { get; }
        XYFocusKeyboardNavigationMode XYFocusKeyboardNavigation { get; set; }
        public static DependencyProperty XYFocusKeyboardNavigationProperty { get; }
        void StartBringIntoView();
        void StartBringIntoView(BringIntoViewOptions options);
      }
    }
    namespace Windows.UI.Xaml.Automation {
      public sealed class AutomationElementIdentifiers {
        public static AutomationProperty CultureProperty { get; }
      }
      public sealed class AutomationProperties {
        public static DependencyProperty CultureProperty { get; }
        public static int GetCulture(DependencyObject element);
        public static void SetCulture(DependencyObject element, int value);
      }
    }
    namespace Windows.UI.Xaml.Automation.Peers {
      public class AutomationPeer : DependencyObject {
        int GetCulture();
        virtual int GetCultureCore();
      }
      public sealed class MapControlAutomationPeer : FrameworkElementAutomationPeer, IScrollProvider, ITransformProvider, ITransformProvider2 {
        bool CanMove { get; }
        bool CanResize { get; }
        bool CanRotate { get; }
        bool CanZoom { get; }
        double MaxZoom { get; }
        double MinZoom { get; }
        double ZoomLevel { get; }
        void Move(double x, double y);
        void Resize(double width, double height);
        void Rotate(double degrees);
        void Zoom(double zoom);
        void ZoomByUnit(ZoomUnit zoomUnit);
      }
    }
    namespace Windows.UI.Xaml.Controls {
      public class ContentDialog : ContentControl {
        bool IsTertiaryButtonEnabled { get; set; }
        public static DependencyProperty IsTertiaryButtonEnabledProperty { get; }
        Style PrimaryButtonStyle { get; set; }
        public static DependencyProperty PrimaryButtonStyleProperty { get; }
        Style SecondaryButtonStyle { get; set; }
        public static DependencyProperty SecondaryButtonStyleProperty { get; }
        ICommand TertiaryButtonCommand { get; set; }
        object TertiaryButtonCommandParameter { get; set; }
        public static DependencyProperty TertiaryButtonCommandParameterProperty { get; }
        public static DependencyProperty TertiaryButtonCommandProperty { get; }
        Style TertiaryButtonStyle { get; set; }
        public static DependencyProperty TertiaryButtonStyleProperty { get; }
        string TertiaryButtonText { get; set; }
        public static DependencyProperty TertiaryButtonTextProperty { get; }
        event TypedEventHandler TertiaryButtonClick;
      }
      public enum ContentDialogResult {
        Tertiary = 3,
      }
      public class Control : FrameworkElement {
        Uri DefaultStyleResourceUri { get; set; }
        public static DependencyProperty DefaultStyleResourceUriProperty { get; }
      }
      public sealed class FocusEngagedEventArgs : RoutedEventArgs {
        bool Handled { get; set; }
      }
      public class Frame : ContentControl, INavigate {
        void SetNavigationState(string navigationState, bool suppressNavigate);
      }
      public class InkToolbar : Control {
        InkToolbarButtonFlyoutPlacement ButtonFlyoutPlacement { get; set; }
        public static DependencyProperty ButtonFlyoutPlacementProperty { get; }
        bool IsStencilButtonChecked { get; set; }
        public static DependencyProperty IsStencilButtonCheckedProperty { get; }
        Orientation Orientation { get; set; }
        public static DependencyProperty OrientationProperty { get; }
        event TypedEventHandler BringStencilIntoViewRequested;
        event TypedEventHandler EraserWidthChanged;
        event TypedEventHandler IsStencilButtonCheckedChanged;
        InkToolbarMenuButton GetMenuButton(InkToolbarMenuKind menu);
      }
      public enum InkToolbarButtonFlyoutPlacement
      public class InkToolbarEraserButton : InkToolbarToolButton {
        InkToolbarEraserKind EraserKind { get; set; }
        public static DependencyProperty EraserKindProperty { get; }
        bool IsClearAllVisible { get; set; }
        public static DependencyProperty IsClearAllVisibleProperty { get; }
        bool IsWidthSliderVisible { get; set; }
        public static DependencyProperty IsWidthSliderVisibleProperty { get; }
        double MaxStrokeWidth { get; set; }
        public static DependencyProperty MaxStrokeWidthProperty { get; }
        double MinStrokeWidth { get; set; }
        public static DependencyProperty MinStrokeWidthProperty { get; }
        double SelectedStrokeWidth { get; set; }
        public static DependencyProperty SelectedStrokeWidthProperty { get; }
      }
      public enum InkToolbarEraserKind
      public class InkToolbarFlyoutItem : ButtonBase
      public enum InkToolbarFlyoutItemKind
      public sealed class InkToolbarIsStencilButtonCheckedChangedEventArgs
      public class InkToolbarMenuButton : ToggleButton
      public enum InkToolbarMenuKind
      public class InkToolbarPenConfigurationControl : Control {
        InkToolbarEraserButton EraserButton { get; }
        public static DependencyProperty EraserButtonProperty { get; }
      }
      public class InkToolbarStencilButton : InkToolbarMenuButton
      public enum InkToolbarStencilKind
      public sealed class RichTextBlock : FrameworkElement {
        TextDecorations TextDecorations { get; set; }
        public static DependencyProperty TextDecorationsProperty { get; }
      }
      public sealed class TextBlock : FrameworkElement {
        TextDecorations TextDecorations { get; set; }
        public static DependencyProperty TextDecorationsProperty { get; }
      }
    }
    namespace Windows.UI.Xaml.Controls.Maps {
      public sealed class MapBillboard : MapElement
      public sealed class MapContextRequestedEventArgs
      public sealed class MapControl : Control {
        MapProjection MapProjection { get; set; }
        public static DependencyProperty MapProjectionProperty { get; }
        MapStyleSheet StyleSheet { get; set; }
        public static DependencyProperty StyleSheetProperty { get; }
        Thickness ViewPadding { get; set; }
        public static DependencyProperty ViewPaddingProperty { get; }
        event TypedEventHandler MapContextRequested;
        IVectorView FindMapElementsAtOffset(Point offset, double radius);
        void GetLocationFromOffset(Point offset, AltitudeReferenceSystem desiredReferenceSystem, out Geopoint location);
        void StartContinuousPan(double horizontalPixelsPerSecond, double verticalPixelsPerSecond);
        void StopContinuousPan();
        IAsyncOperation TryPanAsync(double horizontalPixels, double verticalPixels);
        IAsyncOperation TryPanToAsync(Geopoint location);
      }
      public enum MapProjection
      public enum MapStyle {
        Custom = 7,
      }
      public sealed class MapStyleSheet : DependencyObject
    }
    namespace Windows.UI.Xaml.Controls.Primitives {
      public class FlyoutBase : DependencyObject {
        DependencyObject OverlayInputPassThroughElement { get; set; }
        public static DependencyProperty OverlayInputPassThroughElementProperty { get; }
      }
    }
    namespace Windows.UI.Xaml.Documents {
      public sealed class Hyperlink : Span {
        FocusState FocusState { get; }
        public static DependencyProperty FocusStateProperty { get; }
        event RoutedEventHandler GotFocus;
        event RoutedEventHandler LostFocus;
        bool Focus(FocusState value);
      }
      public class TextElement : DependencyObject {
        double KeyTipHorizontalOffset { get; set; }
        public static DependencyProperty KeyTipHorizontalOffsetProperty { get; }
        KeyTipPlacementMode KeyTipPlacementMode { get; set; }
        public static DependencyProperty KeyTipPlacementModeProperty { get; }
        double KeyTipVerticalOffset { get; set; }
        public static DependencyProperty KeyTipVerticalOffsetProperty { get; }
        TextDecorations TextDecorations { get; set; }
        public static DependencyProperty TextDecorationsProperty { get; }
        event TypedEventHandler AccessKeyDisplayDismissed;
        event TypedEventHandler AccessKeyDisplayRequested;
        event TypedEventHandler AccessKeyInvoked;
      }
    }
    namespace Windows.UI.Xaml.Input {
      public sealed class AccessKeyManager {
        public static bool AreKeyTipsEnabled { get; set; }
      }
      public enum KeyTipPlacementMode
      public enum XYFocusKeyboardNavigationMode
    }
    namespace Windows.UI.Xaml.Markup {
      public sealed class XamlMarkupHelper
    }
     
    namespace Windows.Media.Capture {
      public sealed class AppCaptureDurationGeneratedEventArgs
      public sealed class AppCaptureFileGeneratedEventArgs
      public enum AppCaptureMicrophoneCaptureState
      public sealed class AppCaptureMicrophoneCaptureStateChangedEventArgs
      public enum AppCaptureRecordingState
      public sealed class AppCaptureRecordingStateChangedEventArgs
      public sealed class AppCaptureRecordOperation
      public sealed class AppCaptureServices
      public sealed class AppCaptureState
    }
     
    namespace Windows.Services.Store {
      public sealed class StoreContext {
        IAsyncOperation FindStoreProductForPackageAsync(IIterable productKinds, Package package);
      }
    }

    API Removals

    namespace Windows.UI.Composition {
      public sealed class CompositionDrawingSurface : CompositionObject, ICompositionSurface {
      }
    }

    API Additions not yet implemented

    The Bluetooth APIs were included to receive feedback from the Developer community.

    namespace Windows.Devices.Bluetooth {
      public sealed class BluetoothAdapter
      public sealed class BluetoothDeviceId
      public enum BluetoothError {
        TransportNotSupported = 9,
      }
      public sealed class BluetoothLEDevice : IClosable {
        DeviceAccessInformation DeviceAccessInformation { get; }
        IAsyncOperation GetGattServicesAsync();
        IAsyncOperation GetGattServicesAsync(BluetoothCacheMode cacheMode);
        IAsyncOperation GetGattServicesForUuidAsync(GattUuid serviceUuid);
        IAsyncOperation GetGattServicesForUuidAsync(GattUuid serviceUuid, BluetoothCacheMode cacheMode);
        IAsyncOperation RequestAccessAsync();
      }
      public enum BluetoothTransportOptions : uint
    }
    namespace Windows.Devices.Bluetooth.Background {
      public enum BluetoothEventTriggeringMode
      public sealed class GattCharacteristicNotificationTriggerDetails {
        BluetoothError Error { get; }
        BluetoothEventTriggeringMode EventTriggeringMode { get; }
        IVectorView ValueChangedEvents { get; }
      }
      public sealed class GattServiceProviderBackgroundInfo
      public sealed class GattServiceProviderRequestActivityInfo
      public enum GattServiceProviderRequestActivityType
      public enum GattServiceProviderRequestAttributeType
      public sealed class GattServiceProviderTriggerDetails
      public enum GattServiceProviderTriggerReason
    }
    namespace Windows.Devices.Bluetooth.GenericAttributeProfile {
      public sealed class GattCharacteristic {
        IAsyncOperation GetDescriptorsAsync();
        IAsyncOperation GetDescriptorsAsync(BluetoothCacheMode cacheMode);
        IAsyncOperation GetDescriptorsForUuidAsync(GattUuid descriptorUuid);
        IAsyncOperation GetDescriptorsForUuidAsync(GattUuid descriptorUuid, BluetoothCacheMode cacheMode);
        IAsyncOperation WriteValueWithResultAsync(IBuffer value);
        IAsyncOperation WriteValueWithResultAsync(IBuffer value, GattWriteOption writeOption);
      }
      public sealed class GattCharacteristicsResult
      public sealed class GattClientNotificationResult
      public enum GattCommunicationStatus {
        ProtocolError = 2,
      }
      public sealed class GattDescriptor {
        IAsyncOperation WriteValueWithResultAsync(IBuffer value);
      }
      public sealed class GattDescriptorsResult
      public sealed class GattDeviceService : IClosable {
        DeviceAccessInformation DeviceAccessInformation { get; }
        GattSession Session { get; }
        public static IAsyncOperation FromIdAsync(string deviceId, GattSharingMode sharingMode);
        IAsyncOperation GetCharacteristicsAsync();
        IAsyncOperation GetCharacteristicsAsync(BluetoothCacheMode cacheMode);
        IAsyncOperation GetCharacteristicsForUuidAsync(GattUuid characteristicUuid);
        IAsyncOperation GetCharacteristicsForUuidAsync(GattUuid characteristicUuid, BluetoothCacheMode cacheMode);
        public static string GetDeviceSelector(GattUuid gattUuid);
        public static string GetDeviceSelectorForBluetoothDeviceId(BluetoothDeviceId bluetoothDeviceId);
        public static string GetDeviceSelectorForBluetoothDeviceId(BluetoothDeviceId bluetoothDeviceId, BluetoothCacheMode cacheMode);
        public static string GetDeviceSelectorForBluetoothDeviceIdAndGattUuid(BluetoothDeviceId bluetoothDeviceId, GattUuid gattUuid);
        public static string GetDeviceSelectorForBluetoothDeviceIdAndGattUuid(BluetoothDeviceId bluetoothDeviceId, GattUuid gattUuid, BluetoothCacheMode cacheMode);
        IAsyncOperation GetIncludedServicesAsync();
        IAsyncOperation GetIncludedServicesAsync(BluetoothCacheMode cacheMode);
        IAsyncOperation GetIncludedServicesForUuidAsync(GattUuid serviceUuid);
        IAsyncOperation GetIncludedServicesForUuidAsync(GattUuid serviceUuid, BluetoothCacheMode cacheMode);
        IAsyncOperation RequestAccessAsync(GattSharingMode sharingMode);
      }
      public sealed class GattDeviceServicesResult
      public sealed class GattLocalCharacteristic
      public sealed class GattLocalCharacteristicParameters
      public sealed class GattLocalDescriptor
      public sealed class GattLocalDescriptorParameters
      public sealed class GattPresentationFormat {
        public static GattPresentationFormat FromParts(byte formatType, int exponent, ushort unit, byte namespaceId, ushort description);
      }
      public static class GattProtocolError
      public sealed class GattPublishedService
      public sealed class GattReadClientCharacteristicConfigurationDescriptorResult {
        IReference ProtocolError { get; }
      }
      public sealed class GattReadRequest
      public sealed class GattReadRequestedEventArgs
      public sealed class GattReadResponse
      public sealed class GattReadResult {
        IReference ProtocolError { get; }
      }
      public sealed class GattReliableWriteTransaction {
        IAsyncOperation CommitWithResultAsync();
      }
      public sealed class GattServiceProvider
      public sealed class GattServiceProviderAdvertisingParameters
      public sealed class GattServiceProviderResult
      public enum GattServiceProviderStatus
      public sealed class GattServiceProviderStatusChangedEventArgs
      public enum GattServiceType
      public sealed class GattSession : IClosable
      public enum GattSessionStatus
      public sealed class GattSessionStatusChangedEventArgs
      public enum GattSharingMode
      public sealed class GattSubscribedClient
      public sealed class GattUuid
      public sealed class GattWriteRequest
      public sealed class GattWriteRequestedEventArgs
      public sealed class GattWriteResponse
      public sealed class GattWriteResult
    }
    namespace Windows.Devices.Bluetooth.Rfcomm {
      public sealed class RfcommDeviceService : IClosable {
        public static IAsyncOperation FromIdWithResultAsync(string deviceId);
      }
      public sealed class RfcommServiceProvider {
        public static IAsyncOperation CreateWithResultAsync(RfcommServiceId serviceId);
      }
      public sealed class RfcommServiceProviderResult
    }
     
    

    Windows Ink 1: Introduction to Ink and Pen

    $
    0
    0

    Using a pen and computer has an interesting history that goes farther back than you’d think. In 1888, the first patent for a “electric stylus device for capturing handwriting” was issued to Elisha Gray for the Telautograph. In fact, pen input was being used 20 years before mouse and GUI input with systems like the Styalator tablet demonstrated by Tim Diamond in the 1950s and the RAND tablet in the 1960s, both could recognize free hand writing and turn it into computer recognizable characters and words.

    In 1992, Microsoft made its first major entrance into the pen input space with Windows for Pen Computing and also had the NCR tablet that ran Windows 3.1 with pen input as an option to interact with applications.

    New ways to use Windows Ink

    In the Windows 10 Anniversary Update, Inking (pen input) has taken front stage. Microsoft recently announced the Surface Studio. An All in One machine, designed to empower the creative process with a 28 inch, Pen enabled, PixelSense screen. With such a large working area for the Pen and the thin profile of the PC, the user can focus on what matters, the art.

    In addition to having the work front and center, the user can now use new methods of input, such as the Surface Dial, to leverage your application’s inking features. As a developer, you can leverage the Radial Controller APIs to make accessing those inking features a natural and smooth experience for the user.

    Let’s start exploring Windows Ink from two perspectives, the consumer and the developer.

    User’s Perspective

    On PC with stylus support, the Windows Ink Workspace is front and center in the system tray. For the consumer, this a highly convenient option to quickly access the applications in the Workspace; Sticky Notes, Sketchpad and Screensketch, as you see here:

    picture1

    Depending on the PC’s pen you’re using, the pen can provide some natural interactions even for you start writing on the screen. Using a Surface Book as an example, the Surface Pen lets you quickly launch an application by clicking the pen’s eraser. One click, a double click or a click and hold can perform three different things. Which action is taken depends on what is set by the user, this option is highly configurable from the PC’s Pen Settings page, as seen here:

    picture2

    There are other settings you can configure to further customize your experience. Windows 10 already ignores when your palm is touching the screen while you’re writing, but you may want to completely ignore touch altogether. These options can be set on the same settings pane:

    picture3

    Ignoring touch input while using the pen is disabled by default because there are great simultaneous pen and touch scenarios. A good example of this would be the Windows Ink ruler! You can use one hand for the pen and the other hand to move the ruler on the screen.

    Now that’s we’ve taken a high level look at the Windows 10 Anniversary Update’s inking features, let’s switch gears and take a look at it from a developer’s perspective.

    Developer’s Perspective

    Pen input and handwriting recognition traditionally has needed a specialized developer skillset. You would have to detect the strokes made to a canvas via and using complex algorithms determine what character was written. In the Windows 10 Anniversary Update SDK, this is no longer the case. You can add inking support to your application with just a couple lines of code.

    Let’s make a small example that lets the user draw to an area of your UWP (Universal Windows Application) app. This example can be added to any UWP app that is using the 14393 Anniversary SDK.

    To enable inking, you only need to add the following to your XAML.

    That’s it! Where you placed the InkCanvas UIElement is where the user can use a pen and draw on it with the default Ink settings. Here’s what it looks like at runtime after I’ve written a special message:

    picture4

    The InkCanvas built-in defaults makes it very easy to get started. However, what if you wanted to let the user change the color of the ink, or the thickness of the stroke? You can add this functionality quickly by adding an InkToolbar UIElement to your XAML. The only thing you need to do to wire it up, is tell it what InkCanvas is to be used for:

    Note: If you see a XAML designer error when you add the InkToolbar, you can safely ignore this as it is a known issue that is being worked on. Your code will run fine.

    Let’s rerun our test app and see what this looks after using a couple of the InkToolbar’s default tools; the ruler and changing the ink color:

    picture5

    This is all you need to having inking enabled in the app, however you might want to save the user’s strokes so that they can be saved and reloaded at another time.

    Saving and Loading Ink

    You can embed the ink data within a GIF file so that you can save and load the user’s work. This is easily done using the InkPresenter, which is available as a read-only property of the InkCanvas.

    Here’s an example of getting all the ink that’s on the canvas and saving it to a file:

    
            private async Task SaveInkAsync()
            {
                if (inkCanvas.InkPresenter.StrokeContainer.GetStrokes().Count > 0)
                {
                    // Select a StorageFile location and set some file attributes
                    var savePicker = new Windows.Storage.Pickers.FileSavePicker();
                    savePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
                    savePicker.FileTypeChoices.Add("Gif with embedded ISF", new List {".gif"});
    
                    var file = await savePicker.PickSaveFileAsync();
    
                    if (null != file)
                    {
                        using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                        {
                            // This single method will get all the strokes and save them to the file
                            await inkCanvas.InkPresenter.StrokeContainer.SaveAsync(stream);
                        }
                    }
                }
            }
    
    

    Then, the next time the user wants to load in an old drawing, or maybe you want to properly resume an application that was terminated, you only need to load that file back into the canvas. To do this, it’s just as easy as saving it:

    
            private async Task LoadInkAsync()
            {
                // Open a file picker
                var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
                openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
    
                // filter files to show both gifs (with embedded isf) and isf (ink) files
                openPicker.FileTypeFilter.Add(".gif");
                openPicker.FileTypeFilter.Add(".isf");
    
                var file = await openPicker.PickSingleFileAsync();
    
                if (null != file)
                {
                    using (var stream = await file.OpenSequentialReadAsync())
                    {
                        // Just like saving, it's only one method to load the ink into the canvas
                        await inkCanvas.InkPresenter.StrokeContainer.LoadAsync(stream);
                    }
                }
            }
    
    

    To see this code, and many other demos, take a look at the SimpleInk demo from the official Universal Windows Platform examples Github page.

    What’s next?

    Getting started with Windows Ink is quick and easy. However, you can also create some highly customized inking applications. In the next Windows Ink series post, we’ll dig deeper into the InkPresenter, Pen Attributes, Custom Pens, Custom InkToolBar and explore a more complex ink data  scenario that enables sharing and printing!

    Resources

    The week in .NET – .NET Core, ASP.NET Core, EF Core 1.1 – Docker – Xenko

    $
    0
    0

    To read last week’s post, see The week in .NET – Mitch Muenster – Stateless.

    .NET Core, ASP.NET Core, EF Core 1.1, VS for Mac Preview, VS 2017 RC, SQL Server on Linux, Tizen, Google joins .NET Foundation, and Microsoft becomes a Linux Foundation platinum member

    This week, at the Connect(); // 2016 event, we made a number of announcements, including Visual Studio 2017 RC, Visual Studio for Mac Preview, SQL Server on Linux Preview, .NET Core 1.1, Entity Framework Core 1.1, ASP.NET Core 1.1, Samsung adopts .NET in their Tizen OS, Google joins the .NET Foundation, and Microsoft becomes a Linux Foundation platinum member. Check out the announcement posts for all the details.

    On .NET

    Last week, Michael Friis and Glenn Condron were on the show to talk about Docker and .NET:

    This week, we’ll speak with Chad Z. Hower a.k.a. Kudzu to talk about Cosmos, an operating system “construction kit” built with the IL2CPU compiler, C#, and X#, a homebrew language that’s part of the project. This week, because of the Thanksgiving week-end, the show is exceptionally on Wednesday, and begins at 10AM Pacific Time on YouTube. We’ll take questions on the video’s built-in chat.

    Package of the week: mahapps.metro

    mahapps.metro is a toolkit to build Metro-style WPF applications that’s used by the Xamarin Inspector, Xamarin Workbooks and Markdown Monster.

    mahapps.metro

    Tool of the Week: Xenko

    Xenko is an open-source C# game engine that comes with a full toolchain and development environment.

    Xenko Game Studio

    Xenko’s new Script Editor Preview brings complete integration of script code in the Game Studio.

    User group meeting of the week: Cognitive Services, AI as an API in Burlington, MA

    The New England Microsoft Developers group holds a meeting on Thursday, December 1 at 6:30PM in Burlington, MA about Microsoft Cognitive Services and how they give easy access to sentiment analysis, speech recognition, picture and video tagging, search, spell check, and more.

    .NET

    ASP.NET

    F#

    New F# language proposals:

    Check out F# Weekly for more great content from the F# community.

    Xamarin

    Azure

    Games

    And this is it for this week!

    Contribute to the week in .NET

    As always, this weekly post couldn’t exist without community contributions, and I’d like to thank all those who sent links and tips. The F# section is provided by Phillip Carter, the gaming section by Stacey Haffner, and the Xamarin section by Dan Rigby.

    You can participate too. Did you write a great blog post, or just read one? Do you want everyone to know about an amazing new contribution or a useful library? Did you make or play a great game built on .NET?
    We’d love to hear from you, and feature your contributions on future posts:

    This week’s post (and future posts) also contains news I first read on The ASP.NET Community Standup, on Weekly Xamarin, on F# weekly, and on Chris Alcock’s The Morning Brew.

    Windows Ink 2: Digging Deeper with Ink and Pen

    $
    0
    0

    In the last post, we explored a brief history of pen computing and introduced you to how easy it is to get started with Windows Ink in your Universal Windows Platform app. You saw that you can enable inking by adding a single line of code, an InkCanvas, to your app to enable inking. You also saw that adding another single line of code, the InkToolbar, gives the user additional pen-related tools like pen-stroke color and stroke type.

    In this post, we’ll dig deeper into how we can further customize the pen and ink experience to make your application a delightful inking experience for the user. Let’s build a Coloring Book application!

    Customizing The Inking Experience

    Getting Started

    To get started, let’s put in an InkCanvas on the page:

    By default, the InkCanvas’s input is set to only accept strokes from a Pen. However, we can change that by setting the InputDeviceTypes property of the InkCanvas’s InkPresenter. In the page constructor, we want to configure the InkCanvas so that it works for pen, mouse and touch:

    
    myInkCanvas.InkPresenter.InputDeviceTypes = Windows.UI.Core.CoreInputDeviceTypes.Pen 
                    | Windows.UI.Core.CoreInputDeviceTypes.Mouse 
                    | Windows.UI.Core.CoreInputDeviceTypes.Touch;
    
    

    As we did in the last article, we’ll add an InkToolbar and bind it to myInkCanvas, but this time we’re going to put it within a CommandBar. This is so we can keep it next the other buttons that we’ll add later, like Save and Share.

    Note: If you see a XAML designer error when you add the InkToolbar, you can safely ignore this as it is a known issue that is being worked on. Your code will run fine.

    However, this time, we also want to provide the user with some additional InkToolbar options. We have two main ways to do this using the InkToolbar, we can use a

    • Built-in InkToolbar pen button
    • Custom InkToolbar pen button

    Built-in InkToolbar pens

    Let’s start with an example of a built-in option, the InkToolbarBallPointPenButton. This is an ‘out-of-the-box’ InkToolbar button that, when selected in the InkToolbar, activates the BallPointPen. To add this, you place it within the InkToolbar’s content, like so:

    If you ran the app now, your InkToolbar would look like this:

    picture1

    Custom InkToolbar Pens

    Creating a custom pen is rather straightforward and requires very little code. Let’s start with the basic requirement: We need to create a class that inherits from InkToolbarCustomPen and give it some attributes that define how it will draw.  Let’s take this step by step and make a custom highlighter marker.

    First, let’s add a new class to your project.  Name ithe class “MarkerPen,” add the following using statements and inherit from InkToolbarCustomPen:

    
    using Windows.UI;
    using Windows.UI.Input.Inking;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Media;
    
    class MarkerPen : InkToolbarCustomPen
    {
    }
    
    

    In this class, we only need to override the CreateInkDrawingAttributesCore method. Add the following method to the class now:

    
    protected override InkDrawingAttributes CreateInkDrawingAttributesCore(Brush brush, double strokeWidth)
    {
    }
    
    

    Within that method we can start setting some drawing attributes. This is done by making an instance of InkDrawingAttributes and setting some properties. Here are the attributes I’d like the pen to have:

    • Act like a highlighter
    • Has a round pen tip shape
    • Has a red stroke color as the default color
    • Be twice as thick as the user’s stroke

    Here’s how we can fulfill those requirements:

    
    InkDrawingAttributes inkDrawingAttributes = new InkDrawingAttributes();
    
    // Set the PenTip (can also be a rectangle)
    inkDrawingAttributes.PenTip = PenTipShape.Circle;
    
    // Set the default color to Red 
    SolidColorBrush solidColorBrush = brush as SolidColorBrush;
    inkDrawingAttributes.Color = solidColorBrush?.Color ?? Colors.Red;
    
    // Make sure it draws as a highlighter
    inkDrawingAttributes.DrawAsHighlighter = true;
    
    // Set the brush stroke
    inkDrawingAttributes.Size = new Windows.Foundation.Size(strokeWidth * 2, strokeWidth * 2);
    
    return inkDrawingAttributes;
    
    

    That’s it, your custom pen is done. Here’s the completed class:

    
    using Windows.UI;
    using Windows.UI.Input.Inking;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Media;
    
    class MarkerPen : InkToolbarCustomPen
    {
            protected override InkDrawingAttributes CreateInkDrawingAttributesCore(Brush brush, double strokeWidth)
            {
                InkDrawingAttributes inkDrawingAttributes = new InkDrawingAttributes();
                inkDrawingAttributes.PenTip = PenTipShape.Circle;
                SolidColorBrush solidColorBrush = brush as SolidColorBrush;
                inkDrawingAttributes.Color = solidColorBrush?.Color ?? Colors.Red;
                inkDrawingAttributes.DrawAsHighlighter = true;
                inkDrawingAttributes.Size = new Windows.Foundation.Size(strokeWidth * 2, strokeWidth * 2);
                return inkDrawingAttributes;
            }
    }
    
    

    Now, let’s go back to the page where you have your InkToolbar and InkCanvas. We want to create Resources section for your page that contains a StaticResource instance of the custom pen. So, just above the root Grid element, add the following Resources code:

    
    ...

    A quick note about XAML Resources: The page’s resources list is a key/value dictionary of objects that you can reference using the resource’s key. We’ve created an instance of our MarkerPen class, local:MarkerPen, and given it a key value of “MarkerPen” (if you want to learn more about XAML resources, see here).

    We can now use that key in a InkToolbarCustomPenButton’s CustomPen property. This is better explained by the code. Let’s break it down:

    In your InkToolbar, add an InkToolbarCustomPen and give it a name:

    The InkToolbarCustomPen has a CustomPen property:

    We can now set that CustomPen property using the key of our resource:

    Now, let’s set the SymbolIcon for the button:

    Next, let’s add an InkToolbarPenConfigurationControl:

    Let’s take a look at what the InkToolbarPenConfigurationControl does for you. Even with a custom implementation of a pen, you still get to use the out-of-the-box Windows Ink components. If the user clicks on your pen after it’s selected, they’ll get a fly-out containing options to change the color and the size of the pen!

    However, there’s one little tweak we want to make. By default, you get Black and White as the only colors in the flyout:

    picture1

    We want a lot of colors, and fortunately, the BallpointPenButton you added earlier has a palette full of colors. We can just use that same palette for our custom pen by binding to it:

    Now, here’s what the pen configuration control looks after binding the Palette:

    picture3

    Whew, okay, the toolbar is coming along nicely! Here’s what we have so far for our CommandBar:

    Now, let’s start adding some commands.

    Custom InkToolbar Tool Buttons

    The first thing you’d really want in a drawing application is the ability to undo something. To do this we’ll want to add another button to the toolbar; this is easily done using an InkToolbarCustomToolButton. If you’re familiar with adding buttons to a CommandBar, you’ll feel right at home.

    In your InkToolbar, add an InkToolbarCustomToolButton and give it a name, “undoButton.”

    
    ...

    The button has your familiar button properties, such as a Click event and supporting a SymbolIcon for content, so let’s add those as well.

    Here’s what your XAML should look like:

    
    ...

    Now, let’s go to the button’s click event handler.  Here we can do the following to undo strokes that were applied to the InkPresenter, here are the steps:

    First, make sure you add the following using statement to the code-behind:

    
    using Windows.UI.Input.Inking;
    
    

    Then get all the strokes in the InkPresenter’s StrokeContainer:

    
    IReadOnlyList strokes = myInkCanvas.InkPresenter.StrokeContainer.GetStrokes();

    Next, verify that there are strokes to undo before proceeding:

    
    if (strokes.Count > 0)

    If there are strokes, select the last one in the container:

    
    strokes[strokes.Count - 1].Selected = true;
    
    

    Finally, delete that selected stroke using DeleteSelected():

    
    myInkCanvas.InkPresenter.StrokeContainer.DeleteSelected();
    
    

    As you can see, it’s pretty easy to get access to the strokes that were made by the user and just as easy to remove a stroke. Here is the complete event handler:

    
    private void Undo_Click(object sender, RoutedEventArgs e)
    {
        // We can get a list of the strokes that are in the InkPresenter
        IReadOnlyList strokes = myInkCanvas.InkPresenter.StrokeContainer.GetStrokes();
    
        // Make sure there are strokes to undo
        if (strokes.Count > 0)
        {
           // select the last stroke
           strokes[strokes.Count - 1].Selected = true;
    
           // Finally, delete the stroke
           myInkCanvas.InkPresenter.StrokeContainer.DeleteSelected();
        }
    }
    
    

    Final InkCanvas configuration

    Before we conclude the drawing logic, we need to make sure the page loads with some InkDrawingAttributes presets and InkPresenter configuration. To do this, we can hook into the InkCanvas’s Loaded event.

    We can do this in the XAML:

    The attributes are set in a similar way that we set them for the custom pen, instantiate an InkDrawingAttributes object and set some properties. However, this time, we’re passing those attributes to the InkPresenter.

    Additionally, a few other things thing should be addressed:

    • Give the custom pen the same color palette as the ballpoint pen
    • Set the initial active tool
    • Make sure that users can also use the mouse

    Here’s the code for the InkCanvas’s Loaded event handler:

    
    private void InkToolbar_Loaded(object sender, RoutedEventArgs e)
    {
       // Create an instance of InkDrawingAttributes
        InkDrawingAttributes drawingAttributes = new InkDrawingAttributes();
    
        // We want the pen pressure to be applied to the user's stroke
        drawingAttributes.IgnorePressure = false;
    
        // This will set it to that the ink stroke will use a Bezier curve instead of a collection of straight line segments
        drawingAttributes.FitToCurve = true;
    
        // Update the InkPresenter with the attributes
        myInkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);
    
        // Set the initial active tool to our custom pen
        myInkToolbar.ActiveTool = markerButton;
    
        // Finally, make sure that the InkCanvas will work for a pen, mouse and touch
        myInkCanvas.InkPresenter.InputDeviceTypes = Windows.UI.Core.CoreInputDeviceTypes.Pen 
                    | Windows.UI.Core.CoreInputDeviceTypes.Mouse 
                    | Windows.UI.Core.CoreInputDeviceTypes.Touch;
    }
    
    

    Saving, Sharing and Loading

    Now that you’ve got a decent working area, we want to be able to save, load and share the user’s work. In the last post, we showed a simple way to save and load the canvas. However, in our Coloring Book app, we want to have the image and the ink data saved separately so that we can easily share the image for display and sharing purposes, but save, load and edit inking data as well.

    Saving Ink Data

    As we did in the last post, you can save the ink strokes to a file using the StrokeContainer’s SaveAsync method. What we’ll do differently here is right after we’ve saved the ink file, we’ll also save a parallel image file in the cache. Although we’re able to embed the stroke data into the gif we saved, having a temporary image stored in the cache makes sharing and displaying the image in the app more convenient.

    So, at the end of your save button’s click handler, you want to create a new (or get an existing) StorageFile for the image:

    
    // Save inked image.
    StorageFile myInkedImageFile = await folder.CreateFileAsync(Constants.inkedImageFile, CreationCollisionOption.ReplaceExisting);
    await Save_InkedImagetoFile(myInkedImageFile);
    
    

    Next, we pass the myInkedImageFile StorageFile reference to the Save_InkedImageToFile method, which saves the image to the file:

    
    private async Task Save_InkedImagetoFile(StorageFile saveFile)
    {
        if (saveFile != null)
        {
    …
            using (var outStream = await saveFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                await Save_InkedImageToStream(outStream);
            }
    …
         }
    }
    
    

    And finally, we get that bitmap from the canvas into the file in the Save_InkedImageToStream method; this is where we leverage Win2D to get a great looking bitmap from the canvas:

    
    private async Task Save_InkedImageToStream(IRandomAccessStream stream)
    {
        var file = await StorageFile.GetFileFromApplicationUriAsync(((BitmapImage)myImage.Source).UriSource);
    
        CanvasDevice device = CanvasDevice.GetSharedDevice();
    
        var image = await CanvasBitmap.LoadAsync(device, file.Path);
    
        using (var renderTarget = new CanvasRenderTarget(device, (int)myInkCanvas.ActualWidth, (int)myInkCanvas.ActualHeight, image.Dpi))
        {
            using (CanvasDrawingSession ds = renderTarget.CreateDrawingSession())
            {
                ds.Clear(Colors.White); 
                ds.DrawImage(image, new Rect(0, 0, (int)myInkCanvas.ActualWidth, (int)myInkCanvas.ActualHeight));
                ds.DrawInk(myInkCanvas.InkPresenter.StrokeContainer.GetStrokes());
             }
    
             await renderTarget.SaveAsync(stream, CanvasBitmapFileFormat.Png);
        }
    }
    
    

    You might ask, why is there a separate method for getting the stream instead of doing it in one place? The first reason is that we want to be a responsible developer and make sure our method names define what action the methods perform. But more importantly, we want to reuse this method later to share the user’s art. With a stream, it’s not only easier to share, you can even send the image to a printer.

    Sharing the result

    Now that the image is saved, we can share it. The approach here is the same as other UWP sharing scenarios. You want to use the DataTransferManager; you can find many example of how to use this here in the Official UWP samples on GitHub.

    For the purposes of this article, we’ll focus only on the DataTransferManager’s DataRequested method. You can see the full sharing code for this here in the Coloring Book demo on GitHub). This is where the Save_InkedImageToStream method gets to be reused!

    
    private async void DataRequested(DataTransferManager sender, DataRequestedEventArgs e)
    {
        DataRequest request = e.Request;
        DataRequestDeferral deferral = request.GetDeferral();
        request.Data.Properties.Title = "A Coloring Page";
        request.Data.Properties.ApplicationName = "Coloring Book";
        request.Data.Properties.Description = "A coloring page sent from my Coloring Book app!";
        using (InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream())
        {
            await Save_InkedImageToStream(inMemoryStream);
             request.Data.SetBitmap(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
        }
                deferral.Complete();
    }
    
    

    Loading Ink Data from a file

    In our Coloring Book app, we want the user to continue working on previous drawings as if they never stopped. We’re able to save the ink file and capture and save the image of the work, but we also need to load the ink data properly.

    In the last post we covered how to load up the stroke from the file; let’s review this now.

    
    // Get a reference to the file that contains the inking stroke data
    StorageFile inkFile = await folder.GetFileAsync(Constants.inkFile);
    
    if (inkFile != null)
    {
        IRandomAccessStream stream = await inkFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
    
        using (var inputStream = stream.GetInputStreamAt(0))
        {
            // Load the strokes back into the StrokeContainer
            await myInkCanvas.InkPresenter.StrokeContainer.LoadAsync(stream);
        }
    
        stream.Dispose();
    }
    
    

    That’s all there is to loading sketch’s ink data. All the strokes, and the ink’s attributes, will be loaded into the InkCanvas and the user can continue working on his or her creation.

    In the next post, we’ll look at some other real-world applications of Windows Ink and how inking can empower educational and enterprise applications. We’ll also take a look at some of the new hardware and APIs available that make using Windows Ink a go-to item for design professionals.

    Resources

    Windows at Microsoft Connect(); // 2016

    $
    0
    0

    During the Connect(); // 2016, the Windows team talked about the Universal Windows Platform and about some of the great tooling improvements that have happened in recent months.

    Kevin Gallo, VP and Program Manager Director of the Windows Platform team, was joined by Mazhar Mohammed and Dave Alles for an hour-long panel discussion and Q&A on Channel 9. Mazhar is the Director of Partner Services of for the Windows Store team, and Dave is the Group Program Manager for the team that created the Maps app for Windows.

    Check out the video below to see the interesting conversation between leaders of the teams that create the Windows Platform and the Store, and one of the teams that uses both in creating a major Windows app. Kevin talks about why developers should target UWP, while Mazhar discusses the constant improvements in the Store and Dev Center. Dave talks about what a 1st-party app thinks about new features, and interacts with the platform team to provide feedback and request functionality. This is actually very similar to the way external developers provide input and feedback via UserVoice!

    In the keynote, Stacey Doerr joined Scott Hanselman on stage to talk about automated UI testing of Windows apps using WinAppDriver and Appium. This isn’t just for testing UWP apps, but all Windows applications, including applications built in VB6 or Delphi and more. For more details about WinAppDriver, check out Yosef’s in-depth blog post: Windows Application Driver for PC integrates with Appium. Scott also has a great overview on getting started tested on Windows with Appium.

    The Windows teams also did the following four presentations to provide deeper dives into the Desktop Bridge and a set of new and improved developer tooling capabilities:

    Test Controller, Test Agent versions and their usage in different scenarios

    $
    0
    0

    There have been several questions on the different scenarios related to running automated tests in various workflows and which versions can / cannot be used.

    Let’s broadly use the following 2 categories of scenarios:

    1. Test Controller/Test Agent (TC/TA) scenarios – this refers to on-premises load testing, running automated tests in the XAML build workflows, triggering an on-demand execution of automated tests using MTM and creating and managing lab environments using Visual Studio Lab Management.
    2. Team Build / Release Management scenarios – this is for running functional tests in the Team Build / Release Management workflows, using the ‘Visual Studio Test Agent Deployment’ and ‘Run Functional Tests’ tasks from the task catalog.

    Agents for Visual Studio 2013 Update 5

    • Can be used for TC/TA scenarios
    • Cannot be used for Team Build/Release Management scenarios
    • Can run tests that were built using Visual Studio 2013 and Visual Studio 2015.

    Agents for Visual Studio 2015 and Agents for Visual Studio 2015 Update 3

    • Cannot be used for TC/TA scenarios
    • Can be used for Team Build / Release Management scenarios
    • Can run tests that were built using Visual Studio 2015 and Visual Studio 2013.

    Agents for Visual Studio 2017 Preview

    • Can be used for TC/TA scenarios
    • Cannot be used for Team Build / Release Management scenarios in the current Preview release. The support for this scenario will be added in the Visual Studio 2017 RTM timeframe.
    • Can run tests that were built using Visual Studio 2017 RC.

    TFS 2017 RTM

    • ‘Visual Studio Test Agent Deployment’ and ‘Run Functional Tests’ tasks in the Team Build / Release Management scenarios use the Agents for Visual Studio 2015 Update 3 package. As such, the tasks in their current form can be used for running tests built using Visual Studio 2015 and Visual Studio 2013. In the TFS 2017 Update 1 timeframe, the tasks will be updated to leverage Agents for Visual Studio 2017 so that you can then also run tests built using Visual Studio 2017 in Team Build/Release Management.

    Content for the various download locations for these SKUs is being updated as well.


    Windows Ink 3: Beyond Doodling

    $
    0
    0

    In the first post in this series, we took a quick look at Windows Ink using the InkCanvas and saw that it can be as simple as one line of code to add inking support to your application. In the second post, we show you how to customize the Ink experience in your app with InkToolbarCustomPen and InkToolbarCustomToolButton, in addition to the out-of-the box items like InkToolbarBallpointPenButton and InkToolbarPenConfigurationControl.

    In both of those explorations, we stayed within the context of a drawing style application. In today’s post, we will look at how Windows Ink can be used to bring the natural input experience of using a pen to other types of applications and scenarios.

    Pen input can be useful in a majority of applications that require some sort of user input. Here are a few examples of such a scenario:

    • Healthcare: Doctors, nurses, mental health professionals
      • A digital Patient Chart, allowing a medical professional to keep using the efficient natural note keeping of medical shorthand alongside accurate data entry.
    • School: Teachers, students, and administrators
      • A student could take an exam using Windows Ink on a digital exam and the teacher could mark up on that actual exam as if it were paper.
    • Field services: Police, fire, utility engineers
      • Detectives generally keep a small notepad with them to record investigative details. Using ink to input these details allows the notes to be digitally searchable, this allows for faster situational awareness and AI interpretation.
    • Music: composers, musicians
      • Writing notation digitally with a pen combines the world of natural input with the power of digital music processing

    Let’s explore two of those possibilities: music and healthcare.

    A Music Scenario

    Music composition has traditionally been a pen and paper experience. You may or may not have paper with the music staves already printed on it, but in the end, the composer is the one who writes down the notes, key signatures, and other musical notation for a musician to play. Composers have been trained and have years of experience writing music on paper.

    What if an application uses a digital pen and the screen as the main method for the composer to create music? The pen input would be a natural way to input the information, but also gain the advantages of having software process that information.

    An example of this processing would be for validation of the musical notation; it would also offer a way for the music to be played back immediately after entering that information. There have been many programs in the past that allow for music notation to be entered and played back, but using a pen instead of a keyboard and mouse brings this to a new, natural, level.

    A Healthcare Scenario

    Healthcare professionals have long used pen and paper to record and convey important information. Sometimes this information is written using a medical shorthand on patient charts. This shorthand contains a lot of information in a smaller area so medical professionals can read a patient’s chart quickly.

    However, we also have information that needs to fully written out, like a patient’s name or instructions to a patient for follow-up. This kind of information should be in the form of text clearly readable by anyone and usable for data entry.

    We can fulfill both of these requirements with Windows Ink. For the notation and shorthand, we can record the ink strokes as we did previously in the sketching app examples. For the text entry, you can convert the ink using handwriting recognition.

    Let’s make a small Medical Chart demo app to see how this is done.

    Simple Doctor’s notes app

    To show how you can implement enterprise features, let’s use Handwriting Recognition! You can easily get the user’s stroke as text using the InkCanvas and just a few lines of code. This is all built-into the SDK, no extraneous coding or specialized skillset required.

    Let’s start with a File > New UWP app and on the MainPage, let’s make three Grid rows. The top two rows will contain two different InkCanvas objects and the last row is for a CommandBar with a save button.

    The second row’s InkCanvas will be for the doctor’s handwritten using shorthand. It is more like a sketch app and is tied to an InkToolbar. The ink will be pressure-sensitive and can be further altered using the InkToolbar. You can go back to the last post in this series to see how to do this.

    Here’s a quick sketch of what the page layout should be:

    picture1

    Now that we have a general page layout, let’s focus on the top InkCanvas first. This is the one we’ll use for handwriting recognition for the patient’s name. We want the ink to be plain and clear, so we don’t want an InkToolbar for this InkCanvas.

    This code for this row is:

    Now let’s look at the second row’s InkCanvas. This is the one we want to have an InkToolbar for so the notes can have a rich ink experience. Here’s what that implementation looks like:

    There are a couple other little things we want to add, for example the TextBlock at the top of the page where the patient’s name would appear after the handwriting recognition is complete. Let’s take a look at the entire page with all the parts in place:

    With the front end done, let’s look at the code-behind and examine the InkCanvas setup and button click event handlers. In the page constructor, we set up some inking attributes for both InkCanvases (put this code after InitializeComponent in the page constructor):

    
    // Setup the top InkCanvas
    NameInkCanvas.InkPresenter.InputDeviceTypes =
                    Windows.UI.Core.CoreInputDeviceTypes.Mouse |
                    Windows.UI.Core.CoreInputDeviceTypes.Pen;
                
    NameInkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(new InkDrawingAttributes
    {
         Color = Windows.UI.Colors.Black,
         IgnorePressure = true,
         FitToCurve = true
    });
    
    // Setup the doctor's notes InkCanvas
    NotesInkCanvas.InkPresenter.InputDeviceTypes =
                    Windows.UI.Core.CoreInputDeviceTypes.Mouse |
                    Windows.UI.Core.CoreInputDeviceTypes.Pen;
    
    NotesInkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(new InkDrawingAttributes
    {
        IgnorePressure = false,
        FitToCurve = true
    });
    
    

    To get the patient’s name into the chart, the healthcare worker writes the name in the top InkCanvas and presses the RecognizeHandwritingButton. That button’s click handler is where we do the recognition work. In order to perform handwriting recognition, we use the InkRecognizerContainer object.

    
    var inkRecognizerContainer = new InkRecognizerContainer();
    
    

    With an instance of InkRecognizerContainer, we call RecognizeAsync and pass it the InkPresenter’s StrokeContainer and InkRecognitionResult — all to tell it to use all the ink strokes.

    
    // Recognize all ink strokes on the ink canvas.
    var recognitionResults = await inkRecognizerContainer.RecognizeAsync(
                        NameInkCanvas.InkPresenter.StrokeContainer,
                        InkRecognitionTarget.All);
    
    

    This will return a list of InkRecognitionResult which you can iterate over and call GetTextCandidates in each iteration. The result of GetTextCandidates is a list of strings that the recognition engine thinks best matches the ink strokes. Generally, the first result is the most accurate, but you can iterate over candidates to find the best match.

    Here’s the implementation of the doctor’s note app; you can see that it just uses the first candidate to demonstrate the approach.

    
     // Iterate through the recognition results, this will loop once for every word detected
    foreach (var result in recognitionResults)
    {
        // Get all recognition candidates from each recognition result
        var candidates = result.GetTextCandidates();
    
        // For the purposes of this demo, we'll use the first result
        var recognizedName = candidates[0];
    
        // Concatenate the results
        str += recognizedName + " ";
    }
    
    

    Here is the full event handler:

    
    private async void RecognizeHandwritingButton_OnClick(object sender, RoutedEventArgs e)
    {
        // Get all strokes on the InkCanvas.
        var currentStrokes = NameInkCanvas.InkPresenter.StrokeContainer.GetStrokes();
    
        // Ensure an ink stroke is present. 
        if (currentStrokes.Count < 1)
        {
            await new MessageDialog("You have not written anything in the canvas area").ShowAsync();
            return;
        }
    
        // Create a manager for the InkRecognizer object used in handwriting recognition.
        var inkRecognizerContainer = new InkRecognizerContainer();
    
        // inkRecognizerContainer is null if a recognition engine is not available.
        if (inkRecognizerContainer == null)
        {
            await new MessageDialog("You must install handwriting recognition engine.").ShowAsync();
            return;
        }
    
        // Recognize all ink strokes on the ink canvas.
        var recognitionResults = await inkRecognizerContainer.RecognizeAsync(
                        NameInkCanvas.InkPresenter.StrokeContainer,
                        InkRecognitionTarget.All);
    
        // Process and display the recognition results.
        if (recognitionResults.Count < 1)
        {
            await new MessageDialog("No recognition results.").ShowAsync();
            return;
        }
    
        var str = "";
    
        // Iterate through the recognition results, this will loop once for every word detected
        foreach (var result in recognitionResults)
        {
            // Get all recognition candidates from each recognition result
            var candidates = result.GetTextCandidates();
    
            // For the purposes of this demo, we'll use the first result
            var recognizedName = candidates[0];
    
            // Concatenate the results
            str += recognizedName + " ";
        }
    
        // Display the recognized name
        PatientNameTextBlock.Text = str;
    
        // Clear the ink canvas once recognition is complete.
        NameInkCanvas.InkPresenter.StrokeContainer.Clear();
    }
    
    

    Last, although we covered this in detail in the last post, let’s review how to save the doctor’s notes via InkCanvas ink strokes to a GIF file with embedded ink data:

    
    private async void SaveChartButton_OnClick(object sender, RoutedEventArgs e)
    {
        // Get all strokes on the NotesInkCanvas.
        var currentStrokes = NotesInkCanvas.InkPresenter.StrokeContainer.GetStrokes();
    
        // Strokes present on ink canvas.
        if (currentStrokes.Count > 0)
        {
            // Initialize the picker.
            var savePicker = new FileSavePicker();
            savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
            savePicker.FileTypeChoices.Add("GIF with embedded ISF", new List() { ".gif" });
            savePicker.DefaultFileExtension = ".gif";
    
            // We use the patient's name to suggest a file name
            savePicker.SuggestedFileName = $"{PatientNameTextBlock.Text} Chart";
                    
            // Show the file picker.
            var file = await savePicker.PickSaveFileAsync();
    
            if (file != null)
            {
                // Prevent updates to the file until updates are finalized with call to CompleteUpdatesAsync.
                CachedFileManager.DeferUpdates(file);
    
                // Open a file stream for writing
                using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                using (var outputStream = stream.GetOutputStreamAt(0))
                {
                    await NotesInkCanvas.InkPresenter.StrokeContainer.SaveAsync(outputStream);
                    await outputStream.FlushAsync();
                }
    
                // Finalize write so other apps can update file.
                var status = await CachedFileManager.CompleteUpdatesAsync(file);
    
                if (status == FileUpdateStatus.Complete)
                {
                            PatientNameTextBlock.Text += " (saved!)";
                }
            }
        }
    }
    
    

    Here’s what the app looks like at runtime:

    picture2

    This is just a simple example of how to combine different uses of Windows Ink, but it demonstrates the usefulness of using Windows Ink in an enterprise scenario and that it’s much more than just a doodling tool.

    The patient’s name was recognized and placed in the TextBlock at the top of the app and the doctor’s notes on the bottom can be saved to a file and reloaded exactly as it was written.

    Here’s what the doctor’s notes file looks like in Windows File Explorer after it’s been saved. It’s a GIF but also has the embedded ink data that you can load back into the app as ink strokes.

    picture3

    What’s next?

    Think about how you can add inking support to your next application applications. How can adding natural use input with a pen help your user enter data in a seamless and delightful manner? You can add Inking support with just a few lines of code and bring the Windows Ink experience to your users.

    We look forward to the exciting app ideas and scenarios you create using Windows Ink. Let us know what you create by leaving us a comment below, sending us a tweet or post on our Facebook page.

    Resources

    The post Windows Ink 3: Beyond Doodling appeared first on Building Apps for Windows.

    Follow a PR, task versioning, and search for commits in branches – Nov 23

    $
    0
    0

    Note: The improvements discussed in this post will be rolling out throughout the next week.

    We have a bunch of new features rolling out this sprint.

    Search for commits in branches

    You can now search for a commit in a specified branch or a tag by clicking on the Search in branches button on the commit details page.

    commit search

    You can select tags and branches in the window to view whether these branches and tags contain the particular commit.

    commit search dialog

    Search for a file or folder in commit history

    Similar to the files tab, users can now search for a file or folder in a repository and see the history of commits for that file or folder. For any Git repository, go to the path control box on the History tab and start typing to initiate a history search experience for the file or folder you are looking for.

    commit history

    Follow a pull request

    You can now follow a pull request to stay notified of any changes via email alerts. The option to Follow is available in the context menu.

    Follow PR

    Restart pull request merge

    Another option has been added to re-attempt the merge for a pull request where the target branch has been updated. This Restart merge option is useful when you want to verify that recent changes to the target branch haven’t created conflicts or broken your PR build.

    Completion blocked on rejected pull requests

    Branches that have the code review policy set will notice that the PR is unable to be completed if it is rejected by one or more reviewers. Many users expect this behavior, so we’ve changed the default behavior. For teams that want the original behavior, there is a new option in the branch policy setting page.

    code review policy

    Markdown in pull request description

    Spice up your pull request description with Markdown. The same Markdown support you know and love in pull request comments is now available in the pull request description.

    Task versioning for Build and Release definitions

    By popular request, we’re giving you control over the major version of a task that you run in your build or release. We expect this change to result in fewer unpredictable errors that were caused by automatic updates to the agent and task version. You now specify the major version of the task on the Build tab of your definition, or on the Environments tab of your release definition.

    When a minor version is released (for example, 1.2 to 1.3), you get that change automatically in your build. But if a new major version is released (for example 2.0), then your build stays locked to version 1.3 until you edit the definition and manually change to the new major version. A flag in the build definition alerts you to new major versions.

    If you select a version named something such as 1.* (preview), keep in mind that this version is still under development and might have known problems.

    Tip: In a build definition you’ve got a few options to test a new major version of a task:

    • If you change the version and have problems, you can revert the change from the history tab.
    • Clone the build definition and test the cloned definition with the new major task version.

    Hosted Linux pool preview

    We’re offering a preview of our new hosted Linux pool to enable you to build and release on Linux machines without having to configure a private agent.

    The agents in the hosted Linux pool run on an Ubuntu Linux host inside the vsts-agent-docker container. This container includes all the standard Java, Node, Docker and .NET Core tooling. When we start the container we map in the Docker socket from the host VM and the working folder from /opt/vsts/work. This enables you to create or spawn other Docker containers as part of your build or release process using either a script or the Docker extension in the Visual Studio Marketplace.

    To use the Hosted Linux pool:

    • In your build definition, go to the General tab, open the Default agent queue menu, and then select Hosted Linux.
    • In your release definition, go to the Environments tab, select your Run on agent task, open the Deployment queue menu, and then select Hosted Linux.

    If you don’t see the option yet, just give it a little time. We’re rolling this option out to accounts over the next few weeks.

    Build and deploy Docker apps to Azure more easily

    To make continuous integration and deployment (CI/CD) of Docker apps a whole lot simpler for you, we’ve:

    • Updated the Docker extension with support for Azure Container Service and Azure Container Registry.
    • Begun a preview of the Hosted Linux pool preview so that you don’t have to set up your own Docker hosts.
    • Released Visual Studio 2017 RC and included new continuous delivery tools for ASP.NET Core Preview apps. You can use these tools to configure a CI/CD process quickly in Team Services. Any ASP.NET Core project with Docker support enabled can be set up to run an automated build and deployment to Azure Container Service with every Git push.

    New licensing model for Build and Release Management

    Over the next two weeks, Build and Release Management will move from the current agent-based licensing model to a concurrent pipeline based licensing model. Each pipeline lets you run one build or deploy one release at a time. The maximum number of concurrent builds that you can run and releases that you can deploy at the same time is limited only by the number of pipelines that you have.

    Your Team Services account includes these free amounts:

    • One free Hosted Pipeline: With this free hosted pipeline, you get 4 hours (240 minutes) per month and a maximum duration of 30 minutes per build or deployment. If you just need more build time for once concurrent build or release, buy another hosted pipeline without the 4-hour limit to increase your maximum duration per build or deployment up to 6 hours. For more concurrent builds or releases, buy more hosted pipelines.
    • One free Private Pipeline: With this free private pipeline, run unlimited concurrent builds or deploy one release at a time in Team Foundation Server 2017, or run one build or deploy one release at a time in Team Services on agent software from Microsoft. Private agents are now free and unlimited. In TFS, each Visual Studio Enterprise subscriber also contributes a private pipeline that you can use. You can also buy more private pipelines.

    For more information, see Concurrent build and release pipelines in Team Services and Concurrent release pipelines in TFS.

    If you previously bought private agents in the Azure portal, they’ll automatically roll into private pipelines. Similarly, any hosted agents that you purchased become Hosted pipelines. With the new licensing model, you can register any number of private agents with your account. In effect, the new model gives you more than what the previous model did, for the same price.

    NuGet + Credential Provider Bundle updated

    We’ve updated the NuGet + Credential Provider Bundle to NuGet 3.5. NuGet 3.5 contains many performance improvements and bug fixes, and we recommend updating to it at your convenience.

    Delete test artifacts

    Customers already had the ability to delete work items, except for test artifacts and any work items which are linked to test artifacts. With this update, users will now have the ability to permanently delete test artifacts—test plans, test suites, test cases, shared parameters and shared steps—both from the Test hub and the Work hub by using the Permanently delete option in the work item form context menu.

    delete test artifacts menu

    Deletion of a test artifact not only deletes the selected artifact but also all the child items like child test suites, tests across all configurations and testers, their test result history and other associated history that fall in its hierarchy. In the confirmation dialog box, users can view the impact of their delete operation to help them make an informed decision.

    delete test artifacts confirm

    Inline service connections in Build and Release

    With this feature, you can create service connections right in the build/release definition without having to navigate to the Services tab. This will be auto-enabled for all extensions which are defined declaratively, such as Docker, Jenkins, VMWare, and SCVMM.

    Until now, release definitions could only link artifact sources from the current project. Now, you can now link build artifacts from another project as well. While linking an artifact, the project drop down will list all the projects in the account.

    build artifacts

    As always, if you have ideas on things you’d like to see us prioritize, head over to UserVoice to add your idea or vote for an existing one.

    Thanks,

    Erin Dormier

    Dev Projects for the Long Weekend

    $
    0
    0

    Find your favorite chair, kick your feet up and grab yourself a cup of coffee. It’s finally time to pick up some of the dev projects you’ve been eyeballing from behind the hazy fog of pre-vacation deadlines.

    For the long weekend, we’ve assembled a quick list of three projects we’ll be working on between family time and scouring Stack Overflow for answers to life’s questions. Take a look below to get started!

    IoT for the Whole Family

    IoT projects can be both fun and practical – take a look at a few of our favorite selections below. After securing your home with an IoT Security Camera and automating the rest of your house, you might really need to think about rewarding yourself with that automated Kegerator. Just saying.

    Explore the Devices and Sensors GitHub Library

    Thirty-five samples to work with right here, folks! With these samples, you can get familiar with the API usage patterns that make the UWP unique. This section has code samples for accelerometers, relative inclinometers and pretty much everything in between.

    Dive into Microsoft Open Source Code

    We’re still reeling in the excitement about our partnership with the Linux Foundation and the steps we’re taking to make the UWP an increasingly open platform. Take a look at our existing Open Source projects over on Github to see how you can get started.

    And that’s all! Have a great long weekend and remember to tweet us if you have any questions or comments!

    Download Visual Studio to get started.

    The Windows team would love to hear your feedback.  Please keep the feedback coming using our Windows Developer UserVoice site. If you have a direct bug, please use the Windows Feedback tool built directly into Windows 10.

    The post Dev Projects for the Long Weekend appeared first on Building Apps for Windows.

    Search Bing to Find Holiday Hours for Local Businesses

    $
    0
    0
    Many businesses change their hours of operation during the holiday season. Some stores close on Thanksgiving, some restaurants shorten their service hours, and some national retailers even open the evening of Thanksgiving so people can start Black Friday shopping festivities early. These fluctuating hours of operation make it difficult to plan shopping and dining outings.
     
    To help, Bing local is collaborating with business owners and trusted partners to get accurate holiday hours in real time. When you search for local businesses, you’ll receive up-to-date changes for holiday hours.
     
    You will see upcoming holiday hours and closures highlighted a week before the big event, making it easy to schedule your plans.



    Holiday Hours
      
    The Bing holiday hours feature will be launched to both Desktop and Mobile immediately for all holidays moving forward. Feedback is always welcome.
       
    Happy Holidays,
    The Bing Team


     

    The 2016 Christmas List of Best STEM Toys for your little nerds and nerdettes

    $
    0
    0

    Last year my 9 year old asked, "are we nerds yet?" Being a nerd doesn't have the negative stigma it once did. A nerd is a fan, and everyone should be enthusiastic about something. You might be a gardening nerd or a woodworking nerd. In this house, we are Maker Nerds. We've been doing some 3D Printing lately, and are trying to expand into all kinds of makings.

    NOTE: We're gearing up for another year of March Is For Makers coming soon in March of 2017. Now is a great time for you to catch up on the last two year's amazing content with made in conjunction with http://codenewbie.org!

    Here's a Christmas List of things that I've either personally purchased, tried for a time, or borrowed from a friend. These are great toys and products for kids of all genders and people of all ages.

    Sphero Star Wars BB-8 App Controlled Robot

    Sphero was a toy the kids got for Christmas last year that they are still playing with. Of course, there's the Original Sphero that's just a white ball with zero personality. I remember when it  came out and I was like, "meh, ok." But then Star Wars happened and I tell ya, you add a little head on the thing and give it some personality and it's a whole new toy.

    Sphero Star Wars BB-8 App Controlled Robot

    The Sphero team continues to update the firmware and software inside BB-8 even now and recently added a new "Sphero Force Band" so you can control Sphero with gestures.

    However, the best part is that Sphero supports a new system called "The SPRK Lightning Lab" (available for Android, iOS, or other devices) that lets kids program BB-8 directly! It's basically Scratch for BB-8. You can even use a C-style language called OVAL when you outgrow their Scratchy system.

    Meccano Micronoids

    81r9vmEHZvL._SL1500_

    I grew up in a world of Lincoln Logs and Erector Sets. We were always building something with metal and screws. Well, sets like this still exist with actual screws and metal...they just include more plastic than before. Any of these Meccano sets are super fun for little builders. They are in some ways cooler than LEGO for my kids because of the shear size of them. The Meccano Meccanoid 2.0 is HUGE at almost two feet tall. It's got 6 motors and there's three ways to program it. There's a large variety of Meccano robot and building kids from $20 on up, so they fit most budgets.

    Arduino UNO Project Super Starter Kit from Elegoo

    91XepSwZP5L._SL1457_

    Arduino Kits are a little touch and go. They usually say things like "1000 pieces!"...but they count all the resistors and screws as a single part. Ignore that and try to look at the underlying pieces and the possibilities. Things move quickly and you'll sometimes need to debug Arudino Programs or search for updates but the fundamentals are great for kids 8-13.

    I particularly like this Elegoo Arduino UNO Starter Kit as it includes everything you'll need and more to start playing immediately. If you can swing a little more money you can add on touchscreens, speakers, and even a little robot car kit, although the difficulty ratchets up.

    Snap Circuits

    Snap Circuits

    I recommended these before on twitter, and truly, I can't sing about them enough. I love Snap Circuits and have blogged about them before on my blog. We quickly outgrew the 30 parts in the Snap Circuits Jr. Even though it has 100 projects, I recommend you get the Snap Circuits SC-300 that has 60 parts and 300 projects, or do what we did and just get the Snap Circuits Extreme SC-750 that has 80+ parts and 750 projects. I like this one because it includes a computer interface (via your microphone jack, so any old computer will work!) as well as a Solar Panel.

    In 2016 Snap Circuits added a new "3D" kit that lets you build not just on a flat surface but expands building up walls! If you already have a SnapCircuits kit, remember that they all work together so you can pick this one up as well and combine them!

    91NYoJujYYL._SL1500_

    Secret Messages Kit

    It's a fact - little kids LOVE secret messages. My kids are always doing secret notes with lemon juice as invisible ink. This kit brings a ton of "hidden writing systems" together in one inexpensive package. Ciphers, Braille, Code Breaking, and more are all combined into a narrative of secret spy missions.

    817VYGOwvkL._SL1200_

    What educational toys do YOU recommend this holiday season?

    FYI: These Amazon links are referral links. When you use them I get a tiny percentage. It adds up to taco money for me and the kids! I appreciate you - and you appreciate me-  when you use these links to buy stuff.


    Sponsor: Help your team write better, shareable SQL faster! Discover how your whole team can write better, shareable SQL faster with a free trial of SQL Prompt. Write, refactor and share SQL effortlessly, try it now.


    © 2016 Scott Hanselman. All rights reserved.
         
    Viewing all 10804 articles
    Browse latest View live


    <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>