• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

WPF przekazywanie danych między dwoma oknami

Object Storage Arubacloud
0 głosów
240 wizyt
pytanie zadane 13 grudnia 2022 w C# przez MisticVoid Początkujący (490 p.)

Dobry wieczór mam mały problem. Tworzę aktualnie projekt w WPF i chciałbym przekazywać dane między jednym oknem a drugim. Chciałbym przesyłać wysokość oraz szerokość aby za pomocą tych danych canva zmieniała rozmiar na podany przez użytkownika. Coś próbuję zrobić ale na moim aktualnym poziomie mało zdziałam dlatego proszę o pomoc. Oto kod. Bardzo dziękuję za pomoc.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
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ści przekraczają wielkość płótna")
        {

        }
    }

    public partial class DrawPage : Window
    {
        public DrawPage()
        {
            InitializeComponent();
        }

        SettingsPage st = new SettingsPage();

        private void DrawBtn(object sender, RoutedEventArgs e)
        {
            try
            {
                //double xvalaue = double.Parse(pointX.Text);
                //double yvalue = double.Parse(pointY.Text);

                //if (xvalaue > canvas.ActualHeight || yvalue > canvas.ActualWidth)
                //{
                //    throw new HightValueException();
                //}
                //else
                //{
                //    var myLine = new Line();
                //    myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
                //    myLine.X1 = xvalaue;
                //    myLine.Y1 = yvalue;
                //    myLine.HorizontalAlignment = HorizontalAlignment.Left;
                //    myLine.VerticalAlignment = VerticalAlignment.Center;
                //    myLine.StrokeThickness = 2;
                //    canvas.Children.Add(myLine);
                //}

                var value = st.width.Text;

                MessageBox.Show(value, "wartość okna");
            }
            catch (HightValueException h)
            {
                MessageBox.Show(h.Message, "Błąd");
            }
        }

        private void ClearBtn(object sender, RoutedEventArgs e)
        {
            canvas.Children.Clear();
        }

        private void Validation(object sender, TextCompositionEventArgs e)
        {
            Regex regex = new Regex("[^0-9]+");
            e.Handled = regex.IsMatch(e.Text);
        }

    }
}
<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="*"></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="25" Content="Podaj X:"></Label>
            <TextBox Grid.Row="1" Grid.Column="1" Height="50" x:Name="pointX" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewTextInput="Validation"></TextBox>

            <Label Grid.Row="2" Grid.Column="0" FontSize="25" Content="Podaj Y:"></Label>
            <TextBox Grid.Row="2" Grid.Column="1" Height="50" x:Name="pointY" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewTextInput="Validation"></TextBox>

            <Label Grid.Row="3" Grid.Column="0" FontSize="25" Content="Okrąg"></Label>
            <CheckBox Grid.Row="3" Grid.Column="1"></CheckBox>
            
            <Label Grid.Row="4" Grid.Column="0" FontSize="25" Content="Trójkąd"></Label>
            <CheckBox Grid.Row="4" Grid.Column="1"></CheckBox>

            <Button Content="Rysuj" Grid.Row="5" Grid.Column="1" Height="50" Click="DrawBtn"></Button>
            <Button Content="Czysc" Grid.Row="6" Grid.Column="1" Height="50" Click="ClearBtn"></Button>


            <Canvas Background="White" x:Name="canvas" Margin="20" Grid.Row="1" Grid.Column="2" Grid.RowSpan="11" Grid.ColumnSpan="3">

            </Canvas>
        </Grid>
    </ScrollViewer>
</Window>

oraz druga strona z której chcę pobrać dane (tutaj tylko xaml)

<Window x:Class="WpfApp1.Windows.SettingsPage"
        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"
 d:DesignHeight="450" d:DesignWidth="800"
      Title="CanvaSettings" Background="White" Width="800" Height="450">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"></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>
        </Grid.RowDefinitions>

        <Label Content="Właściwości Płótna" FontSize="40" Grid.ColumnSpan="6" HorizontalContentAlignment="Center"/>

        <Label Content="Wysokość" Grid.Column="2" Grid.Row="1" Margin="5" HorizontalAlignment="Center"/>
        <Label Content="Szerokość" Grid.Column="2" Grid.Row="2" Margin="5" HorizontalAlignment="Center"/>
        <Label Content="Kolor" Grid.Column="2" Grid.Row="3" Margin="5" HorizontalAlignment="Center"/>

        <TextBox Grid.Column="3" Grid.Row="1" Margin="5" x:Name="height"></TextBox>
        <TextBox Grid.Column="3" Grid.Row="2" Margin="5" x:Name="width"></TextBox>
        <ComboBox Grid.Column="3" Grid.Row="3" Margin="5" x:Name="color" SelectedIndex="6">
            <ComboBoxItem Content="Red"></ComboBoxItem>
            <ComboBoxItem Content="Green"></ComboBoxItem>
            <ComboBoxItem Content="Blue"></ComboBoxItem>
            <ComboBoxItem Content="Yellow"></ComboBoxItem>
            <ComboBoxItem Content="Orange"></ComboBoxItem>
            <ComboBoxItem Content="Purple"></ComboBoxItem>
            <ComboBoxItem Content="Light Blue"></ComboBoxItem>
        </ComboBox>

        <Button Content="Dalej" Grid.Column="2" Grid.ColumnSpan="2" Grid.Row="4" Height="25" Margin="5" Click="DrawPageBtn"/>
    </Grid>
</Window>

 

1 odpowiedź

0 głosów
odpowiedź 13 grudnia 2022 przez VBService Ekspert (253,300 p.)
edycja 13 grudnia 2022 przez VBService

Możesz skorzystać  z Properties.Settings i

  • Windows.DrawPage - odczytywać dane
  • Windows.SettingsPage - odczytać dane i zapisać nowe dane lub zmmienione

  

 

 

Możesz też zapisać ustawienia programu w pliku XML (biblioteka System.Xml) i

  • użyć klasy XmlWriter, aby zapisać dane (z poziomu okna Windows.SettingsPage)
  • użyć klasy XmlReader, aby odczytać dane  (z poziomu okna Windows.DrawPage)

przykład zapisu

// Przygotowanie ustawień do zapisu
string canvasActualWidthValue = canvasWidth.Text;  // TextBox
string canvasActualHeightValue = canvasHeight.Text; // TextBox

// Otwarcie pliku XML do zapisu
using (XmlWriter writer = XmlWriter.Create("Settings.xml"))
{
   // Rozpoczęcie zapisu dokumentu XML
   writer.WriteStartDocument();
   // Dodanie elementu głównego do dokumentu tzw. root-a
   writer.WriteStartElement("Settings");

   // Dodanie elementu z ustawieniem
   writer.WriteStartElement("Canvas");

     writer.WriteStartElement("Width");
     writer.WriteString(canvasActualWidthValue);
     writer.WriteEndElement();

     writer.WriteStartElement("Height"); 
     writer.WriteString(canvasActualHeightValue);
     writer.WriteEndElement();

   writer.WriteEndElement(); // "Canvas"

   // Zakończenie zapisu elementu głównego
   writer.WriteEndElement(); // "Settings"
   // Zakończenie zapisu dokumentu XML
   writer.WriteEndDocument();
}

powstały plik xml

<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Canvas>
    <Width>500</Width>
    <Height>600</Height>
  </Canvas>
</Settings>

 

Obydwa proponowane rozwiązania pozwalają na zapamiętanie ustawień aplikacji i ustawienie ich po ponownym uruchomieniu.

 

Sprawdź też: 

  • ResourceDictionary  [ 1 ]  [ 2 ]

Podobne pytania

0 głosów
3 odpowiedzi 1,045 wizyt
pytanie zadane 19 sierpnia 2019 w C# przez Krst0 Obywatel (1,340 p.)
0 głosów
0 odpowiedzi 588 wizyt
pytanie zadane 26 czerwca 2019 w C# przez noname3 Obywatel (1,180 p.)
0 głosów
1 odpowiedź 543 wizyt
pytanie zadane 1 marca 2018 w C# przez kaminki Obywatel (1,030 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...