Skip to content

Wpf class project skeleton that students will flesh out each week

Notifications You must be signed in to change notification settings

Ball/WpfClassProject

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Wpf Class Project
========================================================

This project is meant to be used as a starting point for the students of my Wpf Class.
Each week, I'll update this project with new helper classes, data, and the week's assignmnet.
This project will not contain a complete application.

Architecture choices are made for educational reasons.

Week 1
---------------------------------------------------------
Students are expected to "draw" a picture of their own design with xaml.
This week's goal is to explore Xaml and basic graphical primitives.

Week 2
---------------------------------------------------------
Start of Wpf Tunes: a Wpf based iTunes clone with actual, but limited, functionality.
This week's goal is to explore basic controls and layout types.
The assignment is to replicate the layout of WpfTunes as pictured in the file
AssignmentReferences\Week1Goal.png

Week 3
---------------------------------------------------------
Will it Blend?
This week's goal is to bind the UI elements to a back-end data structure.
If you've used blend before, I recommend trying it with a xaml initialized data context.
Set an instance of ShellDesignData to the Shell's DataContext and bind to get WPF to match
the Blend screenshot in AssignmentReferences\Week2Goal.png

Week 4
---------------------------------------------------------
With Style and Grace
This week's goal is to make the application look good!
* Give the play/pause/stop button the appropriate symbols
  (we'll use triggers and visible layers)
* The next and previous buttons need to look correct
* Buttons need a "pressed" and "mouseover"
* The main frame needs to have a subtle gradient
* The Playlist needs to be BLUE
See a screenshot in AssignmentReferences\Week3Goal.png

Week 5
---------------------------------------------------------
It's all about control
This week, you'll create two controls and a multivalue converter.
There where some changes to the data contexts directory, so be sure to update.
  1) PlayerControl - A UserControl that wraps the top of the player (back,next,playpausestop,title,and scrubber).
     Picture Included.
  2) PlayPauseStopButton - A subclass of button
     Using VS to create a CustomControl should create a /Themes/Generic.xaml file. Use it to set the template
     you wrote last time on your new button.  Add a template that uses NextAction (described below) to pick which
     picture to show.
     It should have the following dependency properties,
        ICommand PlayCommand
        ICommand PauseCommand
        ICommand StopCommand
        PlayStatus NextAction (identifies the command that CAN happen in this order Play,Pause,Stop)
     When each command is changed, you'll need to add a watcher to it's CanExecuteChanged event to trigger
     and update to the NextAction property.  This is how the button will update appropriately.  Below is a
     starting point.  You'll need to write PlayPauseStopButton#UpdateState to pick the proper NextAction.
        public static readonly DependencyProperty StopCommandProperty =
            DependencyProperty.Register("StopCommand",
                                        typeof (ICommand),
                                        typeof (PlayPauseStopButton),
                                        new PropertyMetadata(OnCommandChanged));
        public ICommand StopCommand
        {
            get { return (ICommand)GetValue(StopCommandProperty); }
            set { SetValue(StopCommandProperty, value); }
        }
        private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var self = d as PlayPauseStopButton;
            if (self == null) return;
            var newCommand = e.NewValue as ICommand;
            if (newCommand != null)
                newCommand.CanExecuteChanged += (s, _) => self.UpdateState();
        }
  3) PlayParameterConverter - An IMultiValueConverter that enables the following xaml in the Shell.xaml
     It should generate an instance of PlayCommandParameter.
        <Controls:PlayerControl DockPanel.Dock="Top"
                    DataContext="{Binding CurrentSong}">
            <Controls:PlayerControl.PlayCommandParameter>
                <MultiBinding>
                    <MultiBinding.Converter>
                        <Converters:PlayParameterConverter/>
                    </MultiBinding.Converter>
                    <Binding Path="CurrentSong"/>
                    <Binding Path="SelectedItem" ElementName="listBox"/>
                    <Binding Path="SelectedItem" ElementName="listView"/>
                </MultiBinding>
            </Controls:PlayerControl.PlayCommandParameter>
        </Controls:PlayerControl>

Week 6
---------------------------------------------------------
A command performance
This is the first time I'm shipping a broken build.  I need your commands to make it run.
1) modify your shell to use the new runtime context in code behind.
2) Write the following commands in the "Commands" namespace,
  PlayCommand
    CanExecute if we are paused on the current list
               or we are stopped
  PauseCommand
    CanExecute if we are playing on the current list
  StopCommand
    CanExecute if we are playing and not on the current list
  NextCommand
    CanExecute is true
  BackCommand
    CanExecute is true
3) Add an event handler when double clicking the listview of songs.
   It should always start playing.  
Want to get the player to play?
  It generates playlists from directories in the current build dir.
  It genereates songs from the mp3 files in those dirs.
  Song info is faked.

About

Wpf class project skeleton that students will flesh out each week

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages