Quantcast
Channel: Infragistics Community
Viewing all 2223 articles
Browse latest View live

Top 3 new features in iOS 7

$
0
0

At approximately 10AM Pacific Time (1PM Eastern), Apple will pull the trigger on the iOS 7 update. Tons of apps have been updated (just check your updates right now, you’ll see) and those that haven’t will very soon stick out like a sore thumb on the new operating system. I know a lot of people who are not excited about iOS 7. For many, it’s because they don’t like the aesthetic changes. However, I feel like everyone who is able should upgrade to iOS 7 immediately today. Since I feel so strongly about this, I want to share my 3 favorite new features of iOS 7 and why I think they make iOS 7 a must upgrade.

Control Center

According to Apple, “Control Center gives you quick access to the controls and apps you always seem to need right this second. Just swipe up from any screen — including the Lock screen — to do things like switch to Airplane mode, turn Wi-Fi on or off, or adjust the brightness of your display.” The ability to bring up quick toggles for common features is not new to smartphones. While many will tell you that “Android had it first”, the feature was on iPhones (albeit through the jailbreak community via SBSettings and similar) long before Android had it. That being said, the average iPhone user does not jailbreak and has sorely been in need of this feature. What can you do from Control Center (accessed by swiping up from the bottom of the screen)? Here’s a list:

  • Toggle airplane mode, WiFi, Bluetooth, Do Not Disturb, and Rotation Lock
  • Change screen brightness
  • Audio/video controls including: current track info, skip back/rewind, play, skip forward/fast forward, AirPlay
  • Raise/lower volume
  • Change AirDrop settings (more on AirDrop in the next section)
  • Quick access to: turn on back LED for flashlight, Clock app, Calculator app, and Camera app

Honestly, this is my absolute favorite iOS 7 feature and it is easily the thing that everyone should upgrade for. It will change your iOS usage patterns almost immediately after you remember you don’t need to go to the Settings app anymore.

IMG_0829

AirDrop

My second favorite feature of iOS 7 is AirDrop. AirDrop allows you to send photos, videos, contacts, and even files (if you have the right apps) from one iOS 7 device to another. No setup is required and you can even send these files to a person you just met. Anything that can be shared using the Share button within an app is eligible to be shared through AirDrop. This makes apps like Dropbox and GoodReader, which manage files, incredibly powerful in an AirDrop workflow. I can easily send anything from my iPhone to my iPad using AirDrop and vice versa. You can configure AirDrop so that no one can see you, only people in your Contacts list can see you, or everyone with an iOS 7 device near you can see you for AirDrop. Transfers occur over WiFi Direct or Bluetooth and are really fast. They’re also encrypted for a little bit of extra security. Try it, you’ll like it. Only gripe is that for now, AirDrop doesn’t work with the Mac (which has had the feature for a while). Here’s hoping this comes in OS X Mavericks and iOS 7.1.

IMG_0830

New background task privileges

This is something you won’t be able to see because it’s one of those “behind the scenes” developer features that will slowly make its way into your favorite apps. Apple has finally allowed applications to periodically run tasks in the background to keep their content fresh while the aren’t running. In order to keep the impact on battery life and network usage low, there is a limit to how often this will occur and it will only work on applications that are still running in the background. Where this feature will be huge is for applications like Facebook. I use Facebook on the iPhone a lot and the most annoying thing about the application is waiting for it to update the timeline and then load the notifications (which is what I opened the app for in the first place so the ordering is weird). In theory, and hopefully in practice, Facebook can update their app for iOS 7 to periodically load new stuff into my timeline and notifications so that when I come back to the app the new content is already there. This will be awesome once all of my favorite apps implement this new feature.

Summary

My top 3 features only scratch the surface of what has been added to iOS 7. I’ve intentionally avoided the visual refresh because I realize it is a touchy subject. I really like the visual changes but I know a lot of people aren’t as fond. That’s fine and they’re entitled to that opinion. However, the functional changes to the OS should not be ignored because of the visual changes. So, when iOS 7 is available I think everyone should run, not walk, to update their devices. You won’t be disappointed.

(Disclaimer: Make sure to back up your data before doing the update. I haven’t had any issues updating, but you never know. There’s an excellent guide at 9to5Mac that walks through backing up to both iCloud and your computer. Please do this first.)

Contact

If you want to comment or reach out to me, the best place to do that is on Twitter @brentschooley. I can also be reached via email at bschooley@infragistics.com.


BigDesignEvents.com

$
0
0

Infragistics is happy to announce its’ sponsorship of this year’s upcoming Big Design Conference!

Big Design Conference is a design-centered event that will take place from October 17-19, 2013 at the Crown Plaza Hotel in Addison, TX. While the main focus of the event is catered more towards user experience design, if your design profession falls within the scope of strategy, mobile, gaming, code development, usability, or film design, then you have all the reason you need to immerse yourself in this learning-intense atmosphere.

Come join Bronze Sponsor Infragistics and meet experts from all corners of the nation as they gather to present their research, experience and theories. Among the list of honored guests are numerous mobile, web, and usability designers, content strategists, developers, and many more! Keynote speakers for Big Design Conference 2013 include:

A fantastic collection of keynote speakers, informative workshops, networking galore; the Big Design Conference has it all, whether you’re just starting or a seasoned pro! And as a special offer to friends of Infragistics, Big Design is offering 20% off registration fees when you use Promo Code: indigo. Register now– we’ll see you there!

Using jQuery Upload Control and HTML5 Video Player to create Video Gallery

$
0
0

The UI package contains different useful features. In this blog you will see how to create a simple video gallery using File Upload and Video Player Interaction controls similar to that one:

Getting started

This is an ASP.NET MVC project. To get our controls working we need to include Infragistics.Web.Mvc.dll library. To use Ignite UI in your View using Razor just add the following line:

Code Snippet
  1. @using Infragistics.Web.Mvc;

Generally,  when we create a MVC projects we don’t need to add jQuery scripts, because they are already included. So the only thing we need to add are the Infragistics scripts after them just like that:

Code Snippet
  1. <linktype="text/css"href="@Url.Content("~/Content/css/themes/infragistics/infragistics.theme.css")"rel="stylesheet"/>
  2. <linktype="text/css"href="@Url.Content("~/Content/css/structure/infragistics.css")"rel="stylesheet"/>
  3. <scripttype="text/javascript"src="@Url.Content("~/Scripts/infragistics.core.js")"></script>
  4. <scripttype="text/javascript"src="@Url.Content("~/Scripts/infragistics.lob.js")"></script>

Don’t forget to append the Infragistics CSS folder and scripts to the appropriate folders in your project. These files you can find in the installation folder:

 

The File Upload

It is easy to use the Ignite UI File Upload, you just have to choose whether you want to upload one file at a time or multiple files and write the suitable code:

Single upload:

Code Snippet
  1. @(  Html.Infragistics().Upload()
  2. .ID("igUpload1").AddClientEvent("fileUploaded","UpHand")
  3. .AutoStartUpload(true)
  4. .ProgressUrl("/IGUploadStatusHandler.ashx")
  5. .Render()
  6. )

 

 

Multiple upload:

Code Snippet
  1. @(  Html.Infragistics().Upload()
  2. .ID("igUpload1").AddClientEvent("fileUploaded","UpHand")
  3. .Mode(UploadMode.Multiple)
  4. .MultipleFiles(true)
  5. .MaxUploadedFiles(5)
  6. .MaxSimultaneousFilesUploads(2)
  7. .AutoStartUpload(true)
  8. .ProgressUrl("/IGUploadStatusHandler.ashx")
  9. .Render()
  10. )

 

 

We are using MVC project, so it is necessary to ignore the URL of the HTTP handler in the Global.asax file. The following is the configuration for the back-end upload handler:

Code Snippet
  1. publicstaticvoid RegisterRoutes(RouteCollection routes)
  2. {
  3.     routes.IgnoreRoute("IGUploadStatusHandler.ashx");
  4.  
  5.     . . .
  6. }

This is all you need to do when it comes to the client-side. Now let’s see how to configure the server-side: The HTTP Handler and Module. You are going to upload some videos, so you need a place to save them. Create a folder, for example Uploads and then register that folder in the Web.config file like that:

Code Snippet
  1. <appSettings>
  2.   <addkey="fileUploadPath"value="~/Uploads" />
  3.   <addkey="maxFileSizeLimit"value="100000000" />
  4.   . . .
  5. </appSettings>

As you are uploading videos, make sure that you set the value of the maxFileSizeLimit to appropriate size. To register the modules and the handlers use the following code that take place again in the Web.config file:

Code Snippet
  1. <system.webServer>
  2.   <modulesrunAllManagedModulesForAllRequests="true">
  3.     <addname="IGUploadModule"type="Infragistics.Web.Mvc.UploadModule"
  4.                                preCondition="managedHandler" />
  5.   </modules>
  6.   <handlers>
  7.     <addname="IGUploadStatusHandler"path="IGUploadStatusHandler.ashx"verb="*"
  8.          type="Infragistics.Web.Mvc.UploadStatusHandler"preCondition="integratedMode" />
  9.   </handlers>
  10.   <validationvalidateIntegratedModeConfiguration="false" />
  11. </system.webServer>

And that is it. Now you have a functional and attractive file upload for your gallery. You can find more information about the features of that control and some samples here.

 

The Video Player

So you want to play the uploaded videos with Ignite UI Video player. To set up the player in Razor ASP.NET MVC View you have to use the following lines:

Code Snippet
  1. @(Html.Infragistics().VideoPlayer()
  2. .Height("200px")
  3. .Width("300px")
  4. .Title("Video Sample")
  5. .Render()
  6. )

Of course you need to set the video source. In ASP.NET MVC the Source must be set before Render is called. As you want all of your videos to be played with that player you need to go through all of the files in the uploaded folder and assign them the player. In order to do that you can make a foreach loop like this one:

Code Snippet
  1. @foreach (var item in (ViewData["videoSources"] asstring[]))
  2. {
  3.     <spanclass="videos">
  4.  
  5.     @(Html.Infragistics().VideoPlayer()
  6.      .Height("200px")
  7.      .Width("300px")
  8.      .Title("Video Sample")
  9.      .Sources(newList<String> { Url.Content(item) })
  10.      .Render())
  11.  
  12.     </span>
  13. }

 

For convenience that code is in a new View called Video. It is a new View so don’t forget to include the Infragistics.Web.Mvc at the top of the page. In the HomeController.cs you need to set the video source:

Code Snippet
  1. publicActionResult Index()
  2. {
  3.     /* Getting the path of the uploaded video files. */
  4.  
  5.     string[] paths = System.IO.Directory.GetFiles(Server.MapPath("~/Uploads"));
  6.     for(int i = 0; i <  paths.Length; i++)
  7.     {
  8.  
  9.         paths[i] = "~/Uploads/" + System.IO.Path.GetFileName(paths[i]);
  10.         
  11.     }
  12.    
  13.     ViewData["videoSources"] = paths;
  14.     
  15.     return View();
  16. }

So this is how to play your videos with Ignite UI Video Player. More information about the features as well as some samples of the player you can find here.

The Gallery

Simple or not one gallery can be called good only if it works properly. Nobody likes if the whole page reloads every time a video is uploaded, that is why you want only the newly uploaded video to appear. In order to do so, you can use the fileUploaded event (more about the file upload events you can find in the documentation about that control) and some jQuery to do the magic for you.

Code Snippet
  1. <script>
  2.     function UpHand(evt,ui) {
  3.         
  4.         $.ajax({
  5.             url: "@Url.Action("Video","Home")",
  6.             data: {clip: ui.filePath}
  7.         }).done(function (data) {
  8.             if ($("#Video").children().length > 0) {
  9.                 $("#Video").append(data.replace(/VideoPlayer1/g, ("VideoPlayer" + $("#Video").children().length +1)));
  10.             }
  11.             else{
  12.                 $("#Video").append(data);
  13.             }
  14.         });
  15.     };
  16.          
  17.  
  18. </script>

 

This code helps you to force only the newly uploaded videos to appear. When we upload videos they may be assign with the same id, then when we try to upload a new video it will appear in the place of the previous one. Here comes the following line:

Code Snippet
  1. if ($("#Video").children().length > 0) {
  2.     $("#Video").append(data.replace(/VideoPlayer1/g, ("VideoPlayer" + $("#Video").children().length +1)));
  3. }
  4. else{
  5.     $("#Video").append(data);
  6. }

If there are Videos with the same id we change it, otherwise we just append it to the previous one.

There is one last thing that have to be done before our gallery becomes usable. You have to set the controller for the Video View. The following code take place in the HomeController.cs file.

Code Snippet
  1. publicPartialViewResult Video(string clip)
  2. {
  3.     string[] paths = newstring[1] ;
  4.     if (System.IO.File.Exists(Server.MapPath("~/Uploads/") + clip))
  5.     {
  6.         paths[0] = "~/Uploads/" + clip;
  7.     }
  8.  
  9.     ViewData["videoSources"] = paths;
  10.    return PartialView();
  11. }

So using the above mentioned source you will be able to create a simple video gallery like that:

You can download the sample code from here.

You can follow us on Twitter @Infragistics and stay in touch on Facebook, Google+ and LinkedIn!

Why CodeProject.com is Essential for Programmers

$
0
0

Developers and programmers looking for a forum to exchange their ideas and read about what others have done should strongly consider browsing CodeProject.com. The website, which currently boasts more than 10 million members worldwide, was founded by Chris Maunder, who has been programming since 1988, as a way to provide devs and programmers with the resources they require to complete their daily tasks and stay updated on the latest technologies impacting their fields.

CodeProject.com includes sections for various article topics, including content highlighting tips and tricks for users, as well as beginner and technical blogs. The site also allows developers and programmers to submit their own topics and blogs to help the community.

The site also includes a robust list of discussions with a wide range of topics. This section includes areas highlighting Adobe technologies, ASP.NET, JavaScript, .NET, Microsoft SharePoint, Silverlight, web development and application lifecycles, among plenty of others.

Users looking for specific help in particular areas can take advantage of CodeProject.com's quick answers section. This area includes questions and answers for topics like C#, ASP.NET, C++, VB.NET and C#4.0.

CodeProject.com is much more than just a discussion board. The website also provides developers and programmers news content, surveys, product showcases, press releases and other material.

There are always new developments and technologies that emerge that greatly influence the roles of developers and programmers. Those looking for a valuable channel to keep pace with such trends, communicate with colleagues and find answers to any issues they are having can benefit greatly from the resources provided by CodeProject.com.

Fundamentals of Python: Functions, Formatting & Assignment Statements (Week 2)

$
0
0

Here we are at Week 2 of Fundamentals of Python! This week covered Functions, Formatting & Assignment statements, which don't need much explanation really, so let's get right into it!

If you need access to Week 1, here it is!

Lesson 1: Visualizing Assignment Statements

The most important note in this lesson is understanding that assignment of variables does not mean that a variable is *equal* to the value or function it is assigned to represent.

Here are the rules for Executing an Assignment Statement:

  1. Evaluate the expression on the right side of the equals sign to produce a value. This value also has a memory address. This value also has a memory address.
  2. This memory address will be stored in the right side of the = sign, with the variable who is referencing it remaining on the left side.

REMEMBER! Assignment changes the value of a VARIABLE, not what is stored in the memory address!

Additional Notes from this Lesson:

-          In IDLE, you can access the visualizer tool by navigating through Explore > Visualize to see the state of computer memory used during the execution of your code.

Lesson 2: typ str

typ str is Python’s representation of the String type. In order to define a string literal, which is a sequence of characters, it must begin and end with either ‘ or “. Additionally, string literals can be assigned to variables. It is important to note that if your string literal needs to include a contraction or possessive, you can use “s to define them. Additionally, you have the option of using \’ to refer to your ‘ in the string, and using ‘s to define it completely.

Strings also are able to be concatenated using the + operator, but you have to remember to include spaces where appropriate, as the + operator simply mashes the strings together and does not take any spacing into account. Additionally, you can use the * operator on strings to replicate a string any number of times. However, it’s important to note that order of operations still applies when using these “mathematical operators” on your strings. And before you go running off to try / and -, no, those operators don’t work and will only result in you achieving a TypeError.

Lesson 3: Input/Output & str Formatting

In order to print by passing a single function to argument call, you’ll want to produce a statement something to the effect of this:

Print (“text”) => text

Print(3+7-3) => 7

Print(“hello”, “there”) => hello there

Here’s an example of how you would write functions to produce the square of a number, and print it!

NOTE! If the end of a function body is reached without executing a return statement, that function call produces value “None”.

Additional Notes from this Lesson:

Triple quoted strings can span several lines. Example:

Print(‘’’ How

Are

You?’’’)

In memory, this is stored as ‘How\nAre\nYou?’ (\n is the newline designation)

Character Designations!

\t is an escape sequence for tabs

\\ is to print a single backslash

\’ is for ‘ in a string

\” is for “ in a string

Lesson 4: Docstring & Function Help

Docstring is documentation for your own functions! Make sure that these are triple quoted so they are formatted correctly. Something I thought was really neat here was that the first two lines of your docstring are what show up as the hint when you begin to type the function name.

Lesson 5: Function Design Recipe

  1. Header – includes your function name & parameters
  2. Type contract – types for values of parameters & expected return type
  3. Description – C’mon kids! J
  4. Examples – Function use examples.
  5. Function Body – your code to make things happen!

Next comes the Design Recipe, which is crafted, of course, to make things easier for you to execute as a developer.

1.    Write examples
2.    Write type contract
          a.    What times for the parameters?
          b.    What type needs to be returned?
3.    Write header
          a.    Pick meaningful parameter names
4.    Write description
          a.    Mention every parameter and describe your return value
5.    Write body!

Lesson 6: Function Reuse

Once defined, you can use your functions over and over again! You can even pass your function calls as arguments. Get. On. It.

Lesson 7: Visualizing Function Calls

Formatting note: All code belonging to a function should be indented 4 spaces.

Stack Frame: a region of computer memory for keeping track of information about a function being executed

Locak Variable: variable created inside a function body that can only be accessed within that function.

Week 2 Summary:

This week was awesome because it took concepts that I’ve worked with before and brought them into the Python context. I’m excited to see what’s on tap for next week, especially since this course is also incorporating a Design Recipe, similar to Systematic Programming.

Questions/Comments?

Feel free to comment here on my blog, or find me on Twitter @DokiDara.

By Dara Monasch

Android Increasing its Grip on Global Smartphone Market

$
0
0

The Android operating system is showing no signs of relinquishing its control of the global smartphone industry. Although competition like iOS and Windows Phone is trying to cut into Android's impressive market share, doing so will likely be even more difficult than previously imagined.

A recent IDC report said that more than 236 million smartphones were shipped during the second quarter of 2013, up 51.3 percent from the same period in 2012. Of these, Android accounted for 187.4 million units and 79.3 percent of the market, up from roughly 69 percent the previous year.

Shipments of the iPhone increased year over year, but Apple's overall share of the market declined from 16.6 percent to 13.2 percent. Ramon Llamas, research manager at IDC, said the dip in iOS can be attributed to the iPhone's yearly cycle.

"Without a new product launch since the debut of the iPhone 5 nearly a year ago, Apple's market share was vulnerable to product launches from the competition," Llamas said. "But with a new iPhone and revamped iOS coming out later this year, Apple is well-positioned to re-capture market share."

Although a new iPhone will generate buzz among consumers and employees alike, it is clear that Apple has plenty of work on its hands if it truly wants to challenge Android for smartphone supremacy.

Mobile App Development is Given New Meaning

Organizations supporting bring-your-own-device (BYOD) initiatives likely have plenty of workers using Android-powered smartphones to access corporate data. Firms looking for ways to support these employees should consider using free tools such as Android controls in order to create highly visual and native business apps for the Android platform. These apps can be tailor-made to further corporate goals and ensure personnel are productive anywhere, regardless of their physical location.

Android Shipments Approaching 1 Billion

A Gartner report indicated that Android-powered devices will total nearly 867 million units in 2013, exceeding 1 billion in 2014. Windows devices will be No. 2 during this time, followed by iOS and Macs.

Carolina Milanesi, research vice president at Gartner, said each platform is trying to assert itself in each area of the mobile industry.

"Apple is currently the more homogeneous presence across all device segments, while 90 percent of Android sales are currently in the mobile phone market and 85 percent of Microsoft sales are in the PC market," Milanesi said.

The Android operating system may have come after the likes of iOS, but it has proven to be a force throughout the mobile market. As the platform becomes even more of an industry staple, businesses should consider creating their very own mobile applications native to Android. Android controls are not only easy to use, but are free as well, helping companies reduce costs by supporting BYOD and not having to hire expensive professionals to develop custom-built apps. 

Creating an image gallery with Tile Manager

$
0
0

The Ignite UI Tile Manager control is a layout control that gives a friendly, interactive user interface, that allows users to move the items on the page, to expand and collapse them.

In this blog you will see how to create an image gallery using Ignite UI Tile Manager and File Upload controls.

Step One: Setting the basis

To get started you need to insert Infragistics library Infragistics.Web.Mvc.dll. As we are making an ASP.NET MVC project using Razor, the inclusion will look like this:

  1. @using Infragistics.Web.Mvc;

Most MVC projects has jQuery scripts already included in itself, so you don’t have to worry about that. What you need to do is include the Infragistics scripts and of course append Infragistics CSS folder and scripts to your project folders. The following shows how to do it:

  1. <linktype="text/css"href="@Url.Content("~/Content/css/themes/infragistics/infragistics.theme.css")"rel="stylesheet"/>
  2. <linktype="text/css"href="@Url.Content("~/Content/css/structure/infragistics.css")"rel="stylesheet"/>
  3. <scripttype="text/javascript"src="@Url.Content("~/Scripts/infragistics.core.js")"></script>
  4. <scripttype="text/javascript"src="@Url.Content("~/Scripts/infragistics.lob.js")"></script>

 

 

Step Two: The File Upload

The Ignite UI File Upload control allows you to make a single or multiple upload. You just have to add these lines:

  1. <divid="uploader">
  2.      @(Html.Infragistics().Upload()
  3.     .ID("igUpload1")
  4.     .AddClientEvent("fileUploaded","UpHand")
  5.     .AutoStartUpload(true)
  6.     .ProgressUrl("/IGUploadStatusHandler.ashx")
  7.     .Render()
  8. )

We use the AddClientEvent to trigger a reload on Uploaded event. You can read how to do that later in the blog. The client-site of the configuration is the easy part, now let’s look at the server-site configuration. Shortly, what you need to do is:

  • Ignore the URL of the HTTP handler in Global.asax
  1. public static void RegisterRoutes(RouteCollection routes)
  2. {
  3.     routes.IgnoreRoute("IGUploadStatusHandler.ashx");
  4.     . . .
  5. }
  • Create a folder for your uploaded files and register it in Web.config
  1. <appSettings>
  2.   <addkey="fileUploadPath"value="~/Uploads"/>
  3.   <addkey="maxFileSizeLimit"value="100000000"/>
  4.   . . .
  5. </appSettings>
  • Register the module and the handler in Web.config
  1. <system.webServer>
  2.   <modulesrunAllManagedModulesForAllRequests="true">
  3.     <addname="IGUploadModule"type="Infragistics.Web.Mvc.UploadModule"
  4.                                preCondition="managedHandler"/>
  5.   </modules>
  6.   <handlers>
  7.     <addname="IGUploadStatusHandler"path="IGUploadStatusHandler.ashx"verb="*"
  8.          type="Infragistics.Web.Mvc.UploadStatusHandler"preCondition="integratedMode"/>
  9.   </handlers>
  10.   <validationvalidateIntegratedModeConfiguration="false"/>
  11. </system.webServer>

If you need more detailed information on how to set up the File Upload, you can read the blog “Using jQuery Upload Control and HTML5 Video Player to create Video Gallery” or you can look up the features and the samples of the control.

Step three: The Tile Manager

Tile Manager is a wise choice if you want an interactive layout for your gallery. This control is still CTP, that is why you may experience difficulties with some of its functions. The new release is coming soon,so if there are changes in the configuration we will let you know.

To start with, you need to add a div tag for your image dashboard in your HTML code.

  1. <divid="dashboard"></div>

Then you need to add the following jQuery code snippet, that demonstrates how to initialize the igTileManager control:

  1. function callTileManager () {
  2.     $('#dashboard').igTileManager({
  3.         layoutConfiguration: {
  4.             gridLayout: {
  5.                 columnWidth: 300,
  6.                 columnHeight: 250,
  7.                 marginLeft: 10,
  8.                 marginTop: 10
  9.             }
  10.         },    
  11.         animationDuration: 1000,
  12.         dataSource: dataSource,
  13.         contentTemplate: '<img src="${path}" />'
  14.        
  15.     });
  16. }
  17. callTileManager();

As you can see we are taking the data source from a variable called dataSource. Our data is actually an array of objects, which has two elements a name and a path. For that purpose you have to create a new model called GalleryItems.cs like that:

  1. publicclassGalleryItems
  2. {
  3.     publicstring path { get; set; }
  4.     publicstring name { get; set; }
  5.   
  6. }

Then you need to go to the HomeController.cs and set the gallery source.You made a new model that is why you have to include it in HomeController.cs:

  1. publicActionResult Index()
  2. {
  3.  
  4.     var model = newList<GalleryItems>();
  5.  
  6.     string[] paths = System.IO.Directory.GetFiles(Server.MapPath("~/Uploads"));
  7.  
  8.     for (int i = 0; i < paths.Length; i++)
  9.     {
  10.         model.Add(newGalleryItems()
  11.         {
  12.             path = "/Uploads/" + System.IO.Path.GetFileName(paths[i]),
  13.             name = System.IO.Path.GetFileNameWithoutExtension(paths[i])
  14.         });
  15.  
  16.     }
  17.  
  18.     return View(model);
  19. }

The code is in Razor, but we need it in our jQuery code that is why the variable dataSource must be JSON encoded.

  1. var dataSource =@Html.Raw(Json.Encode(Model));

The last step of the configuration is to set up the handler that triggers when a new item is added. Therefor, you have to make an AJAX request and if the request completes correctly you should be able to bind the new data.

  1. function UpHand(evt,ui) {       
  2.     $.ajax({
  3.        type: "POST",
  4.        url: "@Url.Action("Image","Home")",
  5.        data: {image: ui.filePath}
  6.     }).done(function (data) {
  7.         dataSource.push(data);
  8.         $("#dashboard").igTileManager("destroy");
  9.         callTileManager ();      
  10.        }        
  11. )};

For the data source you need to create a new control in the HomeController.cs:

  1. publicJsonResult Image(string image)
  2. {
  3.     var model = newGalleryItems()
  4.     {
  5.         path = "/Uploads/" + System.IO.Path.GetFileName(image),
  6.         name = System.IO.Path.GetFileNameWithoutExtension(image)
  7.     };
  8.     return Json(model);
  9. }

So this is how to make an image gallery with Tile Manager. The sample of the above mentioned source can be found here.

 

You can follow us on Twitter @Infragistics and stay in touch on Facebook, Google+ and LinkedIn!

Why Software Developers Should Prototype

$
0
0

Any developer that has been through the ringer before knows the pain that comes from undoing the hard work of developing back-end code and creating awesome UIs when stakeholders change the vision of their project.  Instead of suffering this cruel fate, developers can utilize tools that allow them to prototype their design. This way, UIs can be changed by stakeholders before developers start coding, thus saving lots of time and effort.

 

Why Prototype? an Infographic by Indigo Studio: Infragistics Prototyping

<a href="http://www.infragistics.com/community/blogs/gradientgirl/archive/2013/09/23/why-software-developers-should-prototype.aspx"><img src="http://www.infragistics.com/community/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gradientgirl/4666.Indigo_2D00_infographic_2D00_950.jpg" alt="Why Prototype?" border="0" /></a></code></p>
<br />
<p></p>
<p><a href="http://www.infragistics.com/community/blogs/gradientgirl/archive/2013/09/23/why-software-developers-should-prototype.aspx">Why Prototype?</a> an Infographic by <a href="http://www.infragistics.com/products/indigo-studio">Prototyping Tool</a> Indigo Studio</p>

Download Indigo Studio Version 2, and start saving a lot of time and preventing a lot of headaches when creating UIs.


Five Guiding Principles for Usability Testing

$
0
0

Usability testing has long been used as an essential tool for user experience and user interface designers. Even with the most ideal requirements and the perfect project team, nothing compares to getting a product in front of real people for testing. Despite its simple nature, usability testing can be difficult to implement correctly. Here are five of our top tips on conducting great usability sessions:

1. Choosing the Right Subjects

The key here is that the results will only be as good as the people you test. If you pick a set of subjects who are completely unfamiliar with the system being tested, your results will likely be worthless.

When all is well, you will have developed ‘personas’ during the requirements or development process of the project. A persona is a realistic representation of a key audience segment for your website or service. Sets of personas are helpful when deciding on features to implement or functionality to design, as they give you a user reference point to consider.

When it comes to usability testing, it’s essential to try to match subjects against these personas. If you don’t have personas created for your product, now is a good time to write them, or at least create simple versions to help you decide who good subjects for testing will be.

2. Wording Tasks

When you are writing out tasks your subjects will carry out during testing, think about a court trial and examination by counsel. A loaded question, such as “is this feature fantastic?” is inherently biased, and the subjects answer will naturally be affected. Tasks should be simple, clear and free from your own (or your team’s) personal feelings. For example:

“Review the homepage and explain what elements catch your eye” is much more effective than, “Can you see the big banner at the top of the homepage?”

“Review the steps of the checkout process and rate the experience of each screen from 1 to 5, five being the best” will serve you better than, “Is the last step of the checkout process too complex? We think the icons are very small.”

3. How to Behave During a Session

If you are helping out in the session itself, such as getting subjects in and settled, handing out tasks, answering queries or taking notes, then you have to be especially careful. You need to say and do as little as possible, do not distract the subject, and don’t chip in during tasks, even if you know how to do them and the subject is struggling. In order to prevent yourself interfering with your own test, remember these three golden rules:

  • Don’t speak until you are spoken to.
  • Sit down during the session, ideally not directly behind or over the shoulder of the subject.
  • Only help the subject with practical things like logging on or system crashes. If they can’t complete a task, do not help them.

4. Recording Sessions and Feedback

The person running the task should be able to take notes, but they can expect to be busy with admin tasks and helping the subject, so it is best if you video record the session. The most effective usability results come from recordings of both the user (their reactions and body language) and the screen (movement of mouse and interactions with the system). The first recording can be done with a simple camera and tripod, or even an iPhone if you have nothing else. The second type of recording can be achieved with any number of desktop recording software packages, ranging from free, to feature packed premium purchases.

It goes without saying that you should get written consent to be recorded from each person before the session begins.

5. Gathering Feedback After a Session

Immediately after the session is finished and the subject has completed all tasks, be sure to conduct a quick interview or survey. This is a great way to capture really useful feedback, and questions can be tailored to what happened in the particular session. It is also a great way to get quotes or sound bites from attendees.

XamDockManager - Data Binding ContentPanes with MVVM

$
0
0

If you are using the Infragistics xamDockManager control and using MVVM to compose your views, then you have probably asked yourself the question, “How do I data bind a collection of objects, which represent my Views, from my ViewModel to various areas of the xamDockManager?”.  You are asking yourself this question because the xamDockManager doesn’t support this data binding out of the box.  The good news is that this is relatively easy to accomplish.  You just have to write a little code.  As with most solutions, there are always more than one way to solve a problem.  There are actually solutions to this specific problem that have already been posted.  For example, this post titled “ItemsSource for xamDockManager”, provides an alternative to the solution I am going to show you.  So why am I showing you another approach?  Well, I prefer something a little more simple and straight forward.  You can choose which solution you prefer.

In this post, I will be adding the required MVVM support to the WPF version of the xamDockManager, and we will be using a Behavior to do it.  My Behavior is going to target a TabGroupPane as my container of choice.  What I mean by “container of choice”, is that I am going to have all my Views data bound and hosted inside of a TabGroupPane.  You may choose something different, such as adding support to the xamDockManager directly, or maybe use the DocumentContentHost.  What ever floats your boat!

Now, this behavior should support a couple of different scenarios.

  • I should be able to data bind a collection of objects, which will represent a view, from a ViewModel
  • I should be able to add new objects to this collection and have the View be shown in a new tab in the xamDockManager
  • I should be able to remove an existing object from the collection and have the View removed from the xamDockManager
  • I should also be able to close a tab and have the object automatically removed from the collection
  • I should be able to provide a DataTemplate to define the structure of the object as the View (implicit or explicit)
  • I should be able to provide a property path to use as the tab header text
  • I should be able to provide a DataTemplate to define the structure of the tab header

That about wraps it up.  Wow, that’s a lot of stuff, but nothing a simple Behavior can’t solve for us.  I would like to note that I am not concerned with removing objects from one collection and adding them to another collection in my ViewModel when dragging and dropping tabs around the xamDockManager.  If you want that, you will have to add that functionality yourself.  I am just going to provide you with the behavior, then talk about it.

publicclassTabGroupPaneItemsSourceBehavior : Behavior<TabGroupPane>
{
    publicstaticreadonlyDependencyProperty HeaderMemberPathProperty = DependencyProperty.Register("HeaderMemberPath", typeof(string), typeof(TabGroupPaneItemsSourceBehavior));
    publicstring HeaderMemberPath
    {
        get { return (string)GetValue(HeaderMemberPathProperty); }
        set { SetValue(HeaderMemberPathProperty, value); }
    }

    publicstaticreadonlyDependencyProperty HeaderTemplateProperty = DependencyProperty.Register("HeaderTemplate", typeof(DataTemplate), typeof(TabGroupPaneItemsSourceBehavior), newPropertyMetadata(null));
    publicDataTemplate HeaderTemplate
    {
        get { return (DataTemplate)GetValue(HeaderTemplateProperty); }
        set { SetValue(HeaderTemplateProperty, value); }
    }

    publicstaticreadonlyDependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IList), typeof(TabGroupPaneItemsSourceBehavior), newPropertyMetadata(null, newPropertyChangedCallback(OnItemsSourcePropertyChanged)));
    publicIList ItemsSource
    {
        get { return (IList)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    privatestaticvoid OnItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TabGroupPaneItemsSourceBehavior behavior = d asTabGroupPaneItemsSourceBehavior;
        if (behavior != null)
            behavior.OnItemsSourcePropertyChanged((IList)e.OldValue, (IList)e.NewValue);
    }

    void OnItemsSourcePropertyChanged(IList oldValue, IList newValue)
    {
        AssociatedObject.Items.Clear();

        if (oldValue != null)
        {
            var oldCollectionChanged = oldValue asINotifyCollectionChanged;
            if (oldCollectionChanged != null)
                oldCollectionChanged.CollectionChanged -= CollectionChanged_CollectionChanged;
        }

        if (newValue != null)
        {
            var collectionChanged = newValue asINotifyCollectionChanged;
            if (collectionChanged != null)
                collectionChanged.CollectionChanged += CollectionChanged_CollectionChanged;

            foreach (var item in newValue)
            {
                ContentPane contentPane = PrepareContainerForItem(item);
                AssociatedObject.Items.Add(contentPane);
            }
        }
    }

    publicstaticreadonlyDependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(TabGroupPaneItemsSourceBehavior), newPropertyMetadata(null));
    publicDataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

    void CollectionChanged_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            IEnumerable<ContentPane> contentPanes = XamDockManager.GetDockManager(AssociatedObject).GetPanes(PaneNavigationOrder.VisibleOrder);
            foreach (ContentPane contentPane in contentPanes)
            {
                var dc = contentPane.DataContext;
                if (dc != null&& e.OldItems.Contains(dc))
                {
                    contentPane.ExecuteCommand(ContentPaneCommands.Close);
                }
            }
        }
        elseif (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (var item in e.NewItems)
            {
                ContentPane contentPane = PrepareContainerForItem(item);
                if (contentPane != null)
                    AssociatedObject.Items.Add(contentPane);
            }
        }
    }

    protectedContentPane PrepareContainerForItem(object item)
    {
        ContentPane container = newContentPane();

        container.Content = item;
        container.DataContext = item;

        if (HeaderTemplate != null)
            container.HeaderTemplate = HeaderTemplate;

        if (ItemTemplate != null)
            container.ContentTemplate = ItemTemplate;

        container.CloseAction = PaneCloseAction.RemovePane;
        container.Closed += Container_Closed;

        CreateBindings(item, container);

        return container;
    }

    privatevoid Container_Closed(object sender, PaneClosedEventArgs e)
    {
        ContentPane contentPane = sender asContentPane;
        if (contentPane != null)
        {
            contentPane.Closed -= Container_Closed; //no memory leaks

            var item = contentPane.DataContext;

            if (ItemsSource != null&& ItemsSource.Contains(item))
                ItemsSource.Remove(item);

            RemoveBindings(contentPane);
        }
    }

    privatevoid CreateBindings(object item, ContentPane contentPane)
    {
        if (!String.IsNullOrWhiteSpace(HeaderMemberPath))
        {
            Binding headerBinding = newBinding(HeaderMemberPath);
            headerBinding.Source = item;
            contentPane.SetBinding(ContentPane.HeaderProperty, headerBinding);
        }
    }

    privatevoid RemoveBindings(ContentPane contentPane)
    {
        contentPane.ClearValue(ContentPane.HeaderProperty);
    }
}

As you can see we have only a couple of properties.  The HeaderMemberPath is used to specify the property path of the underlying object to use as the text for the tab header.  The HeaderTemplate property is used to control the structure of the tab header.  For example, maybe we want to add images or change other aspects of the tab header.  Next, we have the ever popular ItemsSource property.  You will use this property to data bind your collection of objects from your ViewModel to the TabGroupPane of the xamDockManager.  Notice how I am using IList as the property type.  This allows us to add and remove items from the collection.  Lastly, we have the ItemTemplate property.  This property will allow us to provide a DataTemplate to define the structure of each of the items in the collection.  Now keep in mind, the ItemTemplate will only really work if all the objects in your collection are the same.  If you have a collection of different object types, then you will not be using the ItemTemplate property.  Feel free to add more properties and modify this behavior to fit your specific needs.

The Sample

So how do you use this behavior?  Well let’s start with a ViewModel.

publicclassViewModel
{
    publicObservableCollection<object> People { get; set; }

    publicDelegateCommand InsertCommand { get; set; }
    publicDelegateCommand RemoveCommand { get; set; }

    public ViewModel()
    {
        People = newObservableCollection<object>();
        People.Add(newPerson() { FirstName = "Brian", LastName = "Lagunas", Age = 66 });

        InsertCommand = newDelegateCommand(Insert);
        RemoveCommand = newDelegateCommand(Remove);
    }

    publicvoid Insert(object param)
    {
        People.Add(newPerson() { FirstName = String.Format("First {0}", DateTime.Now.Second), LastName = String.Format("Last {0}", DateTime.Now.Second), Age = DateTime.Now.Millisecond });
    }

    publicvoid Remove(object param)
    {
        var person = param asPerson;
        if (person != null)
            People.Remove(person);
    }
}

This is a very straight forward ViewModel.  It has a single collection and two commands.  One command will insert a new Person object into my collection and the other command will remove an instance of a Person object from the collection.  Speaking of the Person object, let’s take a look at it.

publicclassPerson
{
    publicstring FirstName { get; set; }
    publicstring LastName { get; set; }
    publicstring FullName { get { returnString.Format("{0}, {1}", LastName, FirstName); } }
    publicint Age { get; set; }
}

Notice how I am not implementing INotifyPropertyChanged.  This is only because this is meant to be sample code and not meant to replicate a production system.  When you do this, make you’re your ViewModels and POCOs implement INotifyPropertyChanged. 

Next, let’s define our behavior in our View.  Since we are using a Behavior, you need to add a reference to System.Windows.Interactivity to your WPF application and add an namespace in your XAML.

<Window x:Class="XamDockManager_MVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:igWPF="http://schemas.infragistics.com/xaml/wpf"
        xmlns:local="clr-namespace:XamDockManager_MVVM"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Menu>
            <MenuItem Header="Insert" Command="{Binding InsertCommand}" />
            <MenuItem Header="Remove" Command="{Binding RemoveCommand}" CommandParameter="{Binding ActivePane.DataContext, ElementName=_dock}" />
        </Menu>

        <igWPF:XamDockManager x:Name="_dock" Grid.Row="1" >
            <igWPF:XamDockManager.Panes>
                <igWPF:SplitPane>
                    <igWPF:TabGroupPane x:Name="_dynamicTab">
                        <i:Interaction.Behaviors>
                            <local:TabGroupPaneItemsSourceBehavior ItemsSource="{Binding People}"/>
                        </i:Interaction.Behaviors>
                    </igWPF:TabGroupPane>
                </igWPF:SplitPane>
            </igWPF:XamDockManager.Panes>
        </igWPF:XamDockManager>

    </Grid>
</Window>

Let’s run the application and see what we have so far.

image

That’s cool and all, but our objects don’t really looks like views right now, and what’s up with the tab header?  Let’s start using some of those properties we created to make this look a litle better.  Let’s start with the header.  I want to bind the tab header to the FullName property of our Person object.  I also want to make some changes to the formatting of the tab header so I am going to create a new DataTemplate for it.  I am also going to define an DataTemplate to use as the ItemTemplate for my Person object.

<Window x:Class="XamDockManager_MVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:igWPF="http://schemas.infragistics.com/xaml/wpf"
        xmlns:local="clr-namespace:XamDockManager_MVVM"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>

        <DataTemplate x:Key="HeaderTemplate">
            <TextBlock Text="{Binding}" FontSize="18" FontWeight="Bold" />
        </DataTemplate>

        <DataTemplate x:Key="PersonTemplate">
            <Border BorderBrush="Blue" BorderThickness="2">
                <Grid Margin="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="First Name: " />
                    <TextBox Grid.Column="1" Text="{Binding FirstName}" />
                    <TextBlock Grid.Row="1" Text="Last Name: " />
                    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding LastName}" />
                    <TextBlock Grid.Row="2" Text="Age: " />
                    <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Age}" />
                </Grid>
            </Border>
        </DataTemplate>

    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Menu>
            <MenuItem Header="Insert" Command="{Binding InsertCommand}" />
            <MenuItem Header="Remove" Command="{Binding RemoveCommand}" CommandParameter="{Binding ActivePane.DataContext, ElementName=_dock}" />
        </Menu>

        <igWPF:XamDockManager x:Name="_dock" Grid.Row="1" >
            <igWPF:XamDockManager.Panes>
                <igWPF:SplitPane>
                    <igWPF:TabGroupPane x:Name="_dynamicTab">
                        <i:Interaction.Behaviors>
                            <local:TabGroupPaneItemsSourceBehavior HeaderMemberPath="FullName"
                                                                   HeaderTemplate="{StaticResource HeaderTemplate}"
                                                                   ItemsSource="{Binding People}"
                                                                   ItemTemplate="{StaticResource PersonTemplate}"/>
                        </i:Interaction.Behaviors>
                    </igWPF:TabGroupPane>
                </igWPF:SplitPane>
            </igWPF:XamDockManager.Panes>
        </igWPF:XamDockManager>

    </Grid>
</Window>

Let’s see what we have with our changes.

image

Now that’s better!  You don’t have to use the ItemTemplate property.  If you have a collection of objects, for example ObservableCollection<object>, you can provide an implicit DataTemplate to the various types you are adding to the collection.  Maybe you have a DataTemplate for Person, and a different one for Car, and a different one for Pet.  You can create a different DataTemplate for each of these types and they will be rendered properly for each corresponding tab.

That’s wraps it up for this post.  Keep in mind that this post is mainly to help guide you in implementing MVVM with the xamDockManager control and you will probably have to modify this code to meet your specific needs.  Go ahead and download the source code for this post.  Feel free contact me on my blog, connect with me on Twitter (@brianlagunas), or leave a comment below for any questions or comments you may have.

Windows Phone Controls Help Companies Support a Mobile Workforce

$
0
0

The way employees get their work done has forever changed with the arrival of powerful mobile devices such as smartphones and tablets. Although operating systems like Android and iOS dominate many of the headlines in these markets, Microsoft continues to push forward with its Windows Phone platform in an effort to assert itself as the bonafide third option in the mobile arena.

Organizations looking for ways to support a mobile workforce and their employees who own a Windows Phone can develop custom-built, business-centered applications for these staff members. Infragistics' Windows Phone controls, for example, allow firms to develop highly visual apps that are native to Windows Phone devices.

Even companies that lack skilled personnel in mobile app development can use these tools because they are supported by vast network systems populated by seasoned developers. Users can even view sample code to make the creation process even easier.

Looking ahead, Windows Phone may continue to become more of a player in the bring-your-own-device (BYOD) movement. A recent IDC report said that more than 236 million smartphones were shipped during the second quarter of 2013, up 51.3 percent from the same period in 2012.

While Apple experienced a year-over-year decline in terms of shipments, Windows Phone had the largest growth of any operating system during the past year, expanding from 4.9 million units to nearly 9 million.

Meanwhile, Android remained at the top, accounting for more than 79 percent of second quarter shipments, increasing from approximately 69 percent from the previous year, according to IDC.

Things are Looking Up For Windows Phone

Other industry research has suggested that Windows Phone is trending upward. According to a report by Canalys, Android accounted for nearly 68 percent of all smartphone shipments in 2012, followed by iOS with approximately 20 percent, BlackBerry with just under 5 percent and Microsoft with 2.4 percent. By 2017, global smartphone shipments will total 1.5 billion units, with iOS declining to 14.1 percent and Windows Phone approaching 13 percent.

For Windows Phone to be a viable platform in the near future, it must be scalable, according to Jessica Kwee, a Canalys analyst.

"'Nokia is the most active vendor in the Microsoft camp and it continues to make steady progress with its Lumia portfolio," Kwee said. "It has had some major carrier wins recently in the two largest markets of China and the United States, which will help it build momentum in the short term."

Ryan Reith, program manager of IDC's mobility tracker programs, said Windows Phone shipments surpassed BlackBerry last quarter, and this continued during the second quarter of 2013. Nokia is a major driver behind Windows Phone as a whole, with Reith explaining that the research firm expects this to continue moving forward.

Reith concluded that as more manufacturers develop Android-based smartphones, the attention placed on Windows Phone will likely grow as people look for different options.

Developer Humor: Grandpa's Technology

$
0
0

Take a peek at this week's Developer Humor... Grandpa's Technology!

Developer Humor: Grandpa's Technology by Infragistics WinForms Controls

Embed image on your site by copying code below:

<a href="http://www.infragistics.com/community/blogs/marketing/archive/2013/09/25/developer-humor-grandpa-39-s-technology.aspx"><img src="http://www.infragistics.com/community/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/marketing/4666.Grandpas_5F00_Technology_5F00_01.jpg" alt="Software Developer Comics" border="0" /></a></code></p>
<br />
<p></p>
<p><a href="http://www.infragistics.com/about-us/career-opportunities/">Software Developer</a> comics by Infragistics <a href="http://www.infragistics.com/products/windows-forms/">WinForms Controls</a> Team</p>

First open presentation about Indigo Studio v.2 in Sofia, Bulgaria - Event Recap

$
0
0

In Sofia, Bulgaria was organized a public presentation about Indigo Studio v.2. This was the first such presentation of the innovative product for UX in Central and Eastern Europe. The event was held on Wednesday, September 26th at Infragistics Bulgaria Office, 110B, Simeonovsko Shosse Bul., Sofia, Bulgaria.

I had the honor to present Indigo Studio as a lecturer.

 

Presentations was titled "Rapid Prototyping for Developers with Indigo Studio v.2" and presented the advantages of the product, which can benefit in particular for software developers.

 

Lecture presented Indigo Studio as a tool for creating storyboards, wireframes, prototyping and new features were demonstrated in version 2 like new touch gestures, screen-to-screen transitions, interactive iOS controls, export to PDF etc. .  I hope this is a good start to promote this product in the region.

 

Pictures from the Indigo Studio event in Sofia

 

 

 

 

 

 

 

 

 

You can check some awesome prototypes like this one here:

As always, you can follow us on Twitter @mihailmateev and @Infragistics and stay in touch on Facebook,Google+andLinkedIn!

 

Fundamentals of Python: Function and Variable Types (Week 3)

$
0
0

This week’s worth of lessons is super intuitive and really sets the tone for the rest of the class. As you’ll see, the speed of new information as well as the course structure meld together in a pretty harmonious way and let the student actually grasp concepts before moving on. While some of these are review if you’ve been following me since my last class, as always I enjoy a good subject matter comparison between languages. :)

If you need access to Week 1 or Week 2, here they are!

Lesson 1: Functions, Variables & The Call Stack

The call stack holds what are known as “stack frames” which basically represent the order in which different actions will be executed by the computer.

This is important to note when answering the question of what variable to use when there is a program with multiple instances of the same variable. The correct answer is the variable that’s in the stack frame, or as I like to call it, the active variable. Regarding assignment states and variables, if a variable does not exist in the current stack frame, Python will create the variable so it can be used. :)

HOWEVER!

When a function exists, the frame for the function is erased and control passes back to the statement containing the function call. The return of the function call is whatever was returned by the function itself.

Lesson 2: type bool

Boolean values represent the binary concept of true/false. This lesson goes over, in a pretty comprehensive way, what they are and how to use them…

Boolean Operation

Symbol

Less Than

Greater Than

Equal To

==

Greater Than or Equal To

>=

Less Than or Equal To

<=

Not Equal To

!=

 

Additionally, there are logical operators, which you can use to create longer, more specific selections using Boolean expressions as their operands.

Logical Operation

Symbol

Not:

not

And:

and

Or:

or

 

If you’re using the logical operator “and,” both booleans must evaluate to the same result in order to be true.

If you’re using the logical operator “or,” at least one of the booleans must evaluate to true in order to be true.

Additionally, when using the logical operators that are evaluating naturally, the order of precedence is simply left to right.

Lesson 3: Converting Between int, str and float

Let’s just cover this visually, because I think it actually is way more intuitive that way than through text.

Convert an into into a str:

str(3) -> ‘3’

Convert a str into an int:

int(‘3’ * 5) -> 33333

Convert a str into an int into a str:

str(int(‘3’ * 5)) -> ‘33333’

Convert a float into a str:

str(4.6) -> ‘4.6’

Convert a str into a float:

float(‘456’) -> 456.0

Convert a str into an int:

int(‘hello’) -> ValueError (AKA Juuuuuuuuuuuust kidding you can’t do that! The conversion of str to into or float only works when numbers are the only items in the string!)

Lesson 4: Import: Using Non Built-In Functions

Python has hundreds of functions that are pre-built and at the disposal of the developer; however, you have to import them to be able to use them!

In Python, the items that you import are called modules. A module is a file containing function definitions and other statements. A Python file defines a module, for example, triangle.py defines the module ‘triangle.’

In order to import a module, you would use the following statement:

import module_name

In order to access a function that is housed within a module, you would use the following statement:

module_name.function_name

Lesson 5: if Statements

if expression:
    statement

The above is the simplest form of an if statement, which is basically a way to conditionally break up your program. Here’s an example using this simile form:

if time1 == time2:
   return “same time”

If a function ends without a return statement being executed, it will automatically return None.

If your conditional if statement has multiple conditions or items you want to account for, you have several options!

Option number 1 is “elif.” Elif works the same way as “if,” but it cannot exist without an if statement before it. You can have any amount of elifs to accompany your if, including 0.

Option number 2 is “else.” Like with elif, else must come after an if, but it can also come after all of your elifs as well. Clearly, this means it has to be the last item in any sequence of an if statement, but this makes sense because else simply encompasses any cases you haven’t specifically accounted for in your ifs or elifs.

Lesson 6: No if Required!

This lesson addresses the concept of… when you might not need to use an if statement! When is that? If you are to write an if with a Boolean, of course the else will be false! It’s the only other option.

For example… you could write:

if num % 2 == 0:
  return true
else:
   return false

OR!

You could write:

return num % 2==0

These two statements represent the same process; however, the second one is cleaner, and one could even say, optimized. J

Lesson 7: Structuring if Statements

It’s super easy to nest if statements, so you can set up a conditional tree and then have sub-conditions within any level. That’s all you need to know from here! A series of if, elif, else statements can be housed WITHIN a parent if, elif, or else.

Week 3 Summary

Week 3 was super intuitive and really nailed home the idea of if statements and how to transition between different types of data. There’s not much else to say really, except let’s get excited for Week 4!

Questions/Comments?

Feel free to comment here on my blog, or find me on Twitter @DokiDara.

By Dara Monasch

iOS - Objective-C - Filtering a NSArray using NSPredicate

$
0
0
In this post, i'll walk you through how to filter an NSArray using NSPredicates. The first thing you'll need to decide is if you're filtering a number or a string. For strings, you can use any of the following filters: (NOTE: must be all caps) BEGINSWITH ENDSWITH LIKE MATCHES CONTAINS For numbers, you can use: != > >= < == Now that you know what kind of data you're going to filter on, we can build our predicate. Lets first assume we're filtering an array of strings: NSArray...(read more)

Book App – Persisting with NSCoding and Introducing IGGridView (Xamarin.iOS-Monotouch)

$
0
0

So for V0.2 we made some changes on how the application works before new development.  For the delegates the code was changed to use events to report out various results.   These can be seen in SimpleCaptureMetadataOutputObjectsDelegate and CoverUrlConnectionDelegate.   Aside from that, the project was restructured slightly but that is just a cosmetic change.

Onto the new development.



Persistence of DataModel

The first version of the app was just a scanner with a web look up and that was fine, but to make the application more useful we want to persist the information we get back.   So the main storage data object (Book.cs) has been modified to implement the NSCoding methods.  This was done in a manner consistent with an earlier post on NSCoding .

[Export("initWithCoder:")]
public Book (NSCoder coder)
{
   NSString isbn = (NSString)coder.DecodeObject (@"isbn");
   if (isbn != null)
   {
       this.ISBN = isbn.ToString ();
   } 
}

public override void EncodeTo (NSCoder coder)
{
   if (this.ISBN != null)
   {
      coder.Encode( new NSString (this.ISBN), @"isbn");
   }   
}

The code will ultimately be run on iOS so if we want to use strings in Xamarin.iOS, we need to wrap the string primitive in an NSString object for the persistence round trip.

With this interface / prototype implemented, we can use NSKeyedArchiver and NSKeyedUnarchiver to persist our underlying collection to the device.



Introduction of IGGridView 

Now that we can build data, we need a way to show it. So the project also adds the IGGridView, which is located in the IG.dll. (Download Trial Installer) We add the IGGridView and add columns to show the text and the image of the data object.

isbnColumn.HeaderText = "ISBN";
isbnColumn.Width = IGColumnWidth.CreateNumericColumnWidth(200);
_helper.ColumnDefinitions.Add (isbnColumn);

IGGridViewImageColumnDefinition imageColumn = new IGGridViewImageColumnDefinition ("CoverImage",IGGridViewImageColumnDefinitionPropertyType.IGGridViewImageColumnDefinitionPropertyTypeImage);
imageColumn.Width = IGColumnWidth.CreateNumericColumnWidth(200);
_helper.ColumnDefinitions.Add (imageColumn);

When a book is scanned the image and data is saved on the device. The IGGridView comes into view, it will load the data from the device. Hmm..it works but the data is a little thin. We could also work on the UI a bit to make the book display better. I also think it would be nice if all my devices shared the data, so I could scan with any iOS device and see the results on another.

So I think the next iteration would try to include:

1) A better UI. The one I have now is utilitarian, fine for debugging but can be nicer.

2) Sharing data between devices via cloud storage

3) Maybe I can find more data to make the data more substantial.

So please download the in process project.(Xamarin.iOS / C#)

Articles in this series

1) Using the iOS7 BarCode Scanner - Book App (Xamarin.iOS-Monotouch)

2) Book App – Persisting with NSCoding and Introducing IGGridView (Xamarin.iOS-Monotouch)

By Darrell Kress

How to build XAML Doughnut Chart

$
0
0

The Infragistics packages for WPF and Silverlight contain a lot of diverse charts for data visualization. The control that we are going to look at is The Doughnut Chart. This chart supports one or more rings surrounding a blank center. It can be customized by controlling the slices labels and colors or by configuring the inner radius. In this blog you can learn how to add this control to your application and how to create a custom hierarchical chart by using multiple rings.

XAML Doughnut Chart with custom brushes

Adding the Doughnut Chart

Generally, when you create your WPF project the first thing you need to do is to add the references. There is an easy way to do that:

  1. Go to the toolbox. There you will see the NetAdvantage WPF and Shared XAML controls.
  2. Drag and drop the “XamDoughnutChart”.

When you do those steps you will see that Visual Studio automatically adds the required Infragistics references.

 

When you dragged “XamDoughnutChart”, you actually created the needed tag to host our chart. The next step is to include the following code:

  1. <ig:XamDoughnutChart x:Name="slice">
  2.     <ig:XamDoughnutChart.Series>
  3.         <ig:RingSeries
  4.             LabelMemberPath="Label"
  5.             ValueMemberPath="productionShare"
  6.             LabelsPosition="BestFit"
  7.             ItemsSource="{Binding Mode=OneWay, Source={StaticResource source}}">
  8.         </ig:RingSeries>
  9.     </ig:XamDoughnutChart.Series>
  10. </ig:XamDoughnutChart>

The data source for the items is generated in the cs file of the page as follows:

  1. publicclassCategory
  2. {
  3.      publicstring Label { get; set; }
  4.      publicdouble productionShare { get; set; }
  5. }
  6.  
  7. publicclassHierarchalDataCollection : List<Category>
  8. {
  9.      public HierarchalDataCollection()
  10.      {
  11.          this.Add(newCategory { Label = "Footwear", productionShare = 46 });
  12.          this.Add(newCategory { Label = "Clothing", productionShare = 38 });
  13.          this.Add(newCategory { Label = "Accessories", productionShare = 16 });
  14.      }
  15. }

 

Basic XAML doughnut chart

 

Basically those are the steps to create a Doughnut Chart. Of course it has many options like legend, brush, slice Select and Slice Explode, which will make your chart even more attractive. More about the options you can find in the documentation. I will just give you a hint how to add a particular option. For example if you want to be able to select a slice and thus make it explode and change its style add the AllowSliceExplosion and AllowSliceSelection options and set their values to true. Then create a slice click event like that:

XAML:

  1. AllowSliceExplosion="True"
  2. AllowSliceSelection="True"
  3. SliceClick="slice_SliceClick"

C#:

  1. privatevoid slice_SliceClick(object sender, Infragistics.Controls.Charts.SliceClickEventArgs e)
  2. {
  3.     e.IsSelected = !e.IsSelected;
  4.     e.IsExploded = !e.IsExploded;
  5. }

 

Exploded XAML doughnut chart

 

Custom hierarchical  chart

When you need to visualize hierarchical data, you can use the multiple ring visualization of the chart. We are going to create three rings doughnut chart, which will display the main categories broken down into subcategories.  For that purpose we are going to create three series and define our data source like this:

XAML :

  1. <ig:XamDoughnutChart.Series>
  2.     <ig:RingSeries
  3.                                         StartAngle="30"
  4.         LabelMemberPath="Label"
  5.         ValueMemberPath="productionShare"
  6.         LabelsPosition="BestFit"
  7.         ItemsSource="{Binding Mode=OneWay, Source={StaticResource source}}"
  8.                             Loaded="RingSeries_Loaded">
  9.     </ig:RingSeries>
  10.     <ig:RingSeries
  11.                                         StartAngle="30"
  12.         LabelMemberPath="Label"
  13.         ValueMemberPath="productionShare"
  14.         LabelsPosition="BestFit"
  15.         Loaded="RingSeries_Loaded"
  16.                             OthersCategoryThreshold="0" >
  17.     </ig:RingSeries>
  18.     <ig:RingSeries
  19.                                         StartAngle="30"
  20.         LabelMemberPath="Label"
  21.         ValueMemberPath="productionShare"
  22.         LabelsPosition="BestFit"
  23.         OthersCategoryThreshold="0">
  24.     </ig:RingSeries>
  25. </ig:XamDoughnutChart.Series>

C# :

  1. publicclassHierarchalDataCollection : List<Category>
  2.     {
  3.         public HierarchalDataCollection()
  4.         {
  5.             
  6.             this.Add(newCategory { Label = "Footwear"});
  7.             this.Add(newCategory { Label = "Clothing"});
  8.             this.Add(newCategory { Label = "Accessories"});
  9.             this.Add(newCategory { Label = "Tech" });
  10.  
  11.             
  12.             this[0].Children.Add(newCategory { Label = "Boots" });
  13.             this[0].Children.Add(newCategory { Label = "Shoes" });
  14.             this[0].Children.Add(newCategory { Label = "Sneakers" });
  15.             this[0].Children.Add(newCategory { Label = "Slippers" });
  16.  
  17.             this[1].Children.Add(newCategory { Label = "Dresses" });
  18.             this[1].Children.Add(newCategory { Label = "T-shirts" });
  19.             this[1].Children.Add(newCategory { Label = "Shirts" });
  20.             this[1].Children.Add(newCategory { Label = "Pants" });
  21.  
  22.             this[2].Children.Add(newCategory { Label = "Bag" });
  23.             this[2].Children.Add(newCategory { Label = "Jewelry" });
  24.             this[2].Children.Add(newCategory { Label = "Scarf" });
  25.  
  26.             this[3].Children.Add(newCategory { Label = "PC"});
  27.             this[3].Children.Add(newCategory { Label = "Laptops"});
  28.             this[3].Children.Add(newCategory { Label = "Tablets"});
  29.             this[3].Children.Add(newCategory { Label = "Phones"});
  30.  
  31.             
  32.             this[0].Children[0].Children.Add(newCategory { Label = "B1", productionShare = 3 });
  33.             this[0].Children[0].Children.Add(newCategory { Label = "B3", productionShare = 3 });
  34.             this[0].Children[0].Children.Add(newCategory { Label = "B4", productionShare = 4 });
  35.  
  36.             this[0].Children[1].Children.Add(newCategory { Label = "S1", productionShare = 3 });
  37.             this[0].Children[1].Children.Add(newCategory { Label = "S2", productionShare = 5 });
  38.             this[0].Children[1].Children.Add(newCategory { Label = "S3", productionShare = 4 });
  39.  
  40.             this[0].Children[2].Children.Add(newCategory { Label = "Sn1", productionShare = 6 });
  41.             this[0].Children[2].Children.Add(newCategory { Label = "Sn2", productionShare = 9 });
  42.  
  43.             this[0].Children[3].Children.Add(newCategory { Label = "SL1", productionShare = 2 });
  44.             this[0].Children[3].Children.Add(newCategory { Label = "Sl2", productionShare = 4 });
  45.             this[0].Children[3].Children.Add(newCategory { Label = "Sl3", productionShare = 3 });
  46.  
  47.            
  48.             this[1].Children[0].Children.Add(newCategory { Label = "d1", productionShare = 3 });
  49.             this[1].Children[0].Children.Add(newCategory { Label = "d2", productionShare = 3 });
  50.             this[1].Children[0].Children.Add(newCategory { Label = "d3", productionShare = 2 });
  51.  
  52.             this[1].Children[1].Children.Add(newCategory { Label = "t1", productionShare = 5 });
  53.             this[1].Children[1].Children.Add(newCategory { Label = "t2", productionShare = 4 });
  54.             this[1].Children[1].Children.Add(newCategory { Label = "t3", productionShare = 2 });
  55.             this[1].Children[1].Children.Add(newCategory { Label = "t4", productionShare = 1 });
  56.  
  57.             this[1].Children[2].Children.Add(newCategory { Label = "sh1", productionShare = 3 });
  58.             this[1].Children[2].Children.Add(newCategory { Label = "sh2", productionShare = 3 });
  59.             this[1].Children[2].Children.Add(newCategory { Label = "sh3", productionShare = 2 });
  60.  
  61.             this[1].Children[3].Children.Add(newCategory { Label = "p1", productionShare = 4 });
  62.             this[1].Children[3].Children.Add(newCategory { Label = "p2", productionShare = 6 });
  63.  
  64.             
  65.             this[2].Children[0].Children.Add(newCategory { Label = "bag1", productionShare = 2 });
  66.             this[2].Children[0].Children.Add(newCategory { Label = "bag2", productionShare = 1 });
  67.             this[2].Children[0].Children.Add(newCategory { Label = "bag3", productionShare = 4 });
  68.  
  69.             this[2].Children[1].Children.Add(newCategory { Label = "j1", productionShare = 3 });
  70.             this[2].Children[1].Children.Add(newCategory { Label = "j2", productionShare = 2 });
  71.  
  72.             this[2].Children[2].Children.Add(newCategory { Label = "sc1", productionShare = 1 });
  73.             this[2].Children[2].Children.Add(newCategory { Label = "sc2", productionShare = 1 });
  74.             this[2].Children[2].Children.Add(newCategory { Label = "sc3", productionShare = 1 });
  75.             this[2].Children[2].Children.Add(newCategory { Label = "sc4", productionShare = 1 });
  76.  
  77.             
  78.             this[3].Children[0].Children.Add(newCategory { Label = "pc1", productionShare = 3 });
  79.             this[3].Children[0].Children.Add(newCategory { Label = "pc2", productionShare = 2 });
  80.             this[3].Children[0].Children.Add(newCategory { Label = "pc3", productionShare = 5 });
  81.  
  82.             this[3].Children[1].Children.Add(newCategory { Label = "l1", productionShare = 4 });
  83.             this[3].Children[1].Children.Add(newCategory { Label = "l2", productionShare = 3 });
  84.  
  85.             this[3].Children[2].Children.Add(newCategory { Label = "tab1", productionShare = 4 });
  86.             this[3].Children[2].Children.Add(newCategory { Label = "tab2", productionShare = 3 });
  87.             this[3].Children[2].Children.Add(newCategory { Label = "tab3", productionShare = 3 });
  88.             this[3].Children[2].Children.Add(newCategory { Label = "tab4", productionShare = 3 });
  89.  
  90.             this[3].Children[3].Children.Add(newCategory { Label = "ph1", productionShare = 2 });
  91.             this[3].Children[3].Children.Add(newCategory { Label = "ph2", productionShare = 3 });
  92.             this[3].Children[3].Children.Add(newCategory { Label = "ph3", productionShare = 2 });
  93.             this[3].Children[3].Children.Add(newCategory { Label = "ph4", productionShare = 1 });
  94.         }
  95.     }

 

Now we have all of the data that we want to visualize. As we are making it look hierarchical it would be nice if the different slices for every category have similar color. What we are going to do is take the basic brush from the innermost ring and lighten it with every step. In the following code you can see that first we figure out how many children does the ring have and then we create a collection of brushes that will be a perfect match for the children.

  1. privatevoid RingSeries_Loaded(object sender, RoutedEventArgs e)
  2. {
  3.     var ringSeries = (sender asRingSeries);
  4.     var count = ringSeries.Ring.ArcItems[0].SliceItems.Count();
  5.     var brushes = ringSeries.Brushes;
  6.     BrushCollection brushesMatch = newBrushCollection();
  7.  
  8.     for (var i = 0; i < count; i++)
  9.     {
  10.         var childrenCount = (ringSeries.ItemsSource asList<Category>)[i].Children.Count();
  11.         var child = (ringSeries.ItemsSource asList<Category>)[i].Children;
  12.  
  13.         var brush = brushes[i];
  14.  
  15.         for (var j = 0; j < childrenCount; j++)
  16.         {
  17.             double step = 1 / (double)childrenCount;
  18.             Random rand = newRandom();
  19.                 double val = (1 + j) * step - .3;
  20.  
  21.                 brushesMatch.Add(brush.GetLightened(val));
  22.         }
  23.     }
  24.  
  25.     ringSeries.Chart.Series[ringSeries.Ring.Index + 1].Brushes = brushesMatch;
  26. }

 

Custom Hierarchial Doughnut Chart

Depending on the data you are going to display, you can change the way the children are colored, for instance you can brush them in random  tint. No matter  what kind of brush you use- Solid, Radial or Linear Gradient the GetLightend extension method will handle it.

  1. privatevoid RingSeries_Loaded(object sender, RoutedEventArgs e)
  2. {
  3.     var ringSeries = (sender asRingSeries);
  4.     var count = ringSeries.Ring.ArcItems[0].SliceItems.Count();
  5.     var brushes = ringSeries.Brushes;
  6.     BrushCollection brushesMatch = newBrushCollection();
  7.  
  8.     for (var i = 0; i < count; i++)
  9.     {
  10.         var childrenCount = (ringSeries.ItemsSource asList<Category>)[i].Children.Count();
  11.         var child = (ringSeries.ItemsSource asList<Category>)[i].Children;
  12.  
  13.         var brush = brushes[i];
  14.  
  15.         for (var j = 0; j < childrenCount; j++)
  16.         {
  17.             Random rand = newRandom();
  18.  
  19.             if (j % 2 == 0)
  20.             {
  21.                 double val = Math.Round((rand.NextDouble() / 4), 2);
  22.                 brushesMatch.Add(brush.GetLightened(-val));
  23.             }
  24.             else
  25.             {
  26.                 double val = Math.Round((rand.NextDouble() / 3), 2) + 0.2;
  27.                 brushesMatch.Add(brush.GetLightened(val));
  28.             }
  29.         }
  30.     }
  31.  
  32.     ringSeries.Chart.Series[ringSeries.Ring.Index + 1].Brushes = brushesMatch;
  33. }

 

Random lighten hierarchical doughnut chart

 

If you want to learn more about the doughnut chart you can check out the product’s page or read my blog:”The Ignite UI Doughnut Chart and its features”.

 

A WPF sample and Silverlight sample.

You can follow us on Twitter @Infragistics and stay in touch on Facebook, Google+ and LinkedIn!

Windows Azure Website issue with Portable class library

$
0
0

I was developing a website that had common logic held in a portable class library. However when I used Git deployment, the compilation on the Azure servers would fail with:
The reference assemblies for framework ".NETPortable,Version=v4.5,Profile=Profile78" were not found.

After much debugging it seems the issue is that the Azure build servers don’t have all the PCL profiles. As a shot term fix, you can go into your PCL properties, and remove support for Windows Phone 8. I changed my project to only support Windows 4.5 & Windows store, and this resolved the issue.

By David Burela

How to make an image gallery with Ignite UI Tile Manager–release 13.2

$
0
0

If you have read my previous blog about Infragistics’ Tile Manager control, you know that this layout control provides a user-friendly interface and allows you to rearrange your images the way you want. In this blog we are going to see what are the changes in the new release. In the last release this control was CTP, but now it is already RTM and it is fully functional. Basically this layout control displays data into tiles and every tile can represent different content depending on its state – minimized or maximized. The minimized state looks like this:

Tile Manager minimized style

When you select a particular picture it enlarge and the panel separates in two parts –a  left panel which displays the tile you have selected and a right panel which contains the other pictures. The right panel has a scrollbar which allows you to scroll the minimized tiles. Using the splitter bar between those panels you can resize both sides of the layout.

When it comes to  the code there are few basic steps you need to follow:

1. Create a div tag element to host your layout.

  1. <divid="dashboard"></div>

2. Add the control:

  1. $(function () {
  2.     $('#dashboard').igTileManager({
  3.         rightPanelTilesWidth: 300,
  4.         rightPanelTilesHeight: 160,                
  5.         marginLeft: 10,
  6.         marginTop: 10,
  7.         dataSource: dataSource,                
  8.         minimizedState:'<img src="${path}" />',
  9.         maximizedState:'<h3>${name}</h3><img src="${path}" />'
  10.     });
  11. });

3. The implementation of the data source and the file upload control stay the same as in the previous sample .The only change is the event handler function.

  1. function UpHand(evt,ui) {       
  2.     $.ajax({
  3.         type: "POST",
  4.         url: "@Url.Action("Image", "Home")",
  5.         data: {image: ui.filePath}
  6.     }).done(function (data) {
  7.         console.log(data);
  8.         dataSource.push(data);
  9.         $("#dashboard").igTileManager("option","dataSource",dataSource);
  10.     }
  11.     )};

That’s it! Now you have a beautiful layout for your app.  You can use the different options that the control offers, like animation duration to make your tiles change faster or use the column width and height to specify the height and width of each column in the container. If you need more information about how to add this control to your application read my previous blog or check out the documentation.

 

Tile Manager

Sample.

 

You can follow us on Twitter @Infragistics and stay in touch on Facebook, Google+ and LinkedIn!

SQLSaturday #199 Bulgaria Event Recap and Follow-up

$
0
0

After the first successful SQLSaturday # 152 in 2012  Infragistics was host and sponsor the conference in SQLSaturday #199   for the second time.

SQLSaturday #199 Bulgaria was held on 26 of October, 2013  at Infragistics Bulgaria office: 110 B, Simeonovsko Shosse Bul., Office Floors II and III

 

Sofia has a history of over 2,000 years

 

Infragistics Bulgaria Office

IG_5F00_Office_5F00_011_5F00_134F0E06[1]IG_5F00_Office_5F00_031_5F00_45D26B78[1]

 

 

What is SQL Saturday:

Infragistics as a company that develops solutions for data visualization and business solutions has many common points in with areas covered from the  conference: BI, Reporting, SQL Server related solutions

Our plan was to have:

  • More than 200 attendees
  • Up to 30 sessions in 5 Tracks
  • More than 15 speakers

 

Registration:

 

 

Keynote:

 

 

Volunteers from Infragistics

 

 

Sessions:

 

 

Sponsors:

 

 

Lunch:

 

 

SQLSaturday Raffle:

 

The actual statistics looks much better than SQLSaturday Bulgaria Team Expected

 

Our statistics:

  • 350 registrations.
  • 210 real attendees from 11 countries (USA, UK, Portugal, Poland, Holland, Belgium, Turkey, Ukraine, Russia, Bulgaria and Serbia).
  • 20 speakers from 10 different countries (USA, UK, Portugal, Poland, Holland, Belgium, Turkey, Ukraine, Russia and Bulgaria).
  • 30 sessions in 5 tracks

 

You can see more pictures from the conference here:

Feedbak in Twitter about SQLSaturday #199 Bulgaria

 

Some Twitter statistics  about SQLSaturday #Bulgaria 2013

Infragistics participation in the event:

The conference schedule is available here:

Now SQLSaturday Bulgaria Team is looking for appropriate dates for SQLSaturday Bulgaria 2014.

More information about SQLSaturday Bulgaria is available  on the website of the conference http://www.sqlsaturday.com/199SQL Saturday Bulgaria Facebook page and you can follow #sqlsat199 on Twitter.

Follow news from Infragistics for more information about new Infragistics events.

As always, you can follow us on Twitter @mihailmateev and @Infragistics and stay in touch on Facebook, Google+ andLinkedIn!

 

Warm Regards,
SQLSaturday Bulgaria Team

 

  Saturday

Viewing all 2223 articles
Browse latest View live