65.9K
CodeProject is changing. Read more.
Home

WPF Tips and Facts

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Oct 31, 2011

CPOL
viewsIcon

6680

Some useful WPF tips.

  • Do you know that there is no way (at least from my research and experiments) to hide the control box of a dialog? I tried several ways including using Native GetWindowLong and SetWindowLong to set the border style as fixed dialog but in vein.
  • One of the hardest things in WPF is to prevent re-size of a column in ListView. One way is to completely templatize ColumnHeader and comment out the thumb gripper. This approach is listed here. I like the other approach listed in the article where one can attach a handler like:
  • MyListView.AddHandler(Thumb.DragDeltaEvent, 
        new DragDeltaEventHandler(this.OnHeaderResize), true);

    And handle it:

    private void OnHeaderResize(object sender, DragDeltaEventArgs e)
    {
    	Thumb SenderAsThumb = e.OriginalSource as Thumb;
    	GridViewColumnHeader header = 
    	  SenderAsThumb.TemplatedParent as GridViewColumnHeader;
    
    	if (header == null)
    	{
    		return;
    	}
    
    	GridView view = (MyListView.View as GridView);
    
    	// If user tries to resize checkbox column, reset the width to fixed
    	if (view.Columns[0] == header.Column)
    	{
    		header.Column.Width = FixedWidth;
    		e.Handled = true; 
    	} 
    }
  • ListView and CheckBox - Following is a method to add a checkbox both to the header and to the column rows in the ListView:
  • <ListView Height="200" x:Name="MyListView">
       <ListView.View>
           <GridView>
               <GridViewColumn>
                   <GridViewColumn.HeaderTemplate>
                       <DataTemplate>
                           <CheckBox Checked="AllSelectionChanged" 
                                   Unchecked="AllSelectionChanged"/>
                       </DataTemplate>
                   </GridViewColumn.HeaderTemplate>
                   <GridViewColumn.CellTemplate>
                       <DataTemplate>
                           <CheckBox IsChecked="{Binding Selected}"/>
                       </DataTemplate>
                   </bsp;           </GridViewColumn.CellTemplate>
               </GridViewColumn>
               <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
                   <GridViewColumn Header="Version" 
                           DisplayMemberBinding="{Binding Version}"/>
               <GridViewColumn Header="Path" DisplayMemberBinding="{Binding Path}"/>
           </GridView>
       </ListView.View>
    </ListView>
    <gridview allowscolumnreorder="False">
    <gridviewcolumn width="25">
    <gridviewcolumn.headertemplate>
    <listview name="MyListView" height="200">
    <listview.view><gridview>
    <gridviewcolumn><gridviewcolumn.headertemplate>

    You can then handle global check / uncheck like:

    private void AllSelectionChanged(object sender, RoutedEventArgs e)
    {
    	CheckBox chkBox = sender as CheckBox;
    	if (chkBox != null)
    	{
    		bool check = chkBox.IsChecked.Value;
    
    		foreach ([YourBoundType] selection in MyListView.Items)
    		{
    			selection.Selected = check;
    		}
    	}
    }