Click here to Skip to main content
15,897,090 members
Articles / Desktop Programming / WPF

ListBox Styling (Part 3 - Additional Templates) in Expression Blend and Silverlight

Rate me:
Please Sign up or sign in to vote.
5.00/5 (38 votes)
6 May 2010CPOL20 min read 129K   5.2K   49  
Explanation and examples of Additional Templates and Generated Content of a ListBox. Covering Layout, Transitions, and Animation.
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MVVMFileManager="clr-namespace:MVVMFileManager" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:ee="http://schemas.microsoft.com/expression/2010/effects" mc:Ignorable="d"
	x:Class="MVMFileManager.MainPage"
	Width="600" Height="400">
	<UserControl.Resources>
	<!-- Resource dictionary entries should be defined here. -->
		<sdk:HierarchicalDataTemplate x:Key="SilverlightFolderTemplate" ItemsSource="{Binding SubFolders}">
			<StackPanel Orientation="Horizontal">
				<ContentControl x:Name="FolderIconOpen" Content="ContentControl" Height="14" Style="{StaticResource FolderIconOpen}" Width="16" Margin="0"/>
				<TextBlock Text="{Binding FolderName}" Margin="5,0,0,0"/>
			</StackPanel>
		</sdk:HierarchicalDataTemplate>
		<DataTemplate x:Key="SilverlightFileTemplate">
			<StackPanel Orientation="Horizontal" Margin="0,1,0,0">
				<ContentControl x:Name="PageIcon" Content="ContentControl" Height="16" Style="{StaticResource PageIcon}" Width="14" Margin="4,0,0,0"/>
				<HyperlinkButton Content="{Binding FileName}" NavigateUri="{Binding FilePath}" Foreground="Black" Margin="4,0,0,0"/>
			</StackPanel>
		</DataTemplate>
		<sdk:HierarchicalDataTemplate x:Key="SilverlightFolderTemplate1" ItemsSource="{Binding SubFolders}">
			<StackPanel>
				<TextBlock Text="{Binding FolderName}"/>
				<TextBlock Text="{Binding FullPath}"/>
			</StackPanel>
		</sdk:HierarchicalDataTemplate>
		<DataTemplate x:Key="SilverlightFileTemplate1">
			<StackPanel>
				<TextBlock Text="{Binding FileName}"/>
				<TextBlock Text="{Binding FilePath}"/>
			</StackPanel>
		</DataTemplate>
		<ControlTemplate x:Key="ValidationToolTipTemplate">
			<Grid x:Name="Root" Margin="5,0" Opacity="0" RenderTransformOrigin="0,0">
				<Grid.RenderTransform>
					<TranslateTransform x:Name="xform" X="-25"/>
				</Grid.RenderTransform>
				<VisualStateManager.VisualStateGroups>
					<VisualStateGroup x:Name="OpenStates">
						<VisualStateGroup.Transitions>
							<VisualTransition GeneratedDuration="0"/>
							<VisualTransition GeneratedDuration="0:0:0.2" To="Open">
								<Storyboard>
									<DoubleAnimation Duration="0:0:0.2" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="xform">
										<DoubleAnimation.EasingFunction>
											<BackEase Amplitude=".3" EasingMode="EaseOut"/>
										</DoubleAnimation.EasingFunction>
									</DoubleAnimation>
									<DoubleAnimation Duration="0:0:0.2" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/>
								</Storyboard>
							</VisualTransition>
						</VisualStateGroup.Transitions>
						<VisualState x:Name="Closed">
							<Storyboard>
								<DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/>
							</Storyboard>
						</VisualState>
						<VisualState x:Name="Open">
							<Storyboard>
								<DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="xform"/>
								<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/>
							</Storyboard>
						</VisualState>
					</VisualStateGroup>
				</VisualStateManager.VisualStateGroups>
				<Border Background="#052A2E31" CornerRadius="5" Margin="4,4,-4,-4"/>
				<Border Background="#152A2E31" CornerRadius="4" Margin="3,3,-3,-3"/>
				<Border Background="#252A2E31" CornerRadius="3" Margin="2,2,-2,-2"/>
				<Border Background="#352A2E31" CornerRadius="2" Margin="1,1,-1,-1"/>
				<Border Background="#FFDC000C" CornerRadius="2"/>
				<Border CornerRadius="2">
					<TextBlock Foreground="White" MaxWidth="250" Margin="8,4,8,4" TextWrapping="Wrap" Text="{Binding (Validation.Errors)[0].ErrorContent}" UseLayoutRounding="false"/>
				</Border>
			</Grid>
		</ControlTemplate>
		<Style x:Key="ScrollViewerStyleOuterMVVM" TargetType="ScrollViewer">
			<Setter Property="HorizontalContentAlignment" Value="Left"/>
			<Setter Property="VerticalContentAlignment" Value="Top"/>
			<Setter Property="VerticalScrollBarVisibility" Value="Visible"/>
			<Setter Property="Padding" Value="4"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="BorderBrush" Value="{x:Null}"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="ScrollViewer">
						<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2">
							<Grid Background="{TemplateBinding Background}">
								<Grid.ColumnDefinitions>
									<ColumnDefinition Width="*"/>
									<ColumnDefinition Width="Auto"/>
								</Grid.ColumnDefinitions>
								<Grid.RowDefinitions>
									<RowDefinition Height="*"/>
									<RowDefinition Height="Auto"/>
								</Grid.RowDefinitions>
								<ScrollContentPresenter x:Name="ScrollContentPresenter" Cursor="{TemplateBinding Cursor}" ContentTemplate="{TemplateBinding ContentTemplate}" Margin="{TemplateBinding Padding}"/>
								<Rectangle Grid.Column="1" Fill="#FFE9EEF4" Grid.Row="1" Visibility="Collapsed"/>
								<ScrollBar x:Name="VerticalScrollBar" Grid.Column="1" IsTabStop="False" Maximum="{TemplateBinding ScrollableHeight}" Margin="0,3,3,3" Minimum="0" Orientation="Vertical" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{TemplateBinding VerticalOffset}" ViewportSize="{TemplateBinding ViewportHeight}" Width="18" Style="{StaticResource ScrollBarStyleDarkGreen}"/>
								<ScrollBar x:Name="HorizontalScrollBar" Grid.Column="0" Height="18" IsTabStop="False" Maximum="{TemplateBinding ScrollableWidth}" Margin="3,0,3,3" Minimum="0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{TemplateBinding HorizontalOffset}" ViewportSize="{TemplateBinding ViewportWidth}" Style="{StaticResource ScrollBarStyleDarkGreen}"/>
							</Grid>
						</Border>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
			<Setter Property="Margin" Value="5"/>
		</Style>
		<Style x:Key="ScrollViewerStyleInnerMVVM" TargetType="ScrollViewer">
			<Setter Property="HorizontalContentAlignment" Value="Left"/>
			<Setter Property="VerticalContentAlignment" Value="Top"/>
			<Setter Property="Padding" Value="4"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="ScrollViewer">
						<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="6" Background="{TemplateBinding Background}">
							<Border x:Name="BGroundOverlay" BorderThickness="1" CornerRadius="6">
								<Border.Background>
									<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
										<GradientStop Color="#F2FFFFFF" Offset="0"/>
										<GradientStop Color="#F2FFFFFF" Offset="1"/>
										<GradientStop Color="White" Offset="0.3"/>
										<GradientStop Color="White" Offset="0.7"/>
									</LinearGradientBrush>
								</Border.Background>
								<Grid d:LayoutOverrides="Width">
									<Grid.ColumnDefinitions>
										<ColumnDefinition Width="*"/>
										<ColumnDefinition Width="Auto"/>
									</Grid.ColumnDefinitions>
									<Grid.RowDefinitions>
										<RowDefinition Height="*"/>
										<RowDefinition Height="Auto"/>
									</Grid.RowDefinitions>
									<ScrollContentPresenter x:Name="ScrollContentPresenter" Cursor="{TemplateBinding Cursor}" ContentTemplate="{TemplateBinding ContentTemplate}" Margin="{TemplateBinding Padding}"/>
									<Rectangle Grid.Column="1" Fill="#FFE9EEF4" Grid.Row="1" Visibility="Collapsed"/>
									<ScrollBar x:Name="VerticalScrollBar" Grid.Column="1" IsTabStop="False" Maximum="{TemplateBinding ScrollableHeight}" Margin="0,5,5,5" Minimum="0" Orientation="Vertical" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{TemplateBinding VerticalOffset}" ViewportSize="{TemplateBinding ViewportHeight}" Width="18" Style="{StaticResource ScrollBarStyleDarkGreen}"/>
									<ScrollBar x:Name="HorizontalScrollBar" Grid.Column="0" Height="18" IsTabStop="False" Maximum="{TemplateBinding ScrollableWidth}" Margin="5,0,5,5" Minimum="0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{TemplateBinding HorizontalOffset}" ViewportSize="{TemplateBinding ViewportWidth}" Style="{StaticResource ScrollBarStyleDarkGreen}"/>
								</Grid>
							</Border>
						</Border>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
			<Setter Property="Background" Value="White"/>
			<Setter Property="BorderBrush" Value="Black"/>
		</Style>
		<Style x:Key="ListBoxStyleMVVM" TargetType="ListBox">
			<Setter Property="Padding" Value="1"/>
			<Setter Property="Background" Value="#FF084256"/>
			<Setter Property="Foreground" Value="#FF000000"/>
			<Setter Property="HorizontalContentAlignment" Value="Left"/>
			<Setter Property="VerticalContentAlignment" Value="Top"/>
			<Setter Property="IsTabStop" Value="False"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="TabNavigation" Value="Once"/>
			<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
			<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="ListBox">
						<Grid>
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="ValidationStates">
									<VisualState x:Name="Valid"/>
									<VisualState x:Name="InvalidUnfocused">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<Visibility>Visible</Visibility>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="InvalidFocused">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<Visibility>Visible</Visibility>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<System:Boolean>True</System:Boolean>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
							</VisualStateManager.VisualStateGroups>
							<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="7">
								<ScrollViewer x:Name="ScrollViewer" BorderThickness="0" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}" Style="{StaticResource ScrollViewerStyleInnerMVVM}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}">
									<ItemsPresenter Margin="0,8,0,0"/>
								</ScrollViewer>
							</Border>
							<Border x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="7" Visibility="Collapsed">
								<ToolTipService.ToolTip>
									<ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource ValidationToolTipTemplate}">
										<ToolTip.Triggers>
											<EventTrigger RoutedEvent="Canvas.Loaded">
												<BeginStoryboard>
													<Storyboard>
														<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip">
															<DiscreteObjectKeyFrame KeyTime="0">
																<DiscreteObjectKeyFrame.Value>
																	<System:Boolean>true</System:Boolean>
																</DiscreteObjectKeyFrame.Value>
															</DiscreteObjectKeyFrame>
														</ObjectAnimationUsingKeyFrames>
													</Storyboard>
												</BeginStoryboard>
											</EventTrigger>
										</ToolTip.Triggers>
									</ToolTip>
								</ToolTipService.ToolTip>
								<Grid Background="Transparent" HorizontalAlignment="Right" Height="10" Margin="0,-4,-4,0" VerticalAlignment="Top" Width="10">
									<Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="-1,3,0,0"/>
									<Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="-1,3,0,0"/>
								</Grid>
							</Border>
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
			<Setter Property="BorderBrush" Value="#FF084256"/>
		</Style>
		<Style x:Key="ListBoxItemStyleMVVM" TargetType="ListBoxItem">
			<Setter Property="Padding" Value="3"/>
			<Setter Property="HorizontalContentAlignment" Value="Left"/>
			<Setter Property="VerticalContentAlignment" Value="Top"/>
			<Setter Property="Background" Value="Transparent"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="TabNavigation" Value="Local"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="ListBoxItem">
						<Grid x:Name="grid" Background="{TemplateBinding Background}" Margin="0" RenderTransformOrigin="0.5,0.5">
							<Grid.RenderTransform>
								<CompositeTransform/>
							</Grid.RenderTransform>
							<Grid.Projection>
								<PlaneProjection/>
							</Grid.Projection>
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="CommonStates">
									<VisualStateGroup.Transitions>
										<VisualTransition GeneratedDuration="0:0:1">
											<ei:ExtendedVisualStateManager.TransitionEffect>
												<ee:RippleTransitionEffect/>
											</ei:ExtendedVisualStateManager.TransitionEffect>
										</VisualTransition>
									</VisualStateGroup.Transitions>
									<VisualState x:Name="Normal"/>
									<VisualState x:Name="MouseOver">
										<Storyboard>
											<DoubleAnimation Duration="0" To="0.35" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor"/>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="Disabled">
										<Storyboard>
											<DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="contentPresenter"/>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
								<VisualStateGroup x:Name="SelectionStates">
									<VisualStateGroup.Transitions>
										<VisualTransition GeneratedDuration="0:0:1">
											<ei:ExtendedVisualStateManager.TransitionEffect>
												<ee:SlideInTransitionEffect/>
											</ei:ExtendedVisualStateManager.TransitionEffect>
										</VisualTransition>
										<VisualTransition From="Selected" GeneratedDuration="0:0:1">
											<ei:ExtendedVisualStateManager.TransitionEffect>
												<ee:BlindsTransitionEffect Count="3"/>
											</ei:ExtendedVisualStateManager.TransitionEffect>
										</VisualTransition>
									</VisualStateGroup.Transitions>
									<VisualState x:Name="Unselected"/>
									<VisualState x:Name="Selected">
										<Storyboard>
											<DoubleAnimation Duration="0" To=".75" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor2"/>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
								<VisualStateGroup x:Name="FocusStates">
									<VisualState x:Name="Focused">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="FocusVisualElement">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<Visibility>Visible</Visibility>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="Unfocused"/>
								</VisualStateGroup>
								<VisualStateGroup x:Name="LayoutStates">
									<VisualStateGroup.Transitions>
										<VisualTransition GeneratedDuration="0:0:1">
											<VisualTransition.GeneratedEasingFunction>
												<BounceEase EasingMode="EaseOut"/>
											</VisualTransition.GeneratedEasingFunction>
										</VisualTransition>
									</VisualStateGroup.Transitions>
									<VisualState x:Name="AfterLoaded"/>
									<VisualState x:Name="BeforeLoaded">
										<Storyboard>
											<DoubleAnimation Duration="0" To="250" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="BeforeUnloaded"/>
								</VisualStateGroup>
							</VisualStateManager.VisualStateGroups>
							<VisualStateManager.CustomVisualStateManager>
								<ei:ExtendedVisualStateManager/>
							</VisualStateManager.CustomVisualStateManager>
							<Rectangle x:Name="fillColor" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="5" RadiusX="5" Margin="3,1,3,0"/>
							<Rectangle x:Name="fillColor2" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="5" RadiusX="5" Margin="3,1,3,0"/>
							<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}"/>
							<Rectangle x:Name="FocusVisualElement" RadiusY="5" RadiusX="5" Stroke="#FF6DBDD1" StrokeThickness="1" Visibility="Collapsed" Margin="3,1,3,0"/>
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>
		<ControlTemplate x:Key="CommonValidationToolTipTemplate" TargetType="ToolTip">
			<Grid x:Name="Root" Margin="5,0" Opacity="0" RenderTransformOrigin="0,0">
				<Grid.RenderTransform>
					<TranslateTransform x:Name="Translation" X="-25"/>
				</Grid.RenderTransform>
				<VisualStateManager.VisualStateGroups>
					<VisualStateGroup x:Name="OpenStates">
						<VisualStateGroup.Transitions>
							<VisualTransition GeneratedDuration="0"/>
							<VisualTransition GeneratedDuration="0:0:0.2" To="Open">
								<Storyboard>
									<DoubleAnimation Duration="0:0:0.2" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="Translation">
										<DoubleAnimation.EasingFunction>
											<BackEase Amplitude=".3" EasingMode="EaseOut"/>
										</DoubleAnimation.EasingFunction>
									</DoubleAnimation>
									<DoubleAnimation Duration="0:0:0.2" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/>
								</Storyboard>
							</VisualTransition>
						</VisualStateGroup.Transitions>
						<VisualState x:Name="Closed">
							<Storyboard>
								<DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/>
							</Storyboard>
						</VisualState>
						<VisualState x:Name="Open">
							<Storyboard>
								<DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="Translation"/>
								<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/>
							</Storyboard>
						</VisualState>
					</VisualStateGroup>
				</VisualStateManager.VisualStateGroups>
				<Border Background="#052A2E31" CornerRadius="5" Margin="4,4,-4,-4"/>
				<Border Background="#152A2E31" CornerRadius="4" Margin="3,3,-3,-3"/>
				<Border Background="#252A2E31" CornerRadius="3" Margin="2,2,-2,-2"/>
				<Border Background="#352A2E31" CornerRadius="2" Margin="1,1,-1,-1"/>
				<Border Background="#FFDC000C" CornerRadius="2">
					<TextBlock Foreground="White" MaxWidth="250" Margin="8,4,8,4" TextWrapping="Wrap" Text="{Binding (Validation.Errors)[0].ErrorContent}" UseLayoutRounding="false"/>
				</Border>
			</Grid>
		</ControlTemplate>
		<Style x:Key="TreeViewStyleMVVM" TargetType="sdk:TreeView">
			<Setter Property="Background" Value="#FF084256"/>
			<Setter Property="Foreground" Value="#FF000000"/>
			<Setter Property="HorizontalContentAlignment" Value="Left"/>
			<Setter Property="VerticalContentAlignment" Value="Top"/>
			<Setter Property="Cursor" Value="Arrow"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="BorderBrush" Value="#FF084256"/>
			<Setter Property="IsTabStop" Value="True"/>
			<Setter Property="TabNavigation" Value="Once"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="sdk:TreeView">
						<Grid>
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="CommonStates">
									<VisualState x:Name="Normal"/>
									<VisualState x:Name="MouseOver"/>
									<VisualState x:Name="Pressed"/>
									<VisualState x:Name="Disabled"/>
								</VisualStateGroup>
								<VisualStateGroup x:Name="FocusStates">
									<VisualState x:Name="Unfocused"/>
									<VisualState x:Name="Focused"/>
								</VisualStateGroup>
								<VisualStateGroup x:Name="ValidationStates">
									<VisualState x:Name="Valid"/>
									<VisualState x:Name="InvalidUnfocused">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="Validation">
												<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="InvalidFocused">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="Validation">
												<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
											</ObjectAnimationUsingKeyFrames>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="ValidationToolTip">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<System:Boolean>True</System:Boolean>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
							</VisualStateManager.VisualStateGroups>
							<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="7">
								<Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" CornerRadius="6">
									<ScrollViewer x:Name="ScrollViewer" BorderBrush="Transparent" BorderThickness="0" Background="{x:Null}" HorizontalScrollBarVisibility="Auto" IsTabStop="False" TabNavigation="Once" VerticalScrollBarVisibility="Auto" Style="{StaticResource ScrollViewerStyleInnerMVVM}">
										<ItemsPresenter Margin="5"/>
									</ScrollViewer>
								</Border>
							</Border>
							<Border x:Name="Validation" BorderBrush="#FFDB000C" BorderThickness="{TemplateBinding BorderThickness}" Grid.Column="1" CornerRadius="2" Visibility="Collapsed">
								<ToolTipService.ToolTip>
									<ToolTip x:Name="ValidationToolTip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" IsHitTestVisible="True" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource CommonValidationToolTipTemplate}"/>
								</ToolTipService.ToolTip>
								<Grid Background="Transparent" HorizontalAlignment="Right" Height="10" Margin="0,-4,-4,0" VerticalAlignment="Top" Width="10">
									<Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 Z" Fill="#FFDC000C" Margin="-1,3,0,0"/>
									<Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#FFFFFFFF" Margin="-1,3,0,0"/>
								</Grid>
							</Border>
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
			<Setter Property="Padding" Value="0"/>
		</Style>
		<ControlTemplate x:Key="TreeViewExpanderButton" TargetType="ToggleButton">
			<Grid x:Name="Root" Background="Transparent">
				<VisualStateManager.VisualStateGroups>
					<VisualStateGroup x:Name="CommonStates">
						<VisualStateGroup.Transitions>
							<VisualTransition GeneratedDuration="0:0:0.2"/>
						</VisualStateGroup.Transitions>
						<VisualState x:Name="Normal"/>
						<VisualState x:Name="MouseOver">
							<Storyboard>
								<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Offset)" Storyboard.TargetName="BGroundTexture" d:IsOptimized="True"/>
								<DoubleAnimation Duration="0" To="0.6" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Offset)" Storyboard.TargetName="BGroundTexture" d:IsOptimized="True"/>
							</Storyboard>
						</VisualState>
						<VisualState x:Name="Disabled">
							<Storyboard>
								<DoubleAnimation Duration="0" To=".7" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/>
							</Storyboard>
						</VisualState>
						<VisualState x:Name="Pressed"/>
					</VisualStateGroup>
					<VisualStateGroup x:Name="CheckStates">
						<VisualStateGroup.Transitions>
							<VisualTransition GeneratedDuration="0:0:0.2"/>
						</VisualStateGroup.Transitions>
						<VisualState x:Name="Unchecked"/>
						<VisualState x:Name="Checked">
							<Storyboard>
								<DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Plus" d:IsOptimized="True"/>
								<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Minus" d:IsOptimized="True"/>
								<DoubleAnimation Duration="0" To="-45" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
							</Storyboard>
						</VisualState>
						<VisualState x:Name="Indeterminate"/>
					</VisualStateGroup>
					<VisualStateGroup x:Name="FocusStates">
						<VisualState x:Name="Unfocused"/>
						<VisualState x:Name="Focused"/>
					</VisualStateGroup>
				</VisualStateManager.VisualStateGroups>
				<Grid x:Name="grid" HorizontalAlignment="Right" Margin="2 2 5 2" RenderTransformOrigin="0.5,0.5">
					<Grid.RenderTransform>
						<CompositeTransform/>
					</Grid.RenderTransform>
					<Rectangle x:Name="BGround" Fill="{TemplateBinding Background}" HorizontalAlignment="Left" Width="8" Height="8" VerticalAlignment="Center"/>
					<Rectangle x:Name="BGroundTexture" HorizontalAlignment="Left" Width="8" Height="8" VerticalAlignment="Center">
						<Rectangle.Fill>
							<RadialGradientBrush RadiusY="0.7" RadiusX="0.7">
								<GradientStop Color="Transparent" Offset="0.996"/>
								<GradientStop Color="White" Offset="0.3"/>
							</RadialGradientBrush>
						</Rectangle.Fill>
					</Rectangle>
					<Path x:Name="Plus" Data="M16.000015,0 L24.000015,0 L24.000015,3.200002 L39.999996,3.200002 L39.999996,4.8000021 L24.000015,4.8000021 L24.000015,8 L16.000015,8 L16.000015,4.8000021 L0,4.8000021 L0,3.200002 L16.000015,3.200002 z" Fill="{TemplateBinding Background}" Margin="-16,5" RenderTransformOrigin="0.500000429153483,0.499999998509882" Stretch="Fill" UseLayoutRounding="False" >
						<Path.RenderTransform>
							<CompositeTransform ScaleX="0.2" Rotation="90"/>
						</Path.RenderTransform>
					</Path>
					<Rectangle x:Name="Minus" Fill="{TemplateBinding Background}" Width="8" Height="8" RenderTransformOrigin="0.5,0.5" Opacity="0">
						<Rectangle.RenderTransform>
							<CompositeTransform ScaleY="0.2" Rotation="45" ScaleX="1.2"/>
						</Rectangle.RenderTransform>
					</Rectangle>
				</Grid>
			</Grid>
		</ControlTemplate>
		<Style x:Key="TreeViewItemStyle1" TargetType="sdk:TreeViewItem">
			<Setter Property="Padding" Value="3"/>
			<Setter Property="HorizontalContentAlignment" Value="Left"/>
			<Setter Property="VerticalContentAlignment" Value="Top"/>
			<Setter Property="BorderThickness" Value="1"/>
			<Setter Property="Cursor" Value="Arrow"/>
			<Setter Property="IsTabStop" Value="True"/>
			<Setter Property="TabNavigation" Value="Once"/>
			<Setter Property="Margin" Value="0 1 0 0"/>
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="sdk:TreeViewItem">
						<Grid>
							<Grid.ColumnDefinitions>
								<ColumnDefinition Width="15"/>
								<ColumnDefinition Width="Auto"/>
								<ColumnDefinition Width="*"/>
							</Grid.ColumnDefinitions>
							<Grid.RowDefinitions>
								<RowDefinition Height="Auto"/>
								<RowDefinition Height="*"/>
							</Grid.RowDefinitions>
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="CommonStates">
									<VisualState x:Name="Normal"/>
									<VisualState x:Name="MouseOver"/>
									<VisualState x:Name="Pressed"/>
									<VisualState x:Name="Disabled">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Foreground" Storyboard.TargetName="Header">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<SolidColorBrush Color="#FF999999"/>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
								<VisualStateGroup x:Name="SelectionStates">
									<VisualState x:Name="Unselected"/>
									<VisualState x:Name="Selected">
										<Storyboard>
											<DoubleAnimation Duration="0" To=".75" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Selection"/>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="SelectedInactive">
										<Storyboard>
											<DoubleAnimation Duration="0" To=".2" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Selection"/>
											<ColorAnimation Duration="0" To="#FF999999" Storyboard.TargetProperty="Color" Storyboard.TargetName="SelectionFill"/>
											<ColorAnimation Duration="0" To="#FF333333" Storyboard.TargetProperty="Color" Storyboard.TargetName="SelectionStroke"/>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
								<VisualStateGroup x:Name="HasItemsStates">
									<VisualState x:Name="HasItems"/>
									<VisualState x:Name="NoItems">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ExpanderButton">
												<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
								<VisualStateGroup x:Name="ExpansionStates">
									<VisualState x:Name="Collapsed"/>
									<VisualState x:Name="Expanded">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ItemsHost">
												<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
								<VisualStateGroup x:Name="ValidationStates">
									<VisualState x:Name="Valid"/>
									<VisualState x:Name="InvalidUnfocused">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="Validation">
												<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="InvalidFocused">
										<Storyboard>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="Validation">
												<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
											</ObjectAnimationUsingKeyFrames>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="ValidationToolTip">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<System:Boolean>True</System:Boolean>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
								</VisualStateGroup>
							</VisualStateManager.VisualStateGroups>
							<ToggleButton x:Name="ExpanderButton" HorizontalAlignment="Stretch" IsTabStop="False" TabNavigation="Once" VerticalAlignment="Stretch" Template="{StaticResource TreeViewExpanderButton}"/>
							<Rectangle x:Name="Selection" Grid.Column="1" IsHitTestVisible="False" Opacity="0" RadiusY="2" RadiusX="2" StrokeThickness="1">
								<Rectangle.Fill>
									<SolidColorBrush x:Name="SelectionFill" Color="#FFBADDE9"/>
								</Rectangle.Fill>
								<Rectangle.Stroke>
									<SolidColorBrush x:Name="SelectionStroke" Color="#FF6DBDD1"/>
								</Rectangle.Stroke>
							</Rectangle>
							<Button x:Name="Header" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Cursor="{TemplateBinding Cursor}" ClickMode="Hover" Grid.Column="1" Foreground="{TemplateBinding Foreground}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsTabStop="False" TabNavigation="Once" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
								<Button.Template>
									<ControlTemplate TargetType="Button">
										<Grid Background="{TemplateBinding Background}">
											<VisualStateManager.VisualStateGroups>
												<VisualStateGroup x:Name="CommonStates">
													<VisualState x:Name="Normal"/>
													<VisualState x:Name="Pressed">
														<Storyboard>
															<DoubleAnimation Duration="0" To=".5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Hover"/>
														</Storyboard>
													</VisualState>
													<VisualState x:Name="Disabled">
														<Storyboard>
															<DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Content"/>
														</Storyboard>
													</VisualState>
												</VisualStateGroup>
											</VisualStateManager.VisualStateGroups>
											<Rectangle x:Name="Hover" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="2" RadiusX="2" Stroke="#FF6DBDD1" StrokeThickness="1"/>
											<ContentPresenter x:Name="Content" Cursor="{TemplateBinding Cursor}" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="Left" Margin="{TemplateBinding Padding}"/>
										</Grid>
									</ControlTemplate>
								</Button.Template>
								<ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}"/>
							</Button>
							<Border x:Name="Validation" BorderBrush="#FFDB000C" BorderThickness="{TemplateBinding BorderThickness}" Grid.Column="1" CornerRadius="2" Visibility="Collapsed">
								<ToolTipService.ToolTip>
									<ToolTip x:Name="ValidationToolTip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" IsHitTestVisible="True" Placement="Right" PlacementTarget="{Binding ElementName=Header}" Template="{StaticResource CommonValidationToolTipTemplate}"/>
								</ToolTipService.ToolTip>
								<Grid Background="Transparent" HorizontalAlignment="Right" Height="10" Margin="0,-4,-4,0" VerticalAlignment="Top" Width="10">
									<Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 Z" Fill="#FFDC000C" Margin="-1,3,0,0"/>
									<Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#FFFFFFFF" Margin="-1,3,0,0"/>
								</Grid>
							</Border>
							<ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1" Visibility="Collapsed"/>
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
			<Setter Property="BorderBrush" Value="#FF084256"/>
		</Style>
	</UserControl.Resources>
	<Canvas x:Name="LayoutRoot" Background="{x:Null}">
		<i:Interaction.Triggers>
			<i:EventTrigger>
				<i:InvokeCommandAction CommandParameter="{Binding ElementName=FileDetails, Mode=OneWay}" Command="{Binding SetDropUIElementCommand}"/>
			</i:EventTrigger>
		</i:Interaction.Triggers>
		<Canvas.DataContext>
			<MVVMFileManager:MainViewModel/>
		</Canvas.DataContext>
		<ContentControl x:Name="PictureFrame" Style="{StaticResource PictureFrameThin}" Width="600" Height="400" BorderThickness="20"/>
		<Grid Height="360" Canvas.Top="20" Width="560" Canvas.Left="20">
			<Grid.Background>
				<LinearGradientBrush EndPoint="0.5,0.5" StartPoint="0.5,0" Opacity="1" SpreadMethod="Reflect">
					<GradientStop Color="#FF243956" Offset="0"/>
					<GradientStop Color="#FF76A2DE" Offset="1"/>
				</LinearGradientBrush>
			</Grid.Background>
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="0.5*"/>
				<ColumnDefinition Width="16"/>
				<ColumnDefinition Width="0.473*"/>
			</Grid.ColumnDefinitions>
			<ScrollViewer x:Name="FileFolders" Margin="0" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" d:DataContext="{d:DesignData /SampleData/MainViewModelSampleData.xaml}" Style="{StaticResource ScrollViewerStyleOuterMVVM}">
				<sdk:TreeView x:Name="treeView" ItemTemplate="{StaticResource SilverlightFolderTemplate}" ItemsSource="{Binding SilverlightFolders}" Style="{StaticResource TreeViewStyleMVVM}" ItemContainerStyle="{StaticResource TreeViewItemStyle1}">
					<i:Interaction.Triggers>
						<i:EventTrigger EventName="SelectedItemChanged">
							<i:InvokeCommandAction Command="{Binding SetFilesCommand}" CommandParameter="{Binding SelectedItem, ElementName=treeView, Mode=OneWay}"/>
						</i:EventTrigger>
					</i:Interaction.Triggers>
				</sdk:TreeView>
			</ScrollViewer>
			<sdk:GridSplitter HorizontalAlignment="Stretch" Grid.Column="1" Style="{StaticResource GridSplitterStyleVerticalOnly}" Margin="0,-4" Width="Auto"/>
			<ScrollViewer x:Name="FileDetails" Grid.Column="2" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" d:DataContext="{d:DesignData /SampleData/MainViewModelSampleData.xaml}" Style="{StaticResource ScrollViewerStyleOuterMVVM}" Margin="0">
				<ListBox ItemTemplate="{StaticResource SilverlightFileTemplate}" ItemsSource="{Binding SilverlightFiles}" Style="{StaticResource ListBoxStyleMVVM}" Padding="1" ItemContainerStyle="{StaticResource ListBoxItemStyleMVVM}"/>
			</ScrollViewer>
		</Grid>
		<toolkit:BusyIndicator IsBusy="{Binding FileUploadingProperty}" Height="58" Canvas.Left="221" Canvas.Top="173" Width="157" BusyContent="{Binding FileuploadPercentProperty}">
			<toolkit:BusyIndicator.Resources>
				<ResourceDictionary>
					<ResourceDictionary.MergedDictionaries>
						<ResourceDictionary Source="BusyIndicator.xaml"/>
					</ResourceDictionary.MergedDictionaries>
				</ResourceDictionary>
			</toolkit:BusyIndicator.Resources>
			<toolkit:BusyIndicator.Style>
				<StaticResource ResourceKey="BusyIndicatorStyleMVVM"/>
			</toolkit:BusyIndicator.Style>
		</toolkit:BusyIndicator>
	</Canvas>
</UserControl>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
User Interface Analyst
United Kingdom United Kingdom
I've been playing with computers since my first Acorn Electron, & after blowing up a few ZX Spectrums. I moved on to the C64 & Amiga, & eventually reluctantly on to the PC.

I have learnt a wide set of skills during my 38 years of existence, living in the UK, on the sunny south coast.

My main area of expertise is Graphic/Visual Design, Usability & UI Design. I am not a programmer, but am fairly technically minded due to studying Mechanical Engineering at Uni.

I have work both Freelance & for IBM as a Graphic Designer, & am skilled in the usual graphics packages like, PhotoShop, CorelDraw or Illustrator, Premier, Dreamweaver, Flash etc.
But I originally started with Lightwave & 3D animation.

Comments and Discussions