<Window x:Class="WpfApplication1.Window1" Name="winBoltCircle" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" Title="Bolt Hole Pattern" Height="700" Width="1050" Background="Gray"> <Window.Resources> <local:FormattingConverter x:Key="formatter" /> </Window.Resources> <Grid Margin="5,5,5,5"> <Grid.RowDefinitions> <RowDefinition Height="25"/> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="250" /> <ColumnDefinition Width="250" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Text="Pattern 1" Foreground="White" FontSize="14" Margin="10,0,0,0" VerticalAlignment="Center"/> <TextBlock Text="Pattern 2" Foreground="White" FontSize="14" Margin="10,0,0,0" VerticalAlignment="Center" Grid.Column="1"/> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - 1st Column for Hole Pattern #1 - - - - - - --> <Border Grid.Row="1" Grid.Column="0" BorderBrush="Black" BorderThickness="1" CornerRadius="4" Padding="8" Margin="5,0,5,0" Grid.RowSpan="2" Background="White"> <StackPanel> <StackPanel Orientation="Horizontal" > <TextBlock Text="Bolt Cir Dia. " Width="75" /> <TextBox Name="txtBoltCirDia1" Text="{Binding Path=CurrentHolePattern.BoltCirDia, ElementName=winBoltCircle}" PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" Height="25" Width="75" PreviewKeyDown="TextBox_PreviewKeyDown" /> </StackPanel> <StackPanel Orientation="Horizontal" > <TextBlock Text="No. of Holes: " Width="75" /> <TextBox Name="txtHoleCount1" Text="{Binding Path=CurrentHolePattern.HoleCount, ElementName=winBoltCircle}" PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" Height="25" Width="75" /> <Button Name="btnHoleCountDecrease1" Click="btnHoleCountDecrease_Click" Margin="5,0,0,0" Width="25">-</Button> <Button Name="btnHoleCountIncrease1" Click="btnHoleCountIncrease_Click" Margin="5,0,0,0" Width="25">+</Button> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Start Angle: " Width="75"/> <TextBox Name="txtStartAngle1" Text="{Binding Path=CurrentHolePattern.StartAngle, ElementName=winBoltCircle}" PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" Height="25" Width="75" /> <Button Name="btnStartAngleDecrease1" Click="btnStartAngleDecrease_Click" Margin="5,0,0,0" Width="25">-</Button> <Button Name="btnStartAngleIncrease1" Click="btnStartAngleIncrease_Click" Margin="5,0,0,0" Width="25">+</Button> </StackPanel> <Slider Name="slider1" Value="{Binding Path=CurrentHolePattern.StartAngle, ElementName=winBoltCircle}" Maximum="90" LargeChange="5" Ticks="0,45,90" TickPlacement="BottomRight" SmallChange="1" Height="22" Width="75" /> <!--Coordinate Grid - Pattern #1 --> <ListView x:Name="CoordinateGrid1" MouseDoubleClick="CoordinateGrid_MouseDoubleClick" MinHeight="300"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView > <GridViewColumn Header="Number" DisplayMemberBinding="{Binding Path=HoleNumber}" /> <GridViewColumn Header="X Coord" Width="60"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding AbsX, Converter={StaticResource formatter}, ConverterParameter='\{0:f4\}'}" HorizontalAlignment="Right" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Y Coord" Width="60" > <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding AbsY, Converter={StaticResource formatter}, ConverterParameter='\{0:f4\}'}" HorizontalAlignment="Right" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Angle" Width="60"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Angle, Converter={StaticResource formatter}, ConverterParameter='\{0:f2\}'}" HorizontalAlignment="Right" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView> </StackPanel> </Border> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - 2nd Column for Hole Pattern #2 - - - - - - --> <Border Grid.Row="1" Grid.Column="1" BorderBrush="Black" BorderThickness="1" CornerRadius="4" Padding="8" Grid.RowSpan="2" Margin="5,0,5,0" Background="White"> <StackPanel> <StackPanel Orientation="Horizontal" > <TextBlock Text="Bolt Cir Dia. " Width="75" /> <TextBox Name="txtBoltCirDia2" Text="{Binding Path=HolePattern2.BoltCirDia, ElementName=winBoltCircle}" PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" Height="25" Width="75" PreviewKeyDown="TextBox_PreviewKeyDown" /> </StackPanel> <StackPanel Orientation="Horizontal" > <TextBlock Text="No. of Holes: " Width="75" /> <TextBox Name="txtHoleCount2" Text="{Binding Path=HolePattern2.HoleCount, ElementName=winBoltCircle}" PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" Height="25" Width="75" /> <Button Name="btnHoleCountDecrease2" Click="btnHoleCountDecrease_Click" Margin="5,0,0,0" Width="25">-</Button> <Button Name="btnHoleCountIncrease2" Click="btnHoleCountIncrease_Click" Margin="5,0,0,0" Width="25">+</Button> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Start Angle: " Width="75"/> <TextBox Name="txtStartAngle2" Text="{Binding Path=HolePattern2.StartAngle, ElementName=winBoltCircle}" PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" Height="25" Width="75" /> <Button Name="btnStartAngleDecrease2" Click="btnStartAngleDecrease_Click" Margin="5,0,0,0" Width="25">-</Button> <Button Name="btnStartAngleIncrease2" Click="btnStartAngleIncrease_Click" Margin="5,0,0,0" Width="25">+</Button> </StackPanel> <Slider Name="slider2" Value="{Binding Path=HolePattern2.StartAngle, ElementName=winBoltCircle}" Maximum="90" LargeChange="5" Ticks="0,45,90" TickPlacement="BottomRight" SmallChange="1" Height="22" Width="75" /> <!--Coordinate Grid - Pattern #2 --> <ListView x:Name="CoordinateGrid2" MouseDoubleClick="CoordinateGrid_MouseDoubleClick" MinHeight="300"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView > <GridViewColumn Header="Number" DisplayMemberBinding="{Binding Path=HoleNumber}" /> <GridViewColumn Header="X Coord" Width="60"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding AbsX, Converter={StaticResource formatter}, ConverterParameter='\{0:f4\}'}" HorizontalAlignment="Right" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Y Coord" Width="60" > <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding AbsY, Converter={StaticResource formatter}, ConverterParameter='\{0:f4\}'}" HorizontalAlignment="Right" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Angle" Width="60"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Angle, Converter={StaticResource formatter}, ConverterParameter='\{0:f2\}'}" HorizontalAlignment="Right" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView> </StackPanel> </Border> <StackPanel Grid.Row="1" Grid.Column="2" > <Border BorderBrush="Black" BorderThickness="1" CornerRadius="4" Padding="8" Height="50" VerticalAlignment="Top" Margin="5,0,0,0" Background="White"> <StackPanel Grid.Column="2" Grid.Row="1" Orientation="Horizontal" > <Button Name="btnDraw" Click="btnDraw_Click">ReDraw</Button> <StackPanel Orientation="Horizontal" Margin="10,0,0,0"> <TextBlock Text="Hole Size" VerticalAlignment="Center" Margin="10,0,10,0"/> <Button Name="btnHoleSizeDecrease" Click="btnHoleSizeDecrease_Click" Margin="5,0,0,0" Width="25">-</Button> <Button Name="btnHoleSizeIncrease" Click="btnHoleSizeIncrease_Click" Margin="5,0,0,0" Width="25">+</Button> </StackPanel> <Button Name="btnPrint" Width="75" Click="btnPrint_Click" Margin="115,0,0,0">Print</Button> </StackPanel> </Border> <Border Grid.Row="1" Grid.Column="2" BorderBrush="Black" BorderThickness="1" CornerRadius="4" Padding="8" VerticalAlignment="Top" Margin="5,10,0,0" Background="White"> <StackPanel> <TextBlock Text="Double-Click a row in the grid to toggle hole visibility." /> <StackPanel> <Canvas Name="canvas1" Background="#7920619E" Margin="0,5,0,0" Height="500"/> </StackPanel> </StackPanel> </Border> </StackPanel> </Grid> </Window>code-behind:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.ComponentModel; namespace WpfApplication1 { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window, INotifyPropertyChanged { public ObservableCollection<HolePattern> HolePatterns { get; set; } public HolePattern CurrentHolePattern { get; set; } public HolePattern HolePattern2 { get; set; } // Canvas sketch related fields public double OuterSketchBoltCirRad; public double InnerSketchBoltCirRad; public double SketchX0 { get; set; } public double SketchY0 { get; set; } public event PropertyChangedEventHandler PropertyChanged; //private void NotifyPropertyChanged(String info) //{ // if (PropertyChanged != null) // { // PropertyChanged(this, new PropertyChangedEventArgs(info)); // } //} public Window1() { HolePatterns = new ObservableCollection<HolePattern>(); CurrentHolePattern = new HolePattern(); HolePattern2 = new HolePattern(); CurrentHolePattern.PatternName = "Pattern #1"; HolePattern2.PatternName = "Pattern #2"; HolePatterns.Add(CurrentHolePattern); HolePatterns.Add(HolePattern2); InitializeComponent(); SketchX0 = 250;// canvas1.Width / 2; SketchY0 = 250;//canvas1.Height / 2; OuterSketchBoltCirRad = SketchX0 * 0.8; InnerSketchBoltCirRad = SketchX0 * 0.65; CurrentHolePattern.SketchX0 = SketchX0; CurrentHolePattern.SketchY0 = SketchY0; HolePattern2.SketchX0 = SketchX0; HolePattern2.SketchY0 = SketchY0; CurrentHolePattern.SketchBoltCirRad = OuterSketchBoltCirRad; HolePattern2.SketchBoltCirRad = InnerSketchBoltCirRad; CurrentHolePattern.PropertyChanged += new PropertyChangedEventHandler(CurrentHolePattern_PropertyChanged); CurrentHolePattern.CollectionChanged += new NotifyCollectionChangedEventHandler(CurrentHolePattern_CollectionChanged); HolePattern2.PropertyChanged += new PropertyChangedEventHandler(CurrentHolePattern_PropertyChanged); HolePattern2.CollectionChanged += new NotifyCollectionChangedEventHandler(CurrentHolePattern_CollectionChanged); //-- Set some default values for the UI CurrentHolePattern.BoltCirDia = 12.0; CurrentHolePattern.HoleCount = 6; CurrentHolePattern.StartAngle = 0; HolePattern2.BoltCirDia = 12.0; HolePattern2.HoleCount = 6; HolePattern2.StartAngle = 0; CoordinateGrid1.ItemsSource = CurrentHolePattern.HoleList; CoordinateGrid2.ItemsSource = HolePattern2.HoleList; } void CurrentHolePattern_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { RedrawScreen(); } void CurrentHolePattern_PropertyChanged(object sender, PropertyChangedEventArgs e) { RepaintScreen();// Repaint doesn't clear out the Canvas, just updates what's already there. } public void DrawGridLines() { int LineSpacing = 20; double LineWidth = 0.5; Brush LineColor = Brushes.Gray; //-- Horizontal Grid Lines (work from Center to Left, then Center to Right) for (double x = 0; x <= SketchX0; x += LineSpacing) { for (int y = -1; y <= 1; y += 2) { Line VerticalGraphLine = new Line(); VerticalGraphLine.X1 = SketchX0 + x * y; VerticalGraphLine.Y1 = 0; VerticalGraphLine.X2 = VerticalGraphLine.X1; VerticalGraphLine.Y2 = SketchX0*2; VerticalGraphLine.Stroke = LineColor; VerticalGraphLine.StrokeThickness = LineWidth; canvas1.Children.Add(VerticalGraphLine); } } //-- Vertical Grid Lines (work from Center Up, then Center down) for (double x = 0; x <= SketchX0; x += LineSpacing) { for (int y = -1; y <= 1; y += 2) { Line HorizontalGraphLine = new Line(); HorizontalGraphLine.X1 = 0; HorizontalGraphLine.Y1 = SketchY0 + x * y; HorizontalGraphLine.X2 = SketchY0*2; HorizontalGraphLine.Y2 = HorizontalGraphLine.Y1; HorizontalGraphLine.Stroke = LineColor; HorizontalGraphLine.StrokeThickness = LineWidth; canvas1.Children.Add(HorizontalGraphLine); } } } public void DrawBoltCir() { //-- Outer Bolt Circle --- Ellipse BoltCirEntity = new Ellipse(); BoltCirEntity.Width = OuterSketchBoltCirRad * 2; BoltCirEntity.Height = OuterSketchBoltCirRad * 2; BoltCirEntity.Stroke = Brushes.Gray; BoltCirEntity.Margin = new Thickness(SketchX0 - OuterSketchBoltCirRad, SketchY0 - OuterSketchBoltCirRad, 0, 0); canvas1.Children.Add(BoltCirEntity); //-- Inner Bolt Circle --- BoltCirEntity = new Ellipse(); BoltCirEntity.Width = InnerSketchBoltCirRad * 2; BoltCirEntity.Height = InnerSketchBoltCirRad * 2; BoltCirEntity.Stroke = Brushes.Gray; BoltCirEntity.Margin = new Thickness(SketchX0 - InnerSketchBoltCirRad, SketchY0 - InnerSketchBoltCirRad, 0, 0); canvas1.Children.Add(BoltCirEntity); Line HorizontalCL = new Line(); HorizontalCL.X1 = 10; HorizontalCL.Y1 = SketchY0; HorizontalCL.X2 = SketchX0*2-10; HorizontalCL.Y2 = SketchY0; HorizontalCL.Stroke = Brushes.Black; HorizontalCL.StrokeThickness = 1; Line VerticalCL = new Line(); VerticalCL.X1 = SketchX0; VerticalCL.Y1 = 10; VerticalCL.X2 = SketchX0; VerticalCL.Y2 = SketchY0*2-10; VerticalCL.Stroke = Brushes.Black; VerticalCL.StrokeThickness = 1; //-- Add objects to Canvas canvas1.Children.Add(HorizontalCL); canvas1.Children.Add(VerticalCL); } public void DrawHoles() { // This methods adds the HoleEntity and HoleLabel to the canvas // The method UpdateHoles() must be used to set the sketch positions for these objects // Canvas clearing should be handled outside this method as needed. foreach (Hole Hole in CurrentHolePattern.HoleList) { canvas1.Children.Add(Hole.HoleEntity); canvas1.Children.Add(Hole.HoleLabel); } } public void DrawHolePattern2() { // This methods adds the HoleEntity and HoleLabel to the canvas // The method UpdateHoles() must be used to set the sketch positions for these objects // Canvas clearing should be handled outside this method as needed. foreach (Hole Hole in HolePattern2.HoleList) { canvas1.Children.Add(Hole.HoleEntity); canvas1.Children.Add(Hole.HoleLabel); } } public partial class HolePattern: INotifyPropertyChanged, INotifyCollectionChanged { private int _HoleCount; private double _BoltCirDia; private double _StartAngle; private double _AngularSpacing; public string PatternName { get; set; } public double SketchX0 { get; set; } public double SketchY0 { get; set; } public double SketchBoltCirRad { get; set; } public ObservableCollection<Hole> HoleList { get; set; } public event PropertyChangedEventHandler PropertyChanged; public event NotifyCollectionChangedEventHandler CollectionChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } private void NotifyCollectionChanged() { if (CollectionChanged != null) { CollectionChanged(this, new NotifyCollectionChangedEventArgs (NotifyCollectionChangedAction.Reset)); } } public HolePattern() //Constructor { HoleList = new ObservableCollection<Hole>(); _HoleCount = 0; } public void CreateHoleList() { this.HoleList.Clear(); if (this.HoleCount > 0) { int x; double CurrentAngle = this.StartAngle; for (x = 1; x <= this.HoleCount; x++) { Hole NewHole = new Hole(); NewHole.HoleNumber = x; NewHole.HoleEntity.Stroke = Brushes.Black; //-- Set BCR and Angle, and let the Hole calculate the absolute coords of each hole NewHole.BoltCirRad = this.BoltCirDia / 2.0; NewHole.Angle = CurrentAngle; //--Setup HoleLabel (position happens in UpdateHoles()--------- NewHole.HoleLabel.Text = x.ToString(); NewHole.HoleLabel.TextAlignment = TextAlignment.Center; NewHole.HoleLabel.Foreground = Brushes.White; NewHole.HoleLabel.FontSize = 12; //HoleList.Add(NewHole); this.HoleList.Add(NewHole); CurrentAngle = this.StartAngle + x * this.AngularSpacing; // Increment the angle for the next Hole NotifyCollectionChanged(); //Announce that HoleList collection has changed! } } } public void UpdateHoles() { foreach (Hole HoleEnt in this.HoleList) { //-- Update absolute coord points on the Hole by setting its properties ----- //-- The Hole object will calculate the absolute X and Y in its poperty setters HoleEnt.BoltCirRad = this.BoltCirDia / 2; HoleEnt.Angle = (HoleEnt.HoleNumber - 1) * this.AngularSpacing + this.StartAngle; //--Update the Hole sketch data for the Canvas layout ---- HoleEnt.HoleEntity.Width = HoleEnt.HoleDia; HoleEnt.HoleEntity.Height = HoleEnt.HoleDia; HoleEnt.CanvasX = SketchX0 + SketchBoltCirRad * Math.Cos(dtr(HoleEnt.Angle)) - HoleEnt.HoleDia / 2; HoleEnt.CanvasY = SketchY0 - SketchBoltCirRad * Math.Sin(dtr(HoleEnt.Angle)) - HoleEnt.HoleDia / 2; HoleEnt.HoleEntity.Margin = new Thickness(HoleEnt.CanvasX, HoleEnt.CanvasY, 0, 0); //---Update the HoleLabel sketch coords for the Canvas ----- double TextCLR = (SketchBoltCirRad - HoleEnt.HoleDia / 2 - HoleEnt.HoleLabel.FontSize); double HoleLabelX = (SketchX0 + TextCLR * Math.Cos(dtr(HoleEnt.Angle)) - HoleEnt.HoleLabel.FontSize / 2); double HoleLabelY = (SketchY0 - TextCLR * Math.Sin(dtr(HoleEnt.Angle)) - HoleEnt.HoleLabel.FontSize * .6); HoleEnt.HoleLabel.Margin = new Thickness(HoleLabelX, HoleLabelY, 0, 0); } } public double BoltCirDia { get { return _BoltCirDia; } set { _BoltCirDia = value; NotifyPropertyChanged("BoltCirDia"); } } public double StartAngle { get { return _StartAngle; } set { _StartAngle = value; NotifyPropertyChanged("StartAngle"); } } public double AngularSpacing { get { return _AngularSpacing; } set { _AngularSpacing = value; NotifyPropertyChanged("AngularSpacing"); } } public int HoleCount { get { return _HoleCount; } set { if (value >= 0) { _HoleCount = value; } else { _HoleCount = 0; } if (value > 0) { _AngularSpacing = 360.0 / _HoleCount; } else { _AngularSpacing = 0; } CreateHoleList(); NotifyPropertyChanged("HoleCount"); } } public void ChangeHoleCount(int ChangeAmount) { if (this.HoleCount + ChangeAmount >= 0) { this.HoleCount += ChangeAmount; } } public void ChangeStartAngle(int ChangeAmount) { this.StartAngle += ChangeAmount; } } public class Hole:INotifyPropertyChanged { public Ellipse HoleEntity = new Ellipse(); public TextBlock HoleLabel = new TextBlock(); public static double _HoleDia = 20; public int HoleNumber { get; set; } public double CanvasX { get; set; } public double CanvasY { get; set; } public double HoleLabelX { get; set; } public double HoleLabelY { get; set; } public string AbsXDisplay{ get; set; } public string AbsYDisplay { get; set; } private bool _Visible; private double _AbsX; private double _AbsY; private double _Angle; private double _BoltCirRad; public event PropertyChangedEventHandler PropertyChanged; public Hole() { HoleEntity.Width = _HoleDia; HoleEntity.Height = _HoleDia; Visible = true; } private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } public bool Visible { get { return _Visible; } set { _Visible = value; HoleEntity.Visibility = value ? Visibility.Visible : Visibility.Hidden; NotifyPropertyChanged("Visible"); } } public double AbsX { get { return _AbsX; } set { _AbsX = value; AbsXDisplay = String.Format("{0:f4}", value); NotifyPropertyChanged("AbsX"); } } public double AbsY { get { return _AbsY; } set { _AbsY = value; AbsYDisplay = String.Format("{0:f4}", value); NotifyPropertyChanged("AbsY"); } } public double HoleDia { get { return _HoleDia;} set { _HoleDia = value; NotifyPropertyChanged("HoleDia"); } } public double BoltCirRad { get{return _BoltCirRad;} set { _BoltCirRad = value; AbsX = (this.BoltCirRad * Math.Cos(dtr(this.Angle))); AbsY = (this.BoltCirRad * Math.Sin(dtr(this.Angle))); } } public double Angle { get{return _Angle;} set { _Angle = value; AbsX = (this.BoltCirRad * Math.Cos(dtr(this.Angle))); AbsY = (this.BoltCirRad * Math.Sin(dtr(this.Angle))); NotifyPropertyChanged("Angle"); } } } public static double dtr(double degrees) { double radians = (Math.PI / 180) * degrees; return (radians); } private void ChangeHoleSketchSize(int ChangeAmount) { if (Hole._HoleDia + ChangeAmount > 0) { Hole._HoleDia += ChangeAmount; } //UpdateHoles(); RepaintScreen(); } private void ToggleHoleVisiblity(Hole SelectedHole) { SelectedHole.Visible = (SelectedHole.Visible) ? false : true; RepaintScreen(); } private void RedrawScreen() { canvas1.Children.Clear(); //CreateHoleList(); // Recreate the Hole list collection, which re-calcs the absolute coordinates and angle of each hole DrawGridLines(); DrawBoltCir(); DrawHoles(); DrawHolePattern2(); RepaintScreen(); // Recalculate the abs and canvas coords on the HoleList. Will update grid and update on the canvas } private void RepaintScreen() { CurrentHolePattern.UpdateHoles(); // Recalculate the abs and canvas coords on the HoleList so we can draw the holes on the canvas HolePattern2.UpdateHoles(); } private void btnDraw_Click(object sender, RoutedEventArgs e) { RedrawScreen(); } private void btnHoleCountIncrease_Click(object sender, RoutedEventArgs e) { string name = ((FrameworkElement)sender).Name.ToString(); if (name.EndsWith("1")) { CurrentHolePattern.ChangeHoleCount(1); } else { HolePattern2.ChangeHoleCount(1); } } private void btnHoleCountDecrease_Click(object sender, RoutedEventArgs e) { string name = ((FrameworkElement)sender).Name.ToString(); if (name.EndsWith("1")) { CurrentHolePattern.ChangeHoleCount(-1); } else { HolePattern2.ChangeHoleCount(-1); } } private void btnStartAngleIncrease_Click(object sender, RoutedEventArgs e) { string name = ((FrameworkElement)sender).Name.ToString(); if (name.EndsWith("1")) { CurrentHolePattern.ChangeStartAngle(1); } else { HolePattern2.ChangeStartAngle(1); } } private void btnStartAngleDecrease_Click(object sender, RoutedEventArgs e) { string name = ((FrameworkElement)sender).Name.ToString(); if (name.EndsWith("1")) { CurrentHolePattern.ChangeStartAngle(-1); } else { HolePattern2.ChangeStartAngle(-1); } } //private void btnStartAngleIncrease_MouseDown(object sender, MouseButtonEventArgs e) //{ // ChangeStartAngle(1); //} //private void btnStartAngleDecrease_MouseDown(object sender, MouseButtonEventArgs e) //{ // ChangeStartAngle(-1); //} private void btnHoleSizeDecrease_Click(object sender, RoutedEventArgs e) { ChangeHoleSketchSize(-1); } private void btnHoleSizeIncrease_Click(object sender, RoutedEventArgs e) { ChangeHoleSketchSize(1); } private void CoordinateGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { var lvRef=(ListView)sender; Hole SelectedHole = (Hole)lvRef.SelectedItem; ToggleHoleVisiblity(SelectedHole); } //http://www.madprops.org/blog/enter-to-tab-in-wpf/ private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { var uie = e.OriginalSource as UIElement; if (e.Key == Key.Enter) { e.Handled = true; uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); } } private void TextBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { ((TextBox)sender).SelectAll(); } private void btnPrint_Click(object sender, RoutedEventArgs e) { PrintDialog prtDlg = new PrintDialog(); if(prtDlg.ShowDialog() == true) { prtDlg.PrintVisual(winBoltCircle, "A simple drawing"); } } private void button1_Click(object sender, RoutedEventArgs e) { HolePattern hp = new HolePattern(); hp.PatternName = "Pattern2"; HolePatterns.Add(hp); } } [ValueConversion(typeof(object), typeof(string))] public class FormattingConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string formatString = parameter as string; if (formatString != null) { return string.Format(culture, formatString, value); } else { return value.ToString(); } } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // we don't intend this to ever be called return null; } } }