Am I going about this the right way?
- by Psytronic
Hey Guys,
I'm starting a WPF project, and just finished the base of the UI, it seems very convoluted though, so I'm not sure if I've gone around laying it out in the right way. I don't want to get to start developing the back-end and realise that I've done the front wrong, and make life harder for myself.
Coming from a background of <DIV's and CSS to style this is a lot different, and really want to get it right from the start.
Essentially it's a one week calendar (7 days, Mon-Sunday, defaulting to the current week.) Which will eventually link up to a DB and if I have an appointment for something on this day it will show it in the relevant day.
I've opted for a Grid rather than ListView because of the way it will work I will not be binding the results to a collection or anything along those lines. Rather I will be filling out a Combo box within the canvas for each day (yet to be placed in the code) for each event and on selection it will show me further details.
XAML:
<Window x:Class="WOW_Widget.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    xmlns:Extensions="clr-namespace:WOW_Widget"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="Window1" Height="239" Width="831"
    <Window.Resources
        <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1"
            <GradientBrush.GradientStops
                <GradientStopCollection
                    <GradientStop Offset="1.0" Color="White"/
                    <GradientStop Offset="0.0" Color="LightSlateGray"/
                </GradientStopCollection
            </GradientBrush.GradientStops
        </LinearGradientBrush
        <LinearGradientBrush x:Key="grdDayHeader" StartPoint="0,0" EndPoint="0,1"
            <GradientBrush.GradientStops
                <GradientStopCollection
                    <GradientStop Offset="0.0" Color="Peru" /
                    <GradientStop Offset="1.0" Color="White" /
                </GradientStopCollection
            </GradientBrush.GradientStops
        </LinearGradientBrush
        <LinearGradientBrush x:Key="grdToday" StartPoint="0,0" EndPoint="0,1"
            <GradientBrush.GradientStops
                <GradientStopCollection
                    <GradientStop Offset="0.0" Color="LimeGreen"/
                    <GradientStop Offset="1.0" Color="DarkGreen" /
                </GradientStopCollection
            </GradientBrush.GradientStops
        </LinearGradientBrush
        <Style TargetType="{x:Type GridViewColumnHeader}"
            <Setter Property="Background" Value="Khaki" /
        </Style
        <Style x:Key="DayHeader" TargetType="{x:Type Label}"
            <Setter Property="Background" Value="{StaticResource grdDayHeader}" /
            <Setter Property="Width" Value="111" /
            <Setter Property="Height" Value="25" /
            <Setter Property="HorizontalContentAlignment" Value="Center" /
        </Style
        <Style x:Key="DayField"
            <Setter Property="Canvas.Width" Value="111" /
            <Setter Property="Canvas.Height" Value="60" /
            <Setter Property="Canvas.Background" Value="White" /
        </Style
        <Style x:Key="Today"
            <Setter Property="Canvas.Background" Value="{StaticResource grdToday}" /
        </Style
        <Style x:Key="CalendarColSpacer"
            <Setter Property="Canvas.Width" Value="1" /
            <Setter Property="Canvas.Background" Value="Black" /
        </Style
        <Style x:Key="CalendarRowSpacer"
            <Setter Property="Canvas.Height" Value="1" /
            <Setter Property="Canvas.Background" Value="Black" /
        </Style
    </Window.Resources
    <Grid Background="{StaticResource NormalBrush}"
        <Border BorderBrush="Black" BorderThickness="1" Width="785" Height="86" Margin="12,12,12,104"
            <Canvas Height="86" Width="785" VerticalAlignment="Top"
                <Grid
                    <Grid.ColumnDefinitions
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                        <ColumnDefinition /
                    </Grid.ColumnDefinitions
                    <Grid.RowDefinitions
                        <RowDefinition /
                        <RowDefinition /
                        <RowDefinition /
                    </Grid.RowDefinitions
                    <Label Grid.Column="0" Grid.Row="0" Content="Monday" Style="{StaticResource DayHeader}" /
                    <Canvas Grid.Column="1" Grid.RowSpan="3" Grid.Row="0"  Style="{StaticResource CalendarColSpacer}" /
                    <Label Grid.Column="2" Grid.Row="0" Content="Tuesday" Style="{StaticResource DayHeader}" /
                    <Canvas Grid.Column="3" Grid.RowSpan="3" Grid.Row="0"  Style="{StaticResource CalendarColSpacer}" /
                    <Label Grid.Column="4" Grid.Row="0" Content="Wednesday" Style="{StaticResource DayHeader}" /
                    <Canvas Grid.Column="5" Grid.RowSpan="3" Grid.Row="0"  Style="{StaticResource CalendarColSpacer}" /
                    <Label Grid.Column="6" Grid.Row="0" Content="Thursday" Style="{StaticResource DayHeader}" /
                    <Canvas Grid.Column="7" Grid.RowSpan="3" Grid.Row="0"  Style="{StaticResource CalendarColSpacer}" /
                    <Label Grid.Column="8" Grid.Row="0" Content="Friday" Style="{StaticResource DayHeader}" /
                    <Canvas Grid.Column="9" Grid.RowSpan="3" Grid.Row="0"  Style="{StaticResource CalendarColSpacer}" /
                    <Label Grid.Column="10" Grid.Row="0" Content="Saturday" Style="{StaticResource DayHeader}" /
                    <Canvas Grid.Column="11" Grid.RowSpan="3" Grid.Row="0"  Style="{StaticResource CalendarColSpacer}" /
                    <Label Grid.Column="12" Grid.Row="0" Content="Sunday" Style="{StaticResource DayHeader}" /
                    <Canvas Grid.Column="0" Grid.ColumnSpan="13" Grid.Row="1" Style="{StaticResource CalendarRowSpacer}" /
                    <Canvas Grid.Column="0" Grid.Row="2" Margin="0" Style="{StaticResource DayField}"
                        <Label Name="lblMondayDate" /
                    </Canvas
                    <Canvas Grid.Column="2" Grid.Row="2" Margin="0" Style="{StaticResource DayField}"
                        <Label Name="lblTuesdayDate" /
                    </Canvas
                    <Canvas Grid.Column="4" Grid.Row="2" Margin="0" Style="{StaticResource DayField}"
                        <Label Name="lblWednesdayDate" /
                    </Canvas
                    <Canvas Grid.Column="6" Grid.Row="2" Margin="0" Style="{StaticResource DayField}"
                        <Label Name="lblThursdayDate" /
                    </Canvas
                    <Canvas Grid.Column="8" Grid.Row="2" Margin="0" Style="{StaticResource DayField}"
                        <Label Name="lblFridayDate" /
                    </Canvas
                    <Canvas Grid.Column="10" Grid.Row="2" Margin="0" Style="{StaticResource DayField}"
                        <Label Name="lblSaturdayDate" /
                    </Canvas
                    <Canvas Grid.Column="12" Grid.Row="2" Margin="0" Style="{StaticResource DayField}"
                        <Label Name="lblSundayDate" /
                    </Canvas
                </Grid
            </Canvas
        </Border
        <Canvas Height="86" HorizontalAlignment="Right" Margin="0,0,12,12" Name="canvas1" VerticalAlignment="Bottom" Width="198"</Canvas        
    </Grid
</Window
CS:
    public partial class Window1 : Window {
        private DateTime today = new DateTime();
        private Label[] Dates = new Label[7];
        public Window1() {
            DateTime start = today = DateTime.Now;
            int day = (int)today.DayOfWeek;
            while (day != 1) {
                start = start.Subtract(new TimeSpan(1, 0, 0, 0));
                day--;
            }
            InitializeComponent();
            Dates[0] = lblMondayDate;
            Dates[1] = lblTuesdayDate;
            Dates[2] = lblWednesdayDate;
            Dates[3] = lblThursdayDate;
            Dates[4] = lblFridayDate;
            Dates[5] = lblSaturdayDate;
            Dates[6] = lblSundayDate;
            FillWeek(start);
        }
        private void FillWeek(DateTime start) {
            for (int d = 0; d < Dates.Length; d++) {
                TimeSpan td = new TimeSpan(d, 0, 0, 0);
                DateTime _day = start.Add(td);
                if (_day.Date == today.Date) {
                    Canvas dayCanvas = (Canvas)Dates[d].Parent;
                    dayCanvas.Style = (Style)this.Resources["Today"];
                }
                Dates[d].Content = (int)start.Add(td).Day;
            }
        }
    }
Thanks for any tips you guys can give
Psytronic