Tweets by @Actipro
Please take some time to learn more about us and our product offerings.
As mentioned in this previous post, we've been looking for ideas to further improve our WPF Docking/MDI product, which already is the market leader for docking tool window and MDI functionality. We've committed to working on a complete internal restructuring of the product that we will call Docking/MDI vNext. We're doing our best to keep the same general API surface, while providing even more advanced features in every area of the product. We've collected suggestions from our customers over the past several years and are working to meet them as best we can with Docking/MDI vNext.
In today's post, I'd like to discuss a feature that has been requested by customers: tool window container title bar customizations.
There have been certain scenarios where a customer has wanted to add custom buttons or content into the tool window container title bar. In the past, you could achieve this by making a clone of the ToolWindowContainer style/template and altering it to include your custom UI in the title bar area. This works but is tedious and we wanted to make this sort of thing very easy to do for vNext.
In vNext, each ToolWindow now has a ContainerTitleBarContentTemplate property that can be set to a DataTemplate to show in the tool window container title bars. This can be a button, a label, or any other UI element you can think of.
In this animated example, we show three auto-hide windows. Each has custom content in the title bar. The "Preview" tool window has a search button that renders with the same style as the other buttons. The "Label" tool window has a status label in the title bar that currently says "Status" but could be data bound to a property.
The "Status" tool window shows a custom circle indicator that says whether the "Is Approved" CheckBox is checked. When the CheckBox is toggled, it updates a value in the tool window's data context and the indicator changes to another color.
As a bonus, we're also showing how custom content can be injected into auto-hide tabs. The indicator for the "Status" tool window also appears there and updates live as well.
These are just some of the really advanced features we're adding to the product for vNext.
Docking/MDI vNext is currently still in early development stages but is progressing very well. Please contact us via email if you are an existing customer and would like to sign up as a beta tester for vNext. If you have any other suggestions for improving Docking/MDI, now is the time to get them in. We'll post more updates on our vNext improvements soon.
In the meantime, please download our current Docking/MDI control product and give it a spin.
In today's post, I'd like to discuss a feature that has been heavily requested by customers over the years: docked size constraints.
In the current Docking/MDI product, there is a minimum size that docked tool windows can become but it is hardcoded. We've had customers request the ability to configure a minimum size for certain tool windows. Other customers have also requested the ability to set a maximum size. Yet others would like to see fixed size tool windows. None of those scenarios are currently supported. Docking/MDI vNext changes that.
In Docking/MDI vNext, you're able to optionally specify minimum and maximum docked sizes for each tool window. We've written a lot of complex logic to support this feature in our layouts. As the DockSite changes size, the tool windows all reflow and do their best to adhere to the docked size constraints that have been given. It works very nicely.
Want to have a fixed size tool window? This can be achieved by simply setting the minimum docked size to be the same as the maximum docked size.
Best of all, splitting (also reimplemented for vNext) is fully aware of the constraints and won't let you drag splitters beyond what the the size constraints allow.
Let's have a look at how constraints work with splitters. In the screenshot below, I've turned off live splitting so that we can see the splitter drag highlights. In this layout, the Properties tool window has a minimum docked size constraint set.
As the mouse drags the splitter upward, you can see how the class view is allowed to become very short and the splitter is still tracking with the mouse.
Later, the mouse is dragging downward but the splitter has reached the point where the minimum constraint of the Properties tool window is. Thus the mouse cursor is down below the splitter (I kept moving the mouse down), showing that the splitter can't go any further in that direction.
This is a great feature that we've spent a lot of time on for Docking/MDI vNext. vNext is currently still in early development stages but is progressing very well. Please contact us via email if you are an existing customer and would like to sign up as a beta tester for vNext.
If you have any other suggestions for improving Docking/MDI, now is the time to get them in. We'll post more updates on our vNext improvements soon.
We've had a lot of customers throughout the years ask us for a sample that could show how to harness our SyntaxEditor .NET Languages Add-on and its automated IntelliPrompt within an ASP-style server tag context. This is especially useful for any sort of template generating scenario.
We had an internal sample that we would send customers upon request, but several months back, we cleaned it up, enhanced it, and added it as a new QuickStart sample. In this post, let's have a look at the QuickStart sample that was added to the SyntaxEditor for (WPF, Silverlight, and WinRT/XAML platforms) in the 2014.2 version showing how to achieve automated IntelliPrompt within ASP-style server tags.
In the animated presentation below, you can see how there is a basic parent language whose lexer only knows to tokenize and color the word "date" as a keyword. In real-world usage, the lexer could be made to fully colorize the text like normal. The lexer has hooks that cause a transition to the C# language found in our .NET Languages Add-on when ASP-style delimiters are encountered.
Both <% %> and <%= %> style tags are shown in this example. What happens behind the scenes is that the parent language's parser will code generate C# code. It will make a C# class named "__Generated" and a method named "__WriteOutput". All the text of the parent language is output within "Response.Write" method calls. C# code in the server tags is injected directly. The resulting full C# code is placed in a separate in-memory document and parsed. Finally the resulting parse data is returned, along with mapping data to know how offsets between the server tag range in the source document and those in the parsed C# document align.
Then there are several customized C# IntelliPrompt providers that know how to use that mapping data and translate offsets so that automated IntelliPrompt is fully functional within the server tag regions of the main source document, yet based on the generated C# code.
Tricky stuff, but it works great!
The full source sample described above was added in the first v2014.2 release of our WPF, Silverlight, and WinRT/XAML controls and is available for you to check out.
Let's have a look at a new feature that came to the advanced XML language for SyntaxEditor for WPF (via its Web Languages Add-on) in the latest 2014.2 maintenance release: the ability to auto-complete XML end tags.
The advanced XML language already has auto-end tag insertion features that occur as you type the > character at the end of a start tag. In that scenario, the end tag is inserted immediately after the caret. There are other times where you have deleted some text that may include an end tag that you wish to type back in again.
Say that you are editing a block of XML and start to type an end tag. After typing the < character, the completion list will contain an item for closing the nearest open ancestor element (if any):
In the example above, you can see the "/colors" item in the completion list and how selecting it auto-completes the end tag.
End tag auto-completion also works if you put the caret after a </ and press Ctrl+Space, as in this example:
In the example above, Ctrl+Space is pressed at the caret's location to auto-complete the "colors>" text.
The features described above were added in the latest v2014.2 maintenance releases of our WPF Controls and are available for use.
In today's post I'd like to show a new feature that was added to SyntaxEditor (WPF, Silverlight, and WinRT/XAML platforms) in its latest 2014.2 maintenance release: read-only regions.
SyntaxEditor documents have always had the ability to be fully read-only and developers can also can cancel specific text change events for more fine-grained control. That being said, there are many cases where developers want to have an easy way to tell SyntaxEditor that a certain of text should not be editable by the end user. That's where read-only regions come into play.
Read-only regions are implemented using our powerful tagging mechanism. There is a new IReadOnlyRegionTag interface (with related ReadOnlyRegionTag implementation class) that can be used to mark read-only regions. Getting going is as easy as tagging a text range using an instance of that class.
Best of all, the ReadOnlyRegionTag class also implements IClassificationTag, which associates the tag with a classification type for read-only text and gets styled with a silver background. Of course this is fully customizable if you wish to have a different appearance, or no appearance difference at all.
When the end user attempts to edit anything that would cross within a read-only range, the text change will realize that it intersects a read-only range and will cancel. The text range protected by the read-only region remains unchanged.
This is a very handy feature for certain scenarios and was highly requested by our customers.
The read-only region features described above were added in the latest v2014.2 maintenance releases of our WPF, Silverlight, and WinRT/XAML controls and are available for use.
In this quarter, we published large maintenance releases for the 2014.2 versions of our WPF, Silverlight, WinRT/XAML, and WinForms controls. These versions included several new controls and some big feature enhancements for our existing controls. Check out the release posts for more detail.
We've started work on our 2015.1 versions of our controls. These will feature some new controls, major improvements to our SyntaxEditor Python Language Add-on, and many other updates. One thing we're working on is rewriting much of the core of our Docking/MDI for WPF product so that we can support even more advanced features found in the latest IDEs.
WinForms Controls 2014.1 build 322 has been released and is now available for download.
See the announcement post for the detailed list of enhancements and updates.
New maintenance of the 2014.2 versions of our WPF, Silverlight, and WinRT/XAML controls have been released and are now available for download.
Major new features are described below. See the announcement posts for the detailed list of enhancements and updates, including many items not listed below:
The Country class, which contains ISO country data and is utilized by our CountryComboBox control, now also includes the 3-character alpha code data for each country.
This is in addition to the existing data of 2-character alpha code and name.
We've improved how the PropertyGrid handles properties on the root SelectedObjects that have a custom type converter.
We've also improved support for handling immutable objects and determining how to interact with their properties.
The Custom Factory sample has been updated to show a property with a non-string type.
This is a great example of showing how to implement a custom data factory and merge properties from various object sources.
We've improved keyboard navigation in the TaskTabControl control, which is generally used within Backstage tabs.
The logic for the sizing of contextual tab groups and their tabs always has had some minor issues when resizing the containing window to be thinner. The issue didn't often manifest itself unless multiple contextual tab groups were displayed.
We spent a while tracking these issues down and fixing them so that all layout sizing is now perfect, as seen in the screenshot above.
We've added support for read-only regions of text via the new IReadOnlyRegionTag tag. This feature has been highly requested by customers, so we're happy to deliver it.
There is a ReadOnlyRegionTag implementation class that supports classification so that read-only regions can be rendered with an alternate background, such as gray in the screenshot above. A new Read-Only Regions QuickStart that demos the new features is now in the Sample Browser.
Another highly-requested set of commands for moving the selected lines up (via Alt+Up) and down (via Alt+Down) have been added. The SDI Editor demo's menu has been updated to show off the new editor commands.
We did a lot of performance profiling related to IntelliPrompt completion lists and we able to make numerous performance enhancements in the areas of item matching and filtering. These enhancements will really help performance when displaying large completion lists.
A SyntaxEditor.IsDragDropTextReselectEnabled property has been added that can be set to false to prevent reselection of dropped text.
Views have been updated so that text changes from a data bound source (such as view model) don't scroll the view back to the first line on each update.
The line commenter has been updated to improve how line comment and uncomment features affect selection. The logic that gets activated by the LineBasedLineCommenter.CanCommentEmptyLines property also has been improved.
We've made several improvements to caret movement when editing bi-directional text.
All of the event ties between the UI and document models have been changed to use weak events.
The ability to resolve references to nested types has been improved.
A completion item for closing the nearest open ancestor element, if any, has been added. (WPF only)
Ctrl+Space after an end tag start delimiter will also auto-complete the matching start tag's name. (WPF only)
We've also improved the editing experience when typing to not affect outlining nodes as much.
New primitive shapes have been added that can be used to create some interesting user interface elements in your apps. The Wave shape renders a wavy line. The ZigZag shape renders a zig-zag line.The Shapes QuickStart has been updated with examples showing usage of the new shapes.
In the 2014.2 versions of our controls for the WPF, Silverlight, and WinRT/XAML platforms we've been adding several new shape controls to our Shared Library that can be very handy in setting up unique interfaces in your apps.
Yesterday's post examined the new Triangle shape. For today's post, we'll take a look at a new ZigZag shape that is coming in the next 2014.2 maintenance release.
The zig-zag shape renders straight lines that cross from one edge of the shape to the other, and back again. The apex side and the number of apexes to render can be specified. It's also possible to set whether the "inside" (fill) of the shape is inverted, or moved to the other side of the apexes.
Standard fill and stroke properties can be used to give the shape varied appearances. The example on the right above is particularly interesting because it shows how an "inverted" zig-zag provides the left side of the red ribbon. It is aligned next to a rectangle (behind the "New!") text, which allows it to generate a complex composited shape.
Zig-zag shapes are great for use when content requires a separator.Instead of always using a linear horizontal or vertical rule to separate content, the zig-zag shape adds some variety to the user interface.
Although shapes like zig-zags are small primitive controls, they can be very helpful in creating modern interesting user interfaces that don't rely purely on squares and rectangles.
You will be able to use our ZigZag class once the next maintenance releases of our 2014.2 WPF, Silverlight, and WinRT/XAML controls are published.
In the 2014.2 versions of our controls for the WPF, Silverlight, and WinRT/XAML platforms we added several new shape controls to our Shared Library that can be very handy in setting up unique interfaces in your apps.
For this post, we'll take a look at a new Triangle shape. Incidentally this shape is used in the MicroTrendIndicator control we recently added to our Micro Charts controls.
The triangle shape is a basic triangle that will fill the area you give it. You use an enumeration to set which side the apex (point) of the triangle is on.
Standard fill and stroke properties can be used to give the shape varied appearances.
While a triangle shape standalone might not be very interesting, when it's combined seamlessly into other UI, it can make for some very nice presentations.
In this usage scenario, we use the triangle shape to help build a touch-friendly sort of breadcrumb control.
Here's another breadcrumb usage scenario but in this case, a smaller centered triangle is used to divide the items.
Although shapes like triangles are small primitive controls, they can be very helpful in creating modern interesting user interfaces that don't rely purely on squares and rectangles.
You can use our Triangle class today by downloading the latest versions of our WPF, Silverlight, and WinRT/XAML controls.