Monday, January 25, 2010

Zoom event for FlowDocumentPageViewer (corrected)

Download source files - here

When I wrote my article Zoom and page chaged events for FlowDocumentPageViewer I make mistake, you can read about it - there. However Martin offer solution for this problem. But I don't like this solution, overriding of OnPropertyChanged isn't best solution because this method is risen in many cases so any logic there is serious performance issue.
So how can we fix it in other way? We can find object of Slider in Visual Tree of FlowDocumentPageViewer and subscribe to ValueChanged event and call OnZoomChanged(); there.
Bingo! It fixes my trouble.

Sunday, January 24, 2010

Trips&Ticks: How to implement GroupName for RadioButton in WPF DataGrid's column?

Download source files - here

It is very easy. We should use DataGridTemplateColumn for this. My acquaintance requested to me show it. I added source code where implemented this.

Some notes:
  • You should turn off AutoGenerateColumns feature. In other case control will have duplicate values.
  • I recommend to turn off CanUserAddRows. In other case user can pick undefined row.
Enjoy Yulian ;).

Friday, January 15, 2010

Web access to Team Foundation Server.

I have been starting to work with Team Foundation Server as source control and bag tracking system for 2 month. In this time we migrated from one TFS to another. So sometime we needed access to both these servers (one as bug track, another as source control). I said to my manager about web access tool for TFS he heard it already that this tool is very cool but expensive.
It isn't truth. This tool is useful but full freeware! Because Microsoft Acquired TeamPlain 3 year ago :). When I tried to find it - I was a bit disappointed I couldn't found this tool - all links were broken. Little find out shows that TeamPlain is renamed to Team System Web Access. I founded article that describes How to: Install Team System Web Access (this page also contains broken link to installation of Team System Web Access :) ) and after all I found download page.
That isn't fresh news, but it is very upset that this useful tool is so hard for found.

Tuesday, November 24, 2009

Useful code snippets for WPF developer.

Download snippets - here

I want to share very useful in my opinion code snippets for WPF developers. Most of they were created my friend - Dmitrij Zakharov. Moreover I want to add a short description to each snippets.

Note:
The Code Snippet Inserter inserts a code snippet at the cursor location, or inserts a surround-with code snippet around the currently selected code.

Don't you know how to use code snippets? You should read next article - How to: Use Code Snippets (C#). You should copy the code snippets files to Installation directory\Microsoft Visual Studio 9.0\VC#\Snippets\1033\NetFX30 in your PC for start to use.

Let me start:
  • addowner - Adds owner to the dependency property that already exists.
  • defstyle - Code snippet for overriding DefaultStyleKey.
  • propa - Code snippet for an attached property using DependencyProperty as the backing store. It is the common code snippet that is delivered with installation of VS2008
  • propdp - Code snippet for a property using DependencyProperty as the backing store. It is the common code snippet that is delivered with installation of VS2008
  • propdpec - Code snippet for a property with value caching and events support using DependencyProperty as the backing store.
  • propdpr - Code snippet for a property using DependencyPropertyKey as the backing store.
  • routedcmd - Implements routed command executor.
  • routedevent - Declares and implements routed event.
PS: Do you want to know more? - read about Default Code Snippets.

Thursday, November 19, 2009

Zoom and page changed events for FlowDocumentPageViewer

Download source files - here

My old known Bala send to me this link.
Kent Boogaart has written an article that describes approach searching and highlighting text in FlowDocumentPageViewer - Search and Highlight Text in an Arbitrary Visual Tree. Unfortunate, two serious issues present there. I copy theirs description from msdn forum:
  1. When I change the pages of the FlowDocumentPageViewer, my Rectangular highlighted area remains the same and it is not sinking with the Text.
  2. When I zoom in or zoom out of the FlowDocumentPageViewer, the text gets zoomed but the Highlight rectangle remains in the same position.
Seems.. solution should be easy - just add DoSeach() method in PageChanged and ZoomChanged event handler methods of FlowDocumentPageViewer but it doesn't have events for notice these actions. So I decided just to implement these events :). FlowDocumentPageViewer doesn't have protected and virtual methods like OnZoomChanged or OnPageChanged. It was bad. But I found four protected and virtual methods that could help me they are OnNextPageCommand(), OnPreviousPageCommand(), OnIncreaseZoomCommand() and OnDecreaseZoomCommand(). When I added call to rise my events in theirs override methods I found that this approach wasn't work. It happened because command logic works through concurrency approach. I called the rise methods through BeginInvoke for delay the calls rise methods - and problem was solved.
You can download sources with fix above.

PS: I didn't have time for full investigate sources.. but one question. Why did Kent use SearchRectangle class? In my opinion common Rect is enough.

Monday, November 16, 2009

How to implement TextBox with PlaceHolder in WPF

Download source files - here

Using PlaceHolder is very useful thing for UI in any type application. I want to show a short way how can you implement it in WPF.
You can custom TextBox and add place-holder text on MouseEnter and remove on MouseLeave events. In this case place-holder's text looks like original text.. You can experiment with Foreground property, but truth me - you will not be satisfy.
Let my suggest other way. You can use AdornerLayer for host the place-holder text. In this case you should create class that is inherit from Adorner and this class should show your place-holder text on AdornerLayer. I've create little sample that demonstrate this.

Unfortunate, AdornerLayer doesn't presented over any Popup controls. So this solution isn't worked if you put our customized TextBox control in any Popup and as item in Menu or ComboBox controls.

Friday, October 16, 2009

Performance degrades in your Silverlight App!? What can you do?


Some time ago I had written Silverlight app and I confronted with difficulties of difference between WPF and Silverlight :). When I had vanquished mismatches I found that performance of my app was serous degraded. I have done a little investigate of ways that can help to correct this issues.
  1. MaxFrameRate
  2. EnableGPUAcceleration & BitmapCash
  3. CompositionTarget.Rendering
MaxFrameRate - presents the maximum number of frames that Silverlight can render per second. The default value is 60 second. I've set 30 in my app - looks pretty. This property likes DesiredFrameRate in WPF. Target is clear - reduce frame rate. It is useful when more animations are started in Silverlight app.
You can set it from Silverlight code:

App.Current.Host.Settings.MaxFrameRate=30;

or as parameter of object on HTML page:

<param name="framerate" value="30">

Pay attention there is a mismatch naming in Silverilght code and HTML. Why is it? You can read there.

EnableGPUAcceleration & BitmapCash - allows to cache visual object when it is possible. You should switch on EnableGPUAcceleration that Cache has any effect. This approach is useful when your app has opacity or transform operations applied to it.
You can set it from Silverlight code:

You can't change it from Silverlight because it should be set before app's initialization.

or as parameter of object on HTML page:

<param name="EnableGPUAcceleration" value="true" />

and set CacheMode. In current moment BitmapCache is supported only.
You can set it in C# code:

LayoutRoot.CacheMode = new BitmapCache();

or in XAML:

<Grid x:Name="LayoutRoot" CacheMode="BitmapCache">

Some objects don't look well (high-resolution images for example) you can increase RenderAtScale property of BitmapCache class for avoid this mess. Default value of this property is 1, when I set 4 (like MSDN's samples) quality restores but performance degrades again. A value between 2-3 is god for my app.
You can set it in C# code:

LayoutRoot.CacheMode = new BitmapCache
{
RenderAtScale = 2.5,
};


or in XAML:

<Grid x:Name="LayoutRoot">
<Grid.CacheMode>
<BitmapCache RenderAtScale="2.5" />
</Grid.CacheMode>
</Grid>


CompositionTarget.Rendering - this event rises before the objects in the composition tree are rendered. How does it can help? In common case - doesn't. But if you zoom your object in app (or in same other manner move out of bounds some item) - it is very useful. Look in my case:
First - subscribe event handler's method in constructor of your main window:

CompositionTarget.Rendering += new EventHandler( OnCompositionTargetRendering );

Second - handler method:

private void OnCompositionTargetRendering( object sender, EventArgs e )
{
//--- Start 1 -- //
foreach ( GalleryItem item in xGalleryCanvas.Children )
{
if ( Visibility.Collapsed == item.Visibility )
{
item.Visibility = Visibility.Visible;
}
}
//--- End 1 -- //
//--- Start 2 -- //
if ( _isZoomed && 0 < rect =" new" visibleitems =" VisualTreeHelper.FindElementsInHostCoordinates(" f =""> f.GetType() == typeof( GalleryItem ) );

foreach ( GalleryItem item in xGalleryCanvas.Children )
{
if ( !visibleItems.Contains( item ) )
{
item.Visibility = Visibility.Collapsed;
}
}
//--- End 2 -- //
}

Some explanation: You should ascertain that all items are visible (block 1).
Note: Dependency property works not so good as in WPF. So you should change Visibility only of collapsed items. In other case you serious reduce the performance.
Use mix of FindElementsInHostCoordinates() of VisualTreeHelper and LINQ for create collection all visible items in current moment and collapse all other items (block 2).

Promise these three approaches can help as these help me.

PS: Recently I've found useful tips of Silverlight performance. You can read it there - Performance Tips.