Dobry wieczór mam mały problem z programem w Wpf który wyświetla mi taki błąd "Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.". Całkowicie nie wiem co zrobiłem źle dlatego proszę o pomoc i ewentualne wytłumaczenie rozwiązania. Oto kod
(strona główna po zaznaczeniu check box siatka powinno nam się pojawić dodatkowe okno które pyta o jednostkę siatki a po podaniu jej rysuje siatkę na canvie zgodnie z podaną jednostką)
<Window x:Class="WpfApp1.Windows.DrawPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1.Windows"
mc:Ignorable="d"
Title="DrawPage" Height="900" Width="1600"
Background="Wheat">
<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" Height="900">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.ColumnSpan="2" Content="Rysunek" FontSize="40" VerticalAlignment="Center" HorizontalContentAlignment="Center"></Label>
<Label Grid.Row="1" Grid.Column="0" FontSize="20" Content="Podaj X1:"></Label>
<TextBox Grid.Row="1" Width="100" HorizontalAlignment="Left" Grid.Column="1" Height="50" x:Name="pointX1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewTextInput="Validation"></TextBox>
<Label Grid.Row="1" Grid.Column="2" FontSize="20" Content="Podaj X2:"></Label>
<TextBox Grid.Row="1" Width="100" HorizontalAlignment="Left" Grid.Column="3" Height="50" x:Name="pointX2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewTextInput="Validation"></TextBox>
<Label Grid.Row="2" Grid.Column="0" FontSize="20" Content="Podaj Y1:"></Label>
<TextBox Grid.Row="2" Width="100" HorizontalAlignment="Left" Grid.Column="1" Height="50" x:Name="pointY1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewTextInput="Validation"></TextBox>
<Label Grid.Row="2" Grid.Column="2" FontSize="20" Content="Podaj Y2:"></Label>
<TextBox Grid.Row="2" Width="100" HorizontalAlignment="Left" Grid.Column="3" Height="50" x:Name="pointY2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewTextInput="Validation"></TextBox>
<Label Grid.Row="3" Grid.Column="0" FontSize="20" Content="Okrąg" VerticalContentAlignment="Center"></Label>
<CheckBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Center"></CheckBox>
<Label Grid.Row="4" Grid.Column="0" FontSize="20" Content="Trójkąd" VerticalContentAlignment="Center"></Label>
<CheckBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Center"></CheckBox>
<Label Content="Siatka" x:Name="siatka" Grid.Row="5" Grid.Column="0" FontSize="20" VerticalContentAlignment="Center"></Label>
<CheckBox x:Name="siatkaCheck" Grid.Row="5" Grid.Column="1" Checked="CheckBoxSiatka_Checked" VerticalAlignment="Center"></CheckBox>
<Label Content="Pokaż osie:" Grid.Row="6" Grid.Column="0" FontSize="20" VerticalContentAlignment="Center"/>
<CheckBox x:Name="Osie" Checked="Osie_Checked" Unchecked="Osie_Unchecked" Grid.Row="6" Grid.Column="1" VerticalAlignment="Center"></CheckBox>
<Button Content="Rysuj" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="4" Height="50" Click="DrawBtn" Margin="10"></Button>
<Button Content="Czysc" Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="4" Height="50" Click="ClearBtn" Margin="10"></Button>
<Canvas x:Name="canvas" Background="White"
Margin="20" Grid.Row="1" Grid.Column="4"
Width="800" Height="600"
Grid.RowSpan="11" Grid.ColumnSpan="3"/>
</Grid>
</ScrollViewer>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
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.Shapes;
using System.Xaml.Schema;
namespace WpfApp1.Windows
{
/// <summary>
/// Logika interakcji dla klasy DrawPage.xaml
/// </summary>
///
class HightValueException : Exception
{
public HightValueException() : base("Wartości przekraczają wielkość płótna")
{
}
}
class StringValueException : Exception
{
public StringValueException() : base("Wartośći X i Y nie mogą być puste")
{
}
}
public partial class DrawPage : Window
{
public DrawPage()
{
InitializeComponent();
}
private void DrawBtn(object sender, RoutedEventArgs e)
{
try
{
if (String.IsNullOrEmpty(pointX1.Text) || String.IsNullOrEmpty(pointY1.Text) || String.IsNullOrEmpty(pointX2.Text) || String.IsNullOrEmpty(pointY2.Text))
{
throw new StringValueException();
}
int x1value = int.Parse(pointX1.Text);
int y1value = int.Parse(pointY1.Text);
int x2Value = int.Parse(pointX2.Text);
int y2Value = int.Parse(pointY2.Text);
var myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.Black;
myLine.X1 = x1value;
myLine.Y1 = y1value;
myLine.X2 = x2Value;
myLine.Y2 = y2Value;
myLine.StrokeThickness = 2;
canvas.Children.Add(myLine);
if (x1value > canvas.ActualHeight || y1value > canvas.ActualWidth || x2Value > canvas.ActualWidth || y2Value > canvas.ActualWidth)
{
throw new HightValueException();
}
}
catch (HightValueException HValue)
{
MessageBox.Show(HValue.Message, "Błąd");
}
catch(StringValueException SValue)
{
MessageBox.Show(SValue.Message, "Błąd");
}
}
private void Validation(object sender, TextCompositionEventArgs e)
{
Regex regex = new Regex("[^0-9]+");
e.Handled = regex.IsMatch(e.Text);
}
private void CheckBoxSiatka_Checked(object sender, RoutedEventArgs e)
{
var siatka = new Siatka();
siatka.ShowDialog();
int range=0;
siatka.DataContext = range;
var w = canvas.Width;
var h = canvas.Height;
double rangex = w / range;
double rangey = h / range;
Line pion = new Line();
Line poz = new Line();
pion.X1 = 20; pion.Y1 = 0;
pion.X2 = w / 2; pion.Y2 = h;
poz.X1 = 0; poz.Y1 = h / 2;
poz.X2 = w; poz.Y2 = h / 2;
//pionowe
for (double i = pion.X1 = 0; i <= Math.Floor(rangex); i++)
{
Line l3 = new Line();
l3.X1 = 0 + (range * i); l3.Y1 = 0;
l3.X2 = 0 + (range * i); l3.Y2 = h;
l3.Stroke = System.Windows.Media.Brushes.Black;
l3.Opacity = 0.2;
l3.StrokeThickness = 2;
canvas.Children.Add(l3);
}
//poziome
for (double i = pion.Y1 = 0; i <= Math.Floor(rangey); i++)
{
Line l3 = new Line();
l3.X1 = 0; l3.Y1 = 0 + (range * i);
l3.X2 = w; l3.Y2 = 0 + (range * i);
l3.Stroke = System.Windows.Media.Brushes.Black;
l3.StrokeThickness = 2;
l3.Opacity = 0.2;
canvas.Children.Add(l3);
}
}
private void Osie_Checked(object sender, RoutedEventArgs e)
{
var w = canvas.Width;
var h = canvas.Height;
Line pion = new Line();
Line poz = new Line();
pion.X1 = w / 2; pion.Y1 = 0;
pion.X2 = w / 2; pion.Y2 = h;
poz.X1 = 0; poz.Y1 = h / 2;
poz.X2 = w; poz.Y2 = h / 2;
pion.Stroke = System.Windows.Media.Brushes.Black;
pion.StrokeThickness = 2;
canvas.Children.Add(pion);
poz.Stroke = System.Windows.Media.Brushes.Black;
poz.StrokeThickness = 2;
canvas.Children.Add(poz);
}
private void functionT(object sender, RoutedEventArgs e)
{
}
private void Osie_Unchecked(object sender, RoutedEventArgs e)
{
canvas.Children.Clear();
}
private void ClearBtn(object sender, RoutedEventArgs e)
{
Osie.IsChecked = false;
canvas.Children.Clear();
}
}
}
Strona Siatki
<Window x:Class="WpfApp1.Windows.Siatka"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1.Windows"
mc:Ignorable="d"
Title="Siatka" Height="150" Width="300">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Label Content="Podaj jednostkę siatki (px):"></Label>
<TextBox x:Name="jednostka"></TextBox>
<Button Margin="5" Content="Ok" Click="Button_Click"></Button>
</StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
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.Shapes;
namespace WpfApp1.Windows
{
/// <summary>
/// Logika interakcji dla klasy Siatka.xaml
/// </summary>
public partial class Siatka : Window
{
public Siatka()
{
InitializeComponent();
}
class RangeException : Exception
{
public RangeException() : base("Musisz podać jednostke!")
{
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Class1 j = new Class1();
j.Jednostka = Convert.ToInt32(jednostka.Text);
((ObservableCollection<Class1>)DataContext).Add(j);
try
{
if (String.IsNullOrEmpty(jednostka.Text))
{
throw new RangeException();
}
else
{
this.Close();
}
}
catch(RangeException R)
{
MessageBox.Show(R.Message, "Błąd");
}
}
}
}
Oraz klasa
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApp1
{
public class Class1
{
public int Jednostka { get; set; }
}
}
Z góry dziękuję za pomoc .