March 2006 Entries
XAML Panels

Some of you asked me to post my panels demo from my presentation Intoroduction to WPF Windows Presentation Foundation.  If you like this, you need to check out this book http://www.amazon.com/gp/product/0596101139/ref=pd_luc_mri/002-4299915-1292828?%5Fencoding=UTF8&m=ATVPDKIKX0DER&v=glance&n=283155

 

1 +++++++++++++++++++++++++

Notice if you don't define a position it will default to 0,0. you can set the positioning base on left, top, right or bottom
   

 <Canvas>
      <Button> no position, no size</Button>
      <Button Canvas.Left="25" Canvas.Top="25"> , top, no size</Button>
      <Button Canvas.Right="25" Canvas.Bottom="25"> right, bottom, no size</Button>
      <Button Canvas.Left="100" Canvas.Top="100" Width="250" Height="50">On Canvas: left, top, size</Button>

    </Canvas>
2 ++++++++++++++++++++++

Try moving left before bottom


  <DockPanel>
    <Button DockPanel.Dock="Top">Top</Button>
    <Button DockPanel.Dock="Bottom">Bottom</Button>
    <Button DockPanel.Dock="Left">Left</Button>
    <Button DockPanel.Dock="Right">Right</Button>
    <Button >Fill</Button>
    <!-- Fill -->
  </DockPanel>
3 ++++++++++++++++++++++++++

Grid view is very similar to HTML table


 <Grid>
    <Grid.RowDefinitions>
      <RowDefinition />
      <RowDefinition />
      <RowDefinition />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Button Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">A</Button>
    <Button Grid.Row="0" Grid.Column="2">C</Button>
    <Button Grid.Row="1" Grid.Column="0" Grid.RowSpan="2">D</Button>
    <Button Grid.Row="1" Grid.Column="1">E</Button>
    <Button Grid.Row="1" Grid.Column="2">F</Button>
    <Button Grid.Row="2" Grid.Column="1">H</Button>
    <Button Grid.Row="2" Grid.Column="2">I</Button>
  </Grid>
4+++++++++++++++++++++++

 <StackPanel>
    <!--<StackPanel Orientation="Horizontal">-->
      <Button x:Name="Button1">1</Button>
      <Button x:Name="Button2">2</Button>
      <Button x:Name="Button3">3</Button>
      <Button x:Name="Button4">4</Button>
  </StackPanel>

5+++++++++++++++
in this example lets demonstrate inserting the stack panel in the grid panel, replace the code below

 <StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
      <!--<StackPanel Orientation="Horizontal">-->
      <Button x:Name="Button1">1</Button>
      <Button x:Name="Button2">2</Button>
      <Button x:Name="Button3">3</Button>
      <Button x:Name="Button4">4</Button>
    </StackPanel>

software architect user group first meeting

Last night we had our first software architect user group meeting, at Microsoft offices in Ft. Lauderdale. Microsoft donated the venue and pizza . Quent Herschelman Quenth@Microsoft.Com  who just moved down from Atlanta is spear heading this group and naturally had to do the first presentation titled “Service-Oriented Modeling for connected Systems”

 

I have been involved in user groups before which were mostly targeting the developer community,  I really enjoyed how Quent got the audience involved in his presentation, by asking the audience some basic. I knew the audience was different than the average developer groups, they were very opinionated and very knowledgeable, it was obvious there was a lot of history and experience was in the room.

 

I really enjoyed talking to everyone before and after the presentation. I want to thank Quent, Jeff Barnes, Kim Matlock and Dave Noderer to get this group started. if you live in South Florida area you want to make sure you attend the next meeting. To be notified of the next meeting make sure you go to http://www.FlaDotNet.com and sign.

Problems installing Windows SDK

As I mentioned in my presentation, I had a hardtime installing windows SDK, Here is a link to Jason Sacks post that helped me.

WInfx installation links and instructions

make sure you have Visual Studio 2005 installed (or express)

then install these in this order

  1. WinFX Runtime Components : http://www.microsoft.com/downloads/details.aspx?FamilyId=61DD9CA7-1668-42E4-BD37-03716DD83E53&displaylang=en
  2. Windows SDK :  http://www.microsoft.com/downloads/details.aspx?FamilyId=64750EEF-D4A7-4CC8-92F2-9A201268A231&displaylang=en
    1. there are a few gotchas here I am documenting my experience and I will post them in another Blog
  3. Visual Studio Extensions for WinFX : http://www.microsoft.com/downloads/details.aspx?FamilyId=5A0AE4CD-DC79-4B12-8A05-B6195F89FFA2&displaylang=en
  4. Visual Studio Extensions for Workflow : http://www.microsoft.com/downloads/details.aspx?FamilyId=A2151993-991D-4F58-A707-5883FF4C1DC2&displaylang=en
WPF Presentation.

For those of you who attended my presentation last week in Boca on introduction to Windows Presentation Foundation.

I borrowed a lot of these from windows Presentation Foundation Hands-On-Labs

http://msdn.microsoft.com/windowsvista/building/presentation/hands_on_lab/default.aspx

Please download the following startup projects

Demo1

http://www.ssccinc.com/richcontent.zip

Demo 2

http://www.ssccinc.com/WPFDataBinding.zip

Here are step by Step copy each step and expalin it to the audience.

DEMO 1

Demo1 Ex1 Task 1
1 create a new project remove the Grid tag and add the canvas tag then inside of it add the following make sure to run the application after each step so everyone knows what you are trying to accomplish.
 +++++++++++++++++++++++++++
<Ellipse Width="300" Height="300" Stroke="Purple" StrokeThickness="20">
   </Ellipse>
2 +++++++++++++++++++++++++++

  <Ellipse.Fill>
    <LinearGradientBrush>
      <LinearGradientBrush.GradientStops>
        <GradientStop Offset="0" Color="Yellow" />
        <GradientStop Offset="1" Color="Red" />
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Ellipse.Fill>
3 ++++++++++++++++

  StrokeDashArray="0.5,2">

4 ++++++++++++++++++
StrokeDashCap="Round">

5 ++++++++++++++++++++++++++++++
delte stroke

<Ellipse.Stroke>
        <LinearGradientBrush>
          <LinearGradientBrush.GradientStops>
            <GradientStop Offset="0" Color="Black" />
            <GradientStop Offset="1" Color="White" />
          </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
      </Ellipse.Stroke>
6 +++++++++++++++++++++++++++++++++++++++++++
Replace Ellipse with
    <Path Width="800" Height="800"
      StrokeThickness="20" StrokeDashArray="0.5,2"
      StrokeDashCap="Round" >

      <Path.Data>
        <EllipseGeometry RadiusX="150" RadiusY="150" Center = "200,200" />
      </Path.Data>

      <Path.Fill>
        <LinearGradientBrush>
          <LinearGradientBrush.GradientStops>
            <GradientStop Offset="0" Color="Yellow" />
            <GradientStop Offset="1" Color="Red" />
          </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
      </Path.Fill>

      <Path.Stroke>
        <LinearGradientBrush>
          <LinearGradientBrush.GradientStops>
            <GradientStop Offset="0" Color="Black" />
            <GradientStop Offset="1" Color="White" />
          </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
      </Path.Stroke>
    </Path>
7 ++++++++++++++++++++++++++++
replace
      <Path.Data>
        <CombinedGeometry GeometryCombineMode="Union">
          <CombinedGeometry.Geometry1>
            <EllipseGeometry Center="200,200" RadiusX="150" RadiusY="150" />
          </CombinedGeometry.Geometry1>
          <CombinedGeometry.Geometry2>
            <EllipseGeometry Center="400,200" RadiusX="150" RadiusY="150" />
          </CombinedGeometry.Geometry2>
        </CombinedGeometry>
      </Path.Data>
8 +++++++++++++++++++++++++++++++++++++
    <Path.Fill>
    <VisualBrush>
    <VisualBrush.Visual>
    <TextBlock Text="Hello World" FontWeight="Bold" Padding="10">
      <TextBlock.Background>
      <LinearGradientBrush>
      <LinearGradientBrush.GradientStops>
        <GradientStop Offset="0" Color="Yellow" />
        <GradientStop Offset="1" Color="Red" />
      </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
      </TextBlock.Background>
    </TextBlock>
    </VisualBrush.Visual>
    </VisualBrush>
  </Path.Fill>
======================================
Ex2
1 +++++++
Name="MyPath" add to Path
then
      <Path.Triggers>
        <EventTrigger RoutedEvent="Path.Loaded">
          <EventTrigger.Actions>
            <BeginStoryboard>
              <Storyboard>
                <DoubleAnimation
                  Storyboard.TargetName="MyPath"
                  Storyboard.TargetProperty="StrokeDashOffset"
                  To="20" Duration="0:0:10"
          RepeatBehavior="Forever" />
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger.Actions>
        </EventTrigger>
      </Path.Triggers>
2 ++++++++++++++++++++++++++++++++++++++++++++
add to ellipse geomtry
x:Name="MyEllipseGeometry"
   <EllipseGeometry x:Name="MyEllipseGeometry"
        Center="200,200" RadiusX="150" RadiusY="150" />
then

      <BeginStoryboard>
        <Storyboard>
          <PointAnimation
            Storyboard.TargetName="MyEllipseGeometry" 
            Storyboard.TargetProperty="Center"
            From="150,100" To="650,200" Duration="0:0:3"
            RepeatBehavior="Forever" AutoReverse="True"/>
        </Storyboard>
      </BeginStoryboard>
3 ++++++++++++++++++++++++++++++++++++++++++++++
replace textblock
<TextBlock Text="Hello World" FontWeight="Bold" Padding="10">

  <TextBlock.Foreground>
    <LinearGradientBrush>
      <LinearGradientBrush.GradientStops>
        <GradientStop Offset="0" Color="Yellow" />
        <GradientStop Offset="1" Color="Red" />
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </TextBlock.Foreground>

  <TextBlock.Background>
    <VisualBrush>
      <VisualBrush.Visual>
         <MediaElement Source="C:\\apollo11_launchclip04.mpg" />
      </VisualBrush.Visual>
    </VisualBrush>
  </TextBlock.Background>

</TextBlock>
 
============================================
ex 3
==============================================
clear all and paste this

<Viewport3D>

    <Viewport3D.Camera>
      <PerspectiveCamera
       FarPlaneDistance="20"
       LookDirection="0,-0.65,-1"
       UpDirection="0,1,0"
       NearPlaneDistance="1"
       Position="0,2,3"
       FieldOfView="40" />
    </Viewport3D.Camera>
    <Viewport3D.Children>
      <ModelVisual3D>
        <ModelVisual3D.Content>
          <Model3DGroup >
            <Model3DGroup.Children>
              <AmbientLight Color="White" />
              <GeometryModel3D>

                <GeometryModel3D.Geometry>
                  <MeshGeometry3D
                   TriangleIndices="0,1,2   2,3,0   6,5,4   4,7,6"
                   TextureCoordinates="1,1  1,0   0,0   0,1   0,1  0,0   1,0   1,1"
                   Positions="-0.5,-0.5,0   -0.5,0.5,0   0.5,0.5,0    0.5,-0.5,0      -0.5,-0.5,0   -0.5,0.5,0   0.5,0.5,0    0.5,-0.5,0 "/>
                </GeometryModel3D.Geometry>

                <GeometryModel3D.Transform>
                  <RotateTransform3D>
                    <RotateTransform3D.Rotation>
                      <AxisAngleRotation3D x:Name="MyRotation3D" Angle="45" Axis="0 1 0"/>
                    </RotateTransform3D.Rotation>
                  </RotateTransform3D>
                </GeometryModel3D.Transform>


                <GeometryModel3D.Material>
                  <DiffuseMaterial>
                    <DiffuseMaterial.Brush>
                      <VisualBrush>
                        <VisualBrush.Visual>
                          <TextBlock Text="Hello" />
                        </VisualBrush.Visual>
                      </VisualBrush>
                    </DiffuseMaterial.Brush>
                  </DiffuseMaterial>
                </GeometryModel3D.Material>

              </GeometryModel3D>
            </Model3DGroup.Children>
          </Model3DGroup>
        </ModelVisual3D.Content>
      </ModelVisual3D>
    </Viewport3D.Children>
    <Viewport3D.Triggers>
      <EventTrigger RoutedEvent="Viewport3D.Loaded">
        <EventTrigger.Actions>
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation From="0" To="360" Duration="0:0:3"
              Storyboard.TargetName="MyRotation3D"
              Storyboard.TargetProperty="Angle" RepeatBehavior="Forever" />
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger.Actions>
      </EventTrigger>
    </Viewport3D.Triggers>
  </Viewport3D>
2 ++++++++++++++++++++++++++++++++++++++++++++++++++++
  <MeshGeometry3D
    TriangleIndices="0,1,2 3,4,5 6,7,8 9,10,11 12,13,14 15,16,17 18,19,20 21,22,23 24,25,26 27,28,29 30,31,32 33,34,35 "
    Normals="0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,-1,0 1,0,0 1,0,0 1,0,0 1,0,0 1,0,0 1,0,0 0,1,0 0,1,0 0,1,0 0,1,0 0,1,0 0,1,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 "
    TextureCoordinates="1,1 1,0 0,0 0,0 0,1 1,1 0,1 1,1 1,0 1,0 0,0 0,1 0,1 1,1 1,0 1,0 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,0 0,0 0,1 0,1 1,1 1,0 0,0 0,1 1,1 1,1 1,0 0,0 "
    Positions="-0.5,-0.5,-0.5 -0.5,0.5,-0.5 0.5,0.5,-0.5 0.5,0.5,-0.5 0.5,-0.5,-0.5 -0.5,-0.5,-0.5 -0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 -0.5,-0.5,-0.5 0.5,-0.5,-0.5 0.5,-0.5,0.5 0.5,-0.5,0.5 -0.5,-0.5,0.5 -0.5,-0.5,-0.5 0.5,-0.5,-0.5 0.5,0.5,-0.5 0.5,0.5,0.5 0.5,0.5,0.5 0.5,-0.5,0.5 0.5,-0.5,-0.5 0.5,0.5,-0.5 -0.5,0.5,-0.5 -0.5,0.5,0.5 -0.5,0.5,0.5 0.5,0.5,0.5 0.5,0.5,-0.5 -0.5,0.5,-0.5 -0.5,-0.5,-0.5 -0.5,-0.5,0.5 -0.5,-0.5,0.5 -0.5,0.5,0.5 -0.5,0.5,-0.5 "/>
3 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 <DiffuseMaterial>
  <DiffuseMaterial.Brush>
    <VisualBrush>
      <VisualBrush.Visual>
        <MediaElement Source = "C:\apollo11_launchclip04.mpg" />
      </VisualBrush.Visual>
    </VisualBrush>
  </DiffuseMaterial.Brush>
</DiffuseMaterial>
 4 ++++++++++++++++++++++++++++++++++++++++++++++++++++++

<DiffuseMaterial>
  <DiffuseMaterial.Brush>
    <VisualBrush>
      <VisualBrush.Visual>
       
        <Ellipse Width="300" Height="300"
          Stroke="Purple" StrokeThickness="20">
          <Ellipse.Fill>
            <LinearGradientBrush>
              <LinearGradientBrush.GradientStops>
                <GradientStop Offset="0" Color="Yellow" />
                <GradientStop Offset="1" Color="Red" />
              </LinearGradientBrush.GradientStops>
            </LinearGradientBrush>
          </Ellipse.Fill>
        </Ellipse>
       
      </VisualBrush.Visual>
    </VisualBrush>
  </DiffuseMaterial.Brush>
</DiffuseMaterial>
5 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<Path Name="MyPath"
                      Width="800" Height="800"
                      StrokeThickness="20" StrokeDashArray="0.5,2"
                      StrokeDashCap="Round">

                      <Path.Data>
                        <CombinedGeometry GeometryCombineMode="Union">
                          <CombinedGeometry.Geometry1>
                            <EllipseGeometry x:Name="MyEllipseGeometry"
                              Center="200 200" RadiusX="150" RadiusY="150" />
                          </CombinedGeometry.Geometry1>
                          <CombinedGeometry.Geometry2>
                            <EllipseGeometry Center="400 200" RadiusX="150" RadiusY="150" />
                          </CombinedGeometry.Geometry2>
                        </CombinedGeometry>
                      </Path.Data>

                      <Path.Fill>
                        <VisualBrush>
                          <VisualBrush.Visual>
                            <TextBlock Text="Hello World" FontWeight="Bold" Padding="10">
                              <TextBlock.Foreground>
                                <LinearGradientBrush>
                                  <LinearGradientBrush.GradientStops>
                                    <GradientStop Offset="0" Color="Yellow" />
                                    <GradientStop Offset="1" Color="Red" />
                                  </LinearGradientBrush.GradientStops>
                                </LinearGradientBrush>
                              </TextBlock.Foreground>
                              <TextBlock.Background>
                                <VisualBrush>
                   
                                    <VisualBrush.Visual>
                                      <MediaElement>
                                   <MediaElement.Source>
                                <MediaTimeline Source="C:\Microsoft Hands-On-Lab\HOL-PRSHOL08\Source\apollo11_launchclip04.mpg" RepeatBehavior="Forever"/>
                              </MediaElement.Source>
                                  </MediaElement>
                        
                                  </VisualBrush.Visual>
                                </VisualBrush>
                              </TextBlock.Background>
                            </TextBlock>
                          </VisualBrush.Visual>
                        </VisualBrush>
                      </Path.Fill>

                      <Path.Stroke>
                        <LinearGradientBrush>
                          <LinearGradientBrush.GradientStops>
                            <GradientStop Offset="0" Color="Black" />
                            <GradientStop Offset="1" Color="White" />
                          </LinearGradientBrush.GradientStops>
                        </LinearGradientBrush>
                      </Path.Stroke>

                      <Path.Triggers>
                        <EventTrigger RoutedEvent="Path.Loaded">
                          <EventTrigger.Actions>
                            <BeginStoryboard>
                              <Storyboard>
                                <DoubleAnimation To="20" Duration="0:0:10"
                                  Storyboard.TargetName="MyPath"
                                  Storyboard.TargetProperty="StrokeDashOffset"
                                  RepeatBehavior="Forever" />
                              </Storyboard>
                            </BeginStoryboard>
                            <BeginStoryboard>
                              <Storyboard>
                                <PointAnimation From="150,100" To="650,200" Duration="0:0:3"
                                  Storyboard.TargetName="MyEllipseGeometry"
                                  Storyboard.TargetProperty="Center"
                                  RepeatBehavior="Forever" AutoReverse="True"/>
                              </Storyboard>
                            </BeginStoryboard>
                          </EventTrigger.Actions>
                        </EventTrigger>
                      </Path.Triggers>
                    </Path>

 

DEMO 2


Create a new C# WPF windows Project
add a new codepage and Call it data.cs

1 Add the following Using statements to the top +++++++++++++++++++++++
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections.ObjectModel;
using System.ComponentModel;


2 ++++++++++++++++++++

Inside namespace PhotoStore

    public class Photo
    {
        public Photo(string path)
        {
            _source = path;
        }

        public override string ToString()
        {
            return Source;
        }

        private string _source;
        public string Source { get { return _source; } }

    }

3 ++++++++++++++++++++++++++++++++++++++
    public class PhotoList : ObservableCollection<Photo>
    {
        public PhotoList() { }

        public PhotoList(string path) : this(new DirectoryInfo(path)) { }

        public PhotoList(DirectoryInfo directory)
        {
            _directory = directory;
            Update();
        }

        public string Path
        {
            set
            {
                _directory = new DirectoryInfo(value);
                Update();
            }
            get { return _directory.FullName; }
        }

        public DirectoryInfo Directory
        {
            set
            {
                _directory = value;
                Update();
            }
            get { return _directory; }
        }
        private void Update()
        {
            foreach (FileInfo f in _directory.GetFiles("*.jpg"))
            {
                Add(new Photo(f.FullName));
            }
        }

        DirectoryInfo _directory;
    }

3.5 +++++++++++++++++++++++++++++++++
public class PrintType
    {
        public PrintType(string description, double cost)
        {
            _description = description;
            _cost = cost;
        }

        public override string ToString()
        {
            return _description;
        }

        private string _description;
        public String Description { get { return _description; } }

        private double _cost;
        public double Cost { get { return _cost; } }
    }

4 +++++++++++++++++++++++++++++++++++++

    public class PrintTypeList : ObservableCollection<PrintType>
    {
        public PrintTypeList()
        {
            Add(new PrintType("4x6 Print", 0.19));
            Add(new PrintType("5x7 Print", 0.99));
            Add(new PrintType("8x10 Print", 2.99));
            Add(new PrintType("Framed Print", 7.99));
            Add(new PrintType("T-Shirt", 12.99));
        }
    }
5 +++++++++++++++++++++++++++++++++++++++++++++
    public class Print : INotifyPropertyChanged
    {
        public Print(Photo photo, PrintType printtype, int quantity)
        {
            Photo = photo;
            PrintType = printtype;
            Quantity = quantity;
        }

        private Photo _photo;
        public Photo Photo
        {
            set { _photo = value; OnPropertyChanged("Photo"); }
            get { return _photo; }
        }

        private PrintType _PrintType;
        public PrintType PrintType
        {
            set { _PrintType = value; OnPropertyChanged("PrintType"); }
            get { return _PrintType; }
        }

        private int _quantity;
        public int Quantity
        {
            set { _quantity = value; OnPropertyChanged("Quantity"); }
            get { return _quantity; }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(String info)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(info));
        }

        public override string ToString()
        {
            return Quantity + " " + PrintType + " " + Photo;
        }
    }

6 ++++++++++++++++++++++++++++++++++
    public class PrintList : ObservableCollection<Print> { }
================= WIndow1.xaml.cs =================
7 in window1.xaml.cs add the following delcartion++++++++++++++++++++++++++++++++++++
        PhotoList Photos;
        PrintList PhotoTray;

8 make sure you copy the images in the zip file to c:\Pics directory
if you copy it to a different folder modify the code below ++++++++++++++++++
        private void WindowLoaded(object sender, RoutedEventArgs e)
        {
            Photos = (PhotoList)(this.Resources["Photos"] as ObjectDataProvider).Data;
            Photos.Path = "c:\\Pics";

            PhotoTray = (PrintList)(this.Resources["PhotoTray"] as ObjectDataProvider).Data;
        }
9  we need to uncomment the lines here after we modify window1.xaml in the next example ++++++++++++++++++++++++++++++++++++++
        private void AddToPhotoTray(object sender, RoutedEventArgs e)
        {
            /*
            if (PrintTypeComboBox.SelectedItem != null)
            {
                foreach (Photo p in PhotosListBox.SelectedItems)
                {
                    Print print = GetPrintFromPhotoTray(p, PrintTypeComboBox.SelectedItem as PrintType);

                    if (print != null)
                    {
                        print.Quantity++;
                    }
                    else
                    {
                        print = new Print(p, PrintTypeComboBox.SelectedItem as PrintType, 1);
                        PhotoTray.Add(print);
                    }
                }
            }
            */
        }
10 +++++++++++++++++++++++++++++++++++++
        private void Upload(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i <= 100; i++)
            {
                //UploadProgressBar.Value = i;
            }
        }
11 +++++++++++++++++++++++++++++++++++++++++
        private Print GetPrintFromPhotoTray(Photo photo, PrintType printtype)
        {
            foreach (Print print in PhotoTray)
            {
                if (print.Photo == photo && print.PrintType == printtype)
                {
                    return print;
                }
            }
            return null;
        }
===================================
Task 2
===================================

1 Add the following line to the top of the page window1.xaml ++++++++++++++++++
<?Mapping XmlNamespace="ps" ClrNamespace="PhotoStore" ?>

 2 Insert this to the end of the tag++++++++++++++++++++++++
  Loaded="WindowLoaded" 
  xmlns:ps="ps"
    Width="640"
  Height="670">
  <Window.Background>
    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
      <LinearGradientBrush.GradientStops>
        <GradientStopCollection>
          <GradientStop Offset="0" Color="#DDDDDD"/>
          <GradientStop Offset="1" Color="#EEEEEE"/>
        </GradientStopCollection>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Window.Background>
  <Window.Resources>
    <ObjectDataProvider
      x:Name="PhotosODP"
      x:Key="Photos"
      ObjectType="{x:Type ps:PhotoList}" />
    <ObjectDataProvider
      x:Name="PhotoTrayODP"
      x:Key="PhotoTray"
      ObjectType="{x:Type ps:PrintList}" />
    <ObjectDataProvider
      x:Name="PrintTypes"
      x:Key="PrintTypes"
      ObjectType="{x:Type ps:PrintTypeList}" />
  </Window.Resources>

 3 +++++++++++++++++++++++++++++++++++++++++++++

Margin="20" MaxWidth="600" ShowGridLines="False" >

    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="250" />
    <RowDefinition Height="15" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="2000" />

    <ColumnDefinition />
    <ColumnDefinition Width="Auto" />

    <TextBlock
      Grid.Row="0"
      Grid.ColumnSpan="2">
      PhotoStore
    </TextBlock>

    <TextBlock Grid.Row="1" Grid.ColumnSpan="2">Making memories.</TextBlock>

    <ListBox
      Grid.Row="2" Grid.ColumnSpan="2"
      Margin="0,8,0,8"
      Name="PhotosListBox"
      DataContext="{Binding Source={StaticResource Photos}}"
      ItemsSource="{Binding }"
      SelectedIndex="0" />

    <ContentControl
      Grid.Row="4"
      Grid.RowSpan="4"
      Grid.Column="0"
      Margin="0"
      Content="{Binding ElementName=PhotosListBox, Path=SelectedItem}"/>

    <StackPanel
      Grid.Row="6"
      Grid.Column="0"
      Orientation="Horizontal"
      HorizontalAlignment="Center"
      Margin="0">

      <ComboBox
        Margin="2"
        VerticalAlignment="Center"
        Name="PrintTypeComboBox"
        DataContext="{Binding Source={StaticResource PrintTypes}}"
        ItemsSource="{Binding}"
        Width="100"
        SelectedIndex="0" />

      <Button
        Click="AddToPhotoTray"
        Margin="2"
        VerticalAlignment="Center"
        IsDefault="true">Add To Tray</Button>

    </StackPanel>

    <TextBlock
      Grid.Row="3"
      Grid.Column="1">
      Photo Tray
    </TextBlock>

    <ItemsControl
      Grid.Row="4"
      Grid.Column="1"
      Name="PhotoTrayItemsControl"
      DataContext="{Binding Source={StaticResource PhotoTray}}"
      ItemsSource="{Binding}" />

    <StackPanel
      Grid.Row="6"
      Grid.Column="1"
      Orientation="Horizontal"
      HorizontalAlignment="Center"
      Margin="0">

      <ProgressBar
        Name="UploadProgressBar"
        Width="126"
        Value="0"
        Margin="2"
        VerticalAlignment="Center"  />
      <Button Click="Upload" Margin="2" VerticalAlignment="Center" >Upload</Button>

    </StackPanel>
====================================

EX2 task 1
=====================================


1 ++++++++++++++++++++++++++++++++++++++
    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="FontFamily" Value="Segoe Black" />
      <Setter Property="HorizontalAlignment" Value="Center" />
      <Setter Property="FontSize" Value="12pt" />
      <Setter Property="Foreground" Value="#777777" />
    </Style>

2 +++++++++++++++++++++++++++++++++++++++++
first add this to photostore
Style="{StaticResource TitleText}">

then
    <Style
      x:Key="TitleText"
      BasedOn="{StaticResource {x:Type TextBlock}}"
      TargetType="{x:Type TextBlock}">
      <Setter Property="FontSize" Value="32pt" />
     
 <Setter Property="Foreground">
        <Setter.Value>
          <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
            <LinearGradientBrush.GradientStops>
              <GradientStopCollection>
                <GradientStop Offset="0" Color="#90C117"/>
                <GradientStop Offset="1" Color="#5C9417"/>
              </GradientStopCollection>
            </LinearGradientBrush.GradientStops>
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>
     
      <Setter Property="RenderTransform">
        <Setter.Value>
          <TransformGroup>
            <TransformGroup.Children>
              <TranslateTransform X="0" Y="10"/>
            </TransformGroup.Children>
          </TransformGroup>
        </Setter.Value>
      </Setter>

    </Style>

3 +++++++++++++++++++++++++++++++++++++++++++++++++++
add to to Photo Tray
HorizontalAlignment="Left">

4 ++++++++++++++++++++++++++++++++++++++++++++++++++

add this to items control
      Style="{StaticResource TrayItemsControl}"

then

 <Style TargetType="{x:Type ListBox}">
      <Setter Property="Foreground" Value="White" />
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListBox}" >
            <Border
              Height="100"
              Padding="5"
              BorderThickness="0.5"
              CornerRadius="6"
              VerticalAlignment="Center"
              HorizontalAlignment="Center">
              <StackPanel
                IsItemsHost="True"
                Orientation="Horizontal"
                VerticalAlignment="Center"
                HorizontalAlignment="Center"  />
              <Border.BorderBrush>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <LinearGradientBrush.GradientStops>
                    <GradientStopCollection>
                      <GradientStop Offset="0" Color="#88000000"/>
                      <GradientStop Offset="1" Color="#DDFFFFFF"/>
                    </GradientStopCollection>
                  </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
              </Border.BorderBrush>
              <Border.Background>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <LinearGradientBrush.GradientStops>
                    <GradientStopCollection>
                      <GradientStop Offset="0" Color="#CCFFFFFF"/>
                      <GradientStop Offset="1" Color="#55FFFFFF"/>
                    </GradientStopCollection>
                  </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
              </Border.Background>
            </Border>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>

5 ++++++++++++++++++++++++++++++++++++++++++++
<Style x:Key="TrayItemsControl" TargetType="{x:Type ItemsControl}">
      <Setter Property="Foreground" Value="White" />
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ItemsControl}" >
            <Border
              Height="250"
              Width="200"
              Padding="10"
              BorderThickness="0.5"
              CornerRadius="6"
              VerticalAlignment="Center"
              HorizontalAlignment="Center">
              <WrapPanel
                ItemHeight="75"
                ItemWidth="75"
                IsItemsHost="True"
                Orientation="Horizontal"
                VerticalAlignment="Top"
                HorizontalAlignment="Center"  />
              <Border.BorderBrush>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <LinearGradientBrush.GradientStops>
                    <GradientStopCollection>
                      <GradientStop Offset="0" Color="#88000000"/>
                      <GradientStop Offset="1" Color="#DDFFFFFF"/>
                    </GradientStopCollection>
                  </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
              </Border.BorderBrush>
              <Border.Background>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <LinearGradientBrush.GradientStops>
                    <GradientStopCollection>
                      <GradientStop Offset="0" Color="#CCFFFFFF"/>
                      <GradientStop Offset="1" Color="#55FFFFFF"/>
                    </GradientStopCollection>
                  </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
              </Border.Background>
            </Border>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>


6 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
    <DataTemplate DataType="{x:Type ps:Photo}">
      <Border
        VerticalAlignment="Center"
        HorizontalAlignment="Center"
        Padding="4"
        Margin="2"
        Background="White">
        <Image Source="{Binding Source}" />
      </Border>
    </DataTemplate> 
7 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
add this to content Control
ContentTemplate="{StaticResource ReflectedPhoto}"/>
then paste this

<DataTemplate DataType="{x:Type ps:Print}">
      <Grid>
        <Border
          VerticalAlignment="Center"
          HorizontalAlignment="Center"
          Padding="3"
          Margin="1,4,1,12"
          Background="White"
          BorderBrush="#AAAAAA"
          BorderThickness="1" >
          <Image Source="{Binding Photo.Source}" />
        </Border>
        <TextBlock
          Text="{Binding PrintType.Description}"
          Foreground="#999999"
          FontSize="8pt"
          HorizontalAlignment="Center"
          VerticalAlignment="Bottom" />
      </Grid>
    </DataTemplate>

    <DataTemplate x:Key="ReflectedPhoto" >
      <Grid HorizontalAlignment="Center">
        <RowDefinition Height="250" />
        <RowDefinition />

        <!-- reflection-->
        <Border
          Grid.Row="1"
          VerticalAlignment="Top"
          Width="{Binding ElementName=MainBorder, Path=ActualWidth}"
          Background="White"
          BorderBrush="#EEEEEE"
          BorderThickness="1">
          <Border.LayoutTransform>
            <TransformGroup>
              <TransformGroup.Children>
                <ScaleTransform ScaleX="1" ScaleY="-0.5"/>
              </TransformGroup.Children>
            </TransformGroup>
          </Border.LayoutTransform>
          <Border.OpacityMask>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
              <LinearGradientBrush.GradientStops>
                <GradientStopCollection>
                  <GradientStop Offset="0" Color="Transparent"/>
                  <GradientStop Offset="1" Color="#50000000"/>
                </GradientStopCollection>
              </LinearGradientBrush.GradientStops>
            </LinearGradientBrush>
          </Border.OpacityMask>
          <Image
            Margin="7"
            Width="{Binding ElementName=MainImage, Path=ActualWidth}"
            Source="{Binding Source}"/>
        </Border>

        <!-- shadow -->
        <Rectangle
          Grid.Row="0"
          VerticalAlignment="Bottom"
          HorizontalAlignment="Center"
          Width="{Binding ElementName=MainBorder, Path=ActualWidth}"
          Height="30" >
          <Rectangle.RenderTransform>
            <TransformGroup>
              <TransformGroup.Children>
                <TranslateTransform X="0" Y="15"/>
              </TransformGroup.Children>
            </TransformGroup>
          </Rectangle.RenderTransform>
          <Rectangle.Fill>
            <RadialGradientBrush >
              <RadialGradientBrush.GradientStops>
                <GradientStopCollection>
                  <GradientStop Offset="0" Color="#B0000000"/>
                  <GradientStop Offset="1" Color="Transparent"/>
                </GradientStopCollection>
              </RadialGradientBrush.GradientStops>
           
          </RadialGradientBrush>
          </Rectangle.Fill>
        </Rectangle>

        <!-- main image -->
        <Border
          Grid.Row="0"
          x:Name="MainBorder"
          Background="White"
          BorderBrush="#DDDDDD"
          BorderThickness="1"
          HorizontalAlignment="Center"
          VerticalAlignment="Bottom"  >
          <Image
            Margin="7"
            x:Name="MainImage"
            Source="{Binding Source}" />
        </Border>

      </Grid>

    </DataTemplate>
9+++++++++++++++++++++++++++++++++++++++++++
    <Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
      <Setter Property="FocusVisualStyle" Value="{x:Null}" />
      <Setter Property="Opacity" Value="0.5" />
      <Setter Property="MaxHeight" Value="75" />
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListBoxItem}">
            <Border
              x:Name="ContentBorder"
              BorderThickness="1"
              BorderBrush="Transparent">
              <ContentPresenter />
            </Border>
            <ControlTemplate.Triggers>
              <Trigger Property="IsSelected" Value="True">
                <Setter Property="Opacity" Value="1.0" />
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
      <Style.Triggers>

        <EventTrigger RoutedEvent="Mouse.MouseEnter">
        </EventTrigger>

        <EventTrigger RoutedEvent="Mouse.MouseLeave">
        </EventTrigger>

      </Style.Triggers>
    </Style>

 

Sorry For the Delay, but here are all the files for the demo.