Forum » Programiranje » UserControl v Wrappanelu WPF
UserControl v Wrappanelu WPF
hurlimannxt ::
Pozdravljeni!
Zadaj v kodi sem pa takle naredil:
v konstruktorju sem naredil dva objekta, ki bi se morala tekoj ob zagonu prikazat v wrap panelu vsak s svojimi podatki, ki se prikažejo kot sem definiral z usercontrolom, a se ne, prikaže samo enega.
Link do dropBox-a -> https://www.dropbox.com/s/dzp2t3h74mii3...
Če mi kdo lahko priporoča kako zadevo rešit, programsko in pa seveda tudi z databindingom :) Hvala :)
V wrappanelu bi rad, da moj user control prikazuje podatke, ki so shranjeni v ObservableCollection<Predmetnik> seznam, ustvaril sem usercontrol, v main oknu v grid vstavil wrappanel.
Zadaj v kodi sem pa takle naredil:
private void wrappanel_Loaded(object sender, RoutedEventArgs e) { for (int i = 0; i < vmesnik.Seznam.Count; i++) { PrikazOcen prikaz = new PrikazOcen(); prikaz.textbox_ects.Text = vmesnik.Seznam.ElementAt(i).ECTS.ToString(); prikaz.textbox_ocena.Text = vmesnik.Seznam.ElementAt(i).Ocena.ToString(); prikaz.predmet.Text = vmesnik.Seznam.ElementAt(i).Predmet.ToString(); prikaz.profesor.Text = vmesnik.Seznam.ElementAt(i).Profesor.ToString(); wrappanel.Children.Add(prikaz); } }
v konstruktorju sem naredil dva objekta, ki bi se morala tekoj ob zagonu prikazat v wrap panelu vsak s svojimi podatki, ki se prikažejo kot sem definiral z usercontrolom, a se ne, prikaže samo enega.
Link do dropBox-a -> https://www.dropbox.com/s/dzp2t3h74mii3...
Če mi kdo lahko priporoča kako zadevo rešit, programsko in pa seveda tudi z databindingom :) Hvala :)
sebastjan28 ::
Čestitke!
Če bi rad izboljšal berljivost kode pa lahko poskušaš razmišlati v naslednji smeri
-Kakor si že sam omenil, bi ti binding prej olajšal življenje
-Za transparentno razmejitev med čisto GUI logiko in logiko, ki bi podpirala prikaz(kodo, ki jo imaš v Code-behing) lahko tudi razmišljaš v MVVM smeri(Obstajajo Frameworki, ki ti lahko precej olajšajo življenje).
-Glede na to, da imaš zelo predvidljivo strukturo podatkov, ki je shranjena v collectionu, bi jaz za prikaz definitivno uporabil ListBox ali pa celo DataGrid.
-Direktno dostopati do pod-objektov nekega objekta ni nikoli dobra ideja(še posebej ne do GUI gradnikov). V tem konkretnem primeru bi bilo precej bolje imeti v instanci prikaz
eno metodo tipa SetData(string ects, string ocena, string predmet, string profesor)
Če bi rad izboljšal berljivost kode pa lahko poskušaš razmišlati v naslednji smeri
-Kakor si že sam omenil, bi ti binding prej olajšal življenje
-Za transparentno razmejitev med čisto GUI logiko in logiko, ki bi podpirala prikaz(kodo, ki jo imaš v Code-behing) lahko tudi razmišljaš v MVVM smeri(Obstajajo Frameworki, ki ti lahko precej olajšajo življenje).
-Glede na to, da imaš zelo predvidljivo strukturo podatkov, ki je shranjena v collectionu, bi jaz za prikaz definitivno uporabil ListBox ali pa celo DataGrid.
-Direktno dostopati do pod-objektov nekega objekta ni nikoli dobra ideja(še posebej ne do GUI gradnikov). V tem konkretnem primeru bi bilo precej bolje imeti v instanci prikaz
eno metodo tipa SetData(string ects, string ocena, string predmet, string profesor)
hurlimannxt ::
Malo prehitro sem tukaj pisal glede težave, tukaj si lahko pogledaš moj zdaj končni izdelek, to je bila ideja, ki sem jo želel narediti :) če imaš čas bi te prosil za mnenje :) Dropbox -> https://www.dropbox.com/s/je0ea38nlg89z...
HVala za nasvete, to kar sem jaz delal je tudi neke vrste MVVM, ki sem ga sam preko tutorialov naredil.
-Si bom pogledal za začetek ->mvvm light.
-moj namen je bil, da ko ustvarim objekt, ga shranim v listo, in hkrati ga naj v wrap panelu prikaže. Poglej kodo kako sem jaz to naredil. Bi mi pa seveda boljše bilo preko bindinga, kot sem že delal.
Primer kode: ko sem oknu nastavil datacontext, in potem se lahko bindal, zadeva se sama osveži ob spremembah, če uporabljaš observable colletion ali bindinglist. Ampak v tem primeru pa nisem znal binding, ker uporabljam usercontrol, tukaj mi zadeva še ni jasna, ker je to sestavljen gradnik, in ni tako preprosto, kot sem spodaj v kodi naredil. Glede tega, da si napisal, da bi uporabil ListBox ali pa celo DataGrid, to je bi bilo lažje ja, skoraj isto kot spodaj koda, samo da je listbox.
Če mi lahko, mi razloži kako bi to nalogo popolnona z bindigom naredil :)
Pod direktno dostapanje me zanima, če to misliš na tale del kode -> ((MainWindow)System.Windows.Application.Current.MainWindow).wrap_main.Children.Add(prikaz); ali kaj druga?
HVala za nasvete, to kar sem jaz delal je tudi neke vrste MVVM, ki sem ga sam preko tutorialov naredil.
-Si bom pogledal za začetek ->mvvm light.
-moj namen je bil, da ko ustvarim objekt, ga shranim v listo, in hkrati ga naj v wrap panelu prikaže. Poglej kodo kako sem jaz to naredil. Bi mi pa seveda boljše bilo preko bindinga, kot sem že delal.
Primer kode: ko sem oknu nastavil datacontext, in potem se lahko bindal, zadeva se sama osveži ob spremembah, če uporabljaš observable colletion ali bindinglist. Ampak v tem primeru pa nisem znal binding, ker uporabljam usercontrol, tukaj mi zadeva še ni jasna, ker je to sestavljen gradnik, in ni tako preprosto, kot sem spodaj v kodi naredil. Glede tega, da si napisal, da bi uporabil ListBox ali pa celo DataGrid, to je bi bilo lažje ja, skoraj isto kot spodaj koda, samo da je listbox.
Če mi lahko, mi razloži kako bi to nalogo popolnona z bindigom naredil :)
Pod direktno dostapanje me zanima, če to misliš na tale del kode -> ((MainWindow)System.Windows.Application.Current.MainWindow).wrap_main.Children.Add(prikaz); ali kaj druga?
<ListView x:Name="list_view_posta" Grid.Column="1"> <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical" Cursor="Hand"> <Border BorderBrush="YellowGreen" CornerRadius="20" BorderThickness="10"> <StackPanel Orientation="Vertical" Margin="10"> <Label Height="30" Width="100" Content="Od Koga"/> <TextBlock Height="25" Width="100" Text="{Binding Posiljatelj}"/> <Label Height="30" Width="100" Content="Zadeva"/> <TextBlock Height="25" Width="100" Text="{Binding Zadeva}"/> </StackPanel> </Border> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
sebastjan28 ::
vzel sem si 1/2 ure in malo premetal del tvoje kodo. Sicer je daleč od končanega, vendar če boš nadaljeval v tej smeri, moraš samo slediti vzorcu.
MainWindow.xaml
2)
3. Prikaz_izpitov.xaml
MainWindow.xaml
<Window x:Class="UV_Kolokvij_2_Lokovsek_Final.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:UV_Kolokvij_2_Lokovsek_Final" Title="AIPS - Dnevnik Ocen" Height="600" Width="900" WindowStartupLocation="CenterScreen" MinWidth="300"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="30"/> <RowDefinition Height="295*"/> <RowDefinition Height="25"/> </Grid.RowDefinitions> <Menu Grid.Row="0" Background="MediumBlue" FontSize="18" FontWeight="Bold" Foreground="Black"> <MenuItem Header="Moznosti"> <MenuItem.Icon> <Image Source="ikone/Uv.ico"/> </MenuItem.Icon> <MenuItem x:Name="nova_vpis_ocene" Header="Nov Vpis" Click="nova_vpis_ocene_Click" > <MenuItem.Icon> <Image Source="ikone/Uv.ico"/> </MenuItem.Icon> </MenuItem> <MenuItem Header="Test _Object" Click="MenuItem_Click_1" > <MenuItem.Icon> <Image Source="ikone/xml1.ico"/> </MenuItem.Icon> </MenuItem> <MenuItem x:Name="izhod_main" Header="Izhod" Click="izhod_main_Click" > <MenuItem.Icon> <Image Source="ikone/Uv.ico"/> </MenuItem.Icon> </MenuItem> <MenuItem Header="Random Objekti" Click="MenuItem_Click_2" > <MenuItem.Icon> <Image Source="ikone/xml2.ico"/> </MenuItem.Icon> </MenuItem> <MenuItem Header="Osveži Pogled" Click="MenuItem_Click_3" > <MenuItem.Icon> <Image Source="ikone/xml2.ico"/> </MenuItem.Icon> </MenuItem> </MenuItem> <MenuItem Header="Serilizacija"> <MenuItem.Icon> <Image Source="ikone/xml1.ico"/> </MenuItem.Icon> <MenuItem Header="Serilizacija - Import" Name="uvoz_xml" Click="uvoz_xml_Click" > <MenuItem.Icon> <Image Source="ikone/xml1.ico"/> </MenuItem.Icon> </MenuItem> <MenuItem Header="Seriliazcija -Export" Name="izvoz_xml" Click="izvoz_xml_Click" > <MenuItem.Icon> <Image Source="ikone/xml2.ico"/> </MenuItem.Icon> </MenuItem> </MenuItem> </Menu> <ListBox ItemsSource="{Binding Seznam, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" ScrollViewer.HorizontalScrollBarVisibility="Disabled" > <ListBox.ItemsPanel> <ItemsPanelTemplate> <WrapPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemTemplate> <DataTemplate> <local:Prikaz_izpitov/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <Grid Grid.Row="2" Background="BurlyWood"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Label Grid.Column="0" /> <Label Grid.Column="1" /> <Label Grid.Column="2" /> <Label Grid.Column="3" /> <Label Grid.Column="4" /> </Grid> </Grid> </Window>
2)
using System; using System.Collections.Generic; using System.Linq; 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.Navigation; using System.Windows.Shapes; using System.Xml.Serialization; using System.Collections.ObjectModel; using System.IO; using System.ComponentModel; using System.Linq.Expressions; namespace UV_Kolokvij_2_Lokovsek_Final { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window, INotifyPropertyChanged { Vmesnik vmesnik; private ObservableCollection<Izpit> seznam; #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected void FirePropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } # endregion INotifyPropertyChanged public ObservableCollection<Izpit> Seznam { set { if (this.seznam != value) { this.seznam = value; this.FirePropertyChanged("Seznam"); } } get { return this.seznam; } } public MainWindow() { InitializeComponent(); this.DataContext = this; vmesnik = new Vmesnik(); this.Seznam = new ObservableCollection<Izpit>(); this.Seznam.Add(new Izpit() { Predmet = "p1", Ocena = 10, ECTS = 5, Profesor = "test prof" }); this.Seznam.Add(new Izpit() { Predmet = "p2", Ocena = 9, ECTS = 5, Profesor = "test prof 2" }); this.Seznam.Add(new Izpit() { Predmet = "p3", Ocena = 8, ECTS = 5, Profesor = "test prof 3" }); this.Seznam.Add(new Izpit() { Predmet = "p4", Ocena = 8, ECTS = 5, Profesor = "test prof 3" }); this.Seznam.Add(new Izpit() { Predmet = "p5", Ocena = 8, ECTS = 5, Profesor = "test prof 3" }); //for (int i = 0; i < vmesnik.Seznam.Count; i++) //{ // Prikaz_izpitov prikaz_main = new Prikaz_izpitov(); // prikaz_main.UC_ects.Content = vmesnik.Seznam.ElementAt(i).ECTS.ToString(); // prikaz_main.UC_ocena.Content = vmesnik.Seznam.ElementAt(i).Ocena.ToString(); // prikaz_main.UC_predmet.Content = vmesnik.Seznam.ElementAt(i).Predmet.ToString(); // prikaz_main.UC_profesor.Content = vmesnik.Seznam.ElementAt(i).Profesor.ToString(); // wrap_main.Children.Add(prikaz_main); //} } private void izhod_main_Click(object sender, RoutedEventArgs e) { if(MessageBox.Show("Zapiranje", "Close", MessageBoxButton.YesNo,MessageBoxImage.Question)==MessageBoxResult.Yes){ this.Close(); } } private void nova_vpis_ocene_Click(object sender, RoutedEventArgs e) { Vnos_Izpita izpit = new Vnos_Izpita(vmesnik); izpit.ShowDialog(); } private void MenuItem_Click_1(object sender, RoutedEventArgs e) { MessageBox.Show("Število Objektov v seznamu je: " + vmesnik.Seznam.Count.ToString()); } private void MenuItem_Click_2(object sender, RoutedEventArgs e) { Izpit random = new Izpit(); Random nakljucno = new Random(); int stevilo_generacije = 30; for (int i = 0; i < stevilo_generacije; i++) { random.ECTS = i + nakljucno.Next(); random.Ocena = nakljucno.Next(0, 10); random.Predmet = "Ni ZNANO"; random.Profesor = i + "Profesor"; vmesnik.Seznam.Add(random); } for (int i = 0; i < (stevilo_generacije+1); i++) { //Prikaz_izpitov prikaz_main = new Prikaz_izpitov(); //prikaz_main.UC_ects.Content = vmesnik.Seznam.ElementAt(i).ECTS.ToString(); //prikaz_main.UC_ocena.Content = vmesnik.Seznam.ElementAt(i).Ocena.ToString(); //prikaz_main.UC_predmet.Content = vmesnik.Seznam.ElementAt(i).Predmet.ToString(); //prikaz_main.UC_profesor.Content = vmesnik.Seznam.ElementAt(i).Profesor.ToString(); //wrap_main.Children.Add(prikaz_main); ////((MainWindow)System.Windows.Application.Current.MainWindow).wrap_main.Children.Add(prikaz_main); } } private void MenuItem_Click_3(object sender, RoutedEventArgs e) { //wrap_main.Children.Clear(); //for (int i = 0; i < vmesnik.Seznam.Count; i++) //{ // Prikaz_izpitov prikaz_main = new Prikaz_izpitov(); // prikaz_main.UC_ects.Content = vmesnik.Seznam.ElementAt(i).ECTS.ToString(); // prikaz_main.UC_ocena.Content = vmesnik.Seznam.ElementAt(i).Ocena.ToString(); // prikaz_main.UC_predmet.Content = vmesnik.Seznam.ElementAt(i).Predmet.ToString(); // prikaz_main.UC_profesor.Content = vmesnik.Seznam.ElementAt(i).Profesor.ToString(); // wrap_main.Children.Add(prikaz_main); //} } private void izvoz_xml_Click(object sender, RoutedEventArgs e) { XmlSerializer xml = new XmlSerializer(typeof(ObservableCollection<Izpit>)); StreamWriter pisanje = new StreamWriter("izpiti.xml"); xml.Serialize(pisanje, vmesnik.Seznam); MessageBox.Show("Izvoz je končan"); } private void uvoz_xml_Click(object sender, RoutedEventArgs e) { XmlSerializer xml = new XmlSerializer(typeof(ObservableCollection<Izpit>)); StreamReader branje = new StreamReader("izpiti.xml"); vmesnik.Seznam = (ObservableCollection<Izpit>)xml.Deserialize(branje); MessageBox.Show("Uvoz XML je izveden!" , "Objekti se bodo prikazali!"); for (int i = 0; i < vmesnik.Seznam.Count; i++) { Prikaz_izpitov prikaz_main = new Prikaz_izpitov(); prikaz_main.UC_ects.Content = vmesnik.Seznam.ElementAt(i).ECTS.ToString(); prikaz_main.UC_ocena.Content = vmesnik.Seznam.ElementAt(i).Ocena.ToString(); prikaz_main.UC_predmet.Content = vmesnik.Seznam.ElementAt(i).Predmet.ToString(); prikaz_main.UC_profesor.Content = vmesnik.Seznam.ElementAt(i).Profesor.ToString(); //wrap_main.Children.Add(prikaz_main); } } } }
3. Prikaz_izpitov.xaml
<UserControl x:Class="UV_Kolokvij_2_Lokovsek_Final.Prikaz_izpitov" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="200" d:DesignWidth="250"> <Border BorderBrush="BurlyWood" BorderThickness="5" CornerRadius="150,0,150,0"> <Grid> <Label Content="Predmet" Background="DarkCyan" Width="70" Height="25" Margin="132,10,38,155"/> <Label x:Name="UC_predmet" Content="{Binding Path=Predmet}" Height="25" Background="AliceBlue" Foreground="Black" FontWeight="Bold" Margin="82,40,38,125" Width="120"/> <Label Content="Ocena" Background="DarkCyan" Height="25" Width="70" Margin="50,70,120,95"/> <Label x:Name="UC_ocena" Height="25" Content="{Binding Path=Ocena}" Background="AliceBlue" Foreground="Black" FontWeight="Bold" Margin="136,70,63,95"/> <Label Content="ETCS Točke" Background="DarkCyan" Width="70" Height="25" Margin="97,100,73,65"/> <Label x:Name="UC_ects" Height="25" Content="{Binding Path=ECTS}" Background="AliceBlue" Width="30" Foreground="Black" FontWeight="Bold" Margin="172,100,38,65" RenderTransformOrigin="0.5,0.5"/> <Label Content="Profesor" Background="DarkCyan" Width="70" Height="25" Margin="26,130,144,35"/> <Label x:Name="UC_profesor" Height="25" Content="{Binding Path=Profesor}" Background="AliceBlue" Foreground="Black" FontWeight="Bold" Margin="10,160,131,5"/> </Grid> </Border> </UserControl>
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c#] LinkedList branje poljubnega elementaOddelek: Programiranje | 1565 (1474) | FrEaKmAn |
» | c# classOddelek: Programiranje | 2277 (1871) | japol |
» | Koda kalkulatorja v MS visual C# 2008?Oddelek: Programiranje | 3000 (2337) | smukC |
» | Kalkulator-problemOddelek: Programiranje | 1353 (1286) | Tutankhamun |
» | razložitev nekaterij elementov v visual studio 05Oddelek: Programiranje | 2120 (1925) | darkolord |