» »

[C#] WPF vprašanja

[C#] WPF vprašanja

Ciklamen ::

OK fantje tako je na stvari, tu bom eventuelno vprašal kaj kar ne znam sam, zatorej bom šel kar od začetka:

Imam image (navaden icon) ki bi ga rad zalepil na button. Vse lepo in prav, v preview so slike lepo "nalepljene" na gumbih, v buildu pa jih ni - kaj mislim s tem:

 Levo preview, desno build

Levo preview, desno build



Probal sem že v app.config spremenit build action & Copy to output na resource in copy always, probal sem v resources.resx spremenit isto, brez uspeha.

                        <Button Name="DeleteButton" Grid.ColumnSpan="2" Width="50" Click="DeleteButton_Click">
                            <Image x:Name="deleteImage" Source="/Explorer;component/Resources/Images/delete.png"></Image>
                        </Button>


takle imam gumb v xaml, nimam pa pojma kaj naj še spremenim da bo zadeva vidna.
- End of the Post ->

cekr ::

Program ne vidi image.
Za Image določi BuildAction=Resource
Sinclair ZX Spectrum [Zilog Z80A - 3.5 MHz, 48kB, dvojni kasetofon,
TV-OUT, radirke, Sinclair-Basic], Sinclair ZX-81 [Z80A, 3.25MHZ, 1kB]

Ciklamen ::

Ekola mi je ratalo.

Kaj sem nardil?

Project name -> Properties -> Resources -> Add resource (drop down) -> Add existing file -> dodaj ikone -> v Solution Explorerju potem poiščeš img-e in nastaviš build action na Resource in voila, zadeva deluje (to pišem zato, da če bo kdo imel kakšne težave lahko pogleda sem :D)
- End of the Post ->

cekr ::

Možno je, da nastaviš tudi, da se slike prekopirajo. Samo potem ne dobiš samo *.exe.
Slike morajo biti v exe in nimaš problemov.
Sicer se boš pa znašel še pri mnogo takšnih problemih.

Pa še:
če ti je ciljni sistem Win10 potem namesto WPF, raje vzemi UWP.
Sinclair ZX Spectrum [Zilog Z80A - 3.5 MHz, 48kB, dvojni kasetofon,
TV-OUT, radirke, Sinclair-Basic], Sinclair ZX-81 [Z80A, 3.25MHZ, 1kB]

Zgodovina sprememb…

  • spremenilo: cekr ()

Isotropic ::

a ni UWP dost bolj omejen po temu, kar lahko dela aplikacija?

cekr ::

Samo način komunikacije navzven moraš uredit še z dodatnim servisom (WCF, WEBapi). Kar ni neka huda raketna znanost.
Drugače imaš sedaj že precej večjo podporo kot za WPF.
Na začetku WPF-a je bilo kar precej problemov, kje dobiti gradnike. To se je kasneje uredilo.
UWP pa sedaj teh problemov nima, ker je kar precej odprt.
Sinclair ZX Spectrum [Zilog Z80A - 3.5 MHz, 48kB, dvojni kasetofon,
TV-OUT, radirke, Sinclair-Basic], Sinclair ZX-81 [Z80A, 3.25MHZ, 1kB]

Ciklamen ::

 [XmlRootAttribute("Disks", IsNullable = false)]
    public class DiskList
    {
        public Disk[] diskList;
    }
    public class Disk
    {
        public string DiskName;
        [XmlArrayAttribute("Folders")]
        public Folders[] folders;
    }

    public class Folders
    {
        [XmlElementAttribute]
        public string FolderName;
        public int FolderNumber;
        //[XmlElementAttribute(IsNullable = true)]
        public int ParentNumber;
        [XmlArrayAttribute("Files")]
        public FileInfo[] files;
    }
    public class FileInfo
    {
        public string Name;
        public string Extension;
        public string Size;
        public string Created;
        public string Changed;
    }


Se pravi imam nek data structure (xml serializacija), v katerem bodo shranjeni diski, folderji, fajli. Folderji lahko imajo folderje. Nisem čisto prepričan, če je ta moj data struct pravilen, ker ko poizkušam napolnit imam težave s polji znotraj classov, serializacija mi povzroča še malo težave, nisem čisto "utečen" še.

ParentNumber naj bi predstavljal številko "očeta" oziroma nivoja nad trenutnim folderjem.
- End of the Post ->

Stari89 ::

Namesto arrayev bi jaz raje uporabljal List.

Namesto:
public Disk[] diskList;

... raje recimo:
public List<Disk> DiskList;

Če XmlSerializer pri deserializaciji ne ustvari novega seznama, ampak samo dodaja nove elemente (na DiskList), raje zapiši takole:
public readonly List<Disk> DiskList= new List<Disk>();

Katere class in property atribute moraš uporabit za XML serializacijo, pa me ne sprašuj, ker ne vem. :D
LP

Zgodovina sprememb…

  • spremenilo: Stari89 ()

Ciklamen ::

Sem sprva naredil List, pa sem imel neke probleme in sem kasneje zadevo opustil. Bom se poigral z zadevo, da vidim kaj lahko storim.

Načeloma mi je šlo tudi tako kot sem imel sedaj, vendar mi nekatere zadeve izpisuje dvakrat in malo narobe.

Če naredim z list-i dobim pa error: System.NullReferenceException "Object reference not set to an instance of an object.

            XmlSerializer serializer = new XmlSerializer(typeof(DiskList));
            TextWriter writer = new StreamWriter("xmlfile1.xml");

            DiskList d = new DiskList();
            Disk disk = new Disk();

            disk.DiskName = "C:";
            Folders f = new Folders();
            f.FolderName = "TestFolder1";
            f.FolderNumber = 1;
            FileInfo file = new FileInfo();
            file.Name = "testFile1";
            file.Size = "534";
            file.Extension = ".txt";
            file.Created = DateTime.Now.ToString();
            file.Changed = DateTime.Now.ToString();
            f.files.Add(file);
            file.Name = "testFile2";
            file.Size = "2322";
            file.Extension = ".pdf";
            file.Created = DateTime.Now.ToString();
            file.Changed = DateTime.Now.ToString();
            f.files.Add(file);
            disk.folders.Add(f);
            d.diskList.Add(disk);
            serializer.Serialize(writer, d);
            writer.Close();


To je nek testni scenarij, pri f.files.Add(file) se zatakne, domnevam da moram ustvarit nov List ki pa ga v mojem primeru ne?

EDIT: Ja, res je da sem moral ustvarit nov List
- End of the Post ->

Zgodovina sprememb…

  • spremenil: Ciklamen ()

Stari89 ::

Gud job.
Morda ti bo taka sintaksa bolj všeč, morda ne:
XmlSerializer serializer = new XmlSerializer(typeof(DiskList));
TextWriter writer = new StreamWriter("xmlfile1.xml");

DiskList d = new DiskList();
Disk disk = new Disk() { Name = "C:" };

Folders f = new Folders()
{
    FolderName = "TestFolder1",
    FolderNumber = 1
};

FileInfo file = new FileInfo()
{
    Name = "testFile1",
    Size = "534",
    Extension = ".txt",
    Created = DateTime.Now.ToString(CultureInfo.InvariantCulture), // CultureInfo.InvariantCulture razloženo spodaj
    Changed = DateTime.Now.ToString(CultureInfo.InvariantCulture)
};
f.files.Add(file);

file = new FileInfo()
{
    Name = "testFile2",
    Size = "2322",
    Extension = ".pdf",
    Created = DateTime.Now.ToString(CultureInfo.InvariantCulture),
    Changed = DateTime.Now.ToString(CultureInfo.InvariantCulture)
};
f.files.Add(file);

disk.folders.Add(f);
d.diskList.Add(disk);
serializer.Serialize(writer, d);
writer.Close();



DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture);

Tale invariant culture je not samo zato, da dobiš na vseh lokalizacijah enak datum. V kaki arabščini te zna zjebat. Nič nujnega za tvoj primer, samo free tip. ;)

Ciklamen ::

Mja, to sem samo nardil nek test scenarij da si ustvarim xml fajl, tega načeloma tak ne rabim :D ampak hvala, vsak nasvet je zlata vreden! :)

Bolj kot to me sedaj muči deserializacija tega v treeview in listview. Vem da moram uporabit Binding, ampak tega še zaenkrat ne razumem najbolje. (hierarchicaldatatemplate, kjer je binding nastavljen na class-e Disk, Folder)

<TreeView x:Name="treeView" HorizontalAlignment="Stretch" Margin="5,5,5,0" Grid.Row="3" VerticalAlignment="Stretch" Grid.RowSpan="1">
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Items}">
                <StackPanel Orientation="Horizontal">
                    <Image x:Name="iconImage" Width="15" Height="15" Margin="0,0,0,0" Stretch="Fill" Source="/Explorer;component/Resources/Images/drive.png"></Image>
                    <TextBlock Text="{Binding}" Margin="5,0"></TextBlock>
                </StackPanel>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Disk}">
                <StackPanel>
                    <Image x:Name="iconImage" Width="15" Height="15" Margin="0,0,0,0" Stretch="Fill" Source="/Explorer;component/Resources/Images/folder.png"></Image>
                    <TextBlock Text="{Binding}" Margin="5,0"></TextBlock>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView>


Ko hočem naredit še DataType ga ne znam za moj primer ustvarit, vse kar pa sedaj dobim je pa v Treeview izpisan Explorer.Disk

 Content ki ga dobim iz deserializerja

Content ki ga dobim iz deserializerja

- End of the Post ->


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

UserControl v Wrappanelu WPF

Oddelek: Programiranje
51140 (962) hurlimannxt
»

C# in DateTime

Oddelek: Programiranje
101346 (1166) FiDeK
»

[C#] Xml Serializacija Attribut pred Namespace

Oddelek: Programiranje
9951 (837) Looooooka
»

VC# Zapis podatkov na disk

Oddelek: Programiranje
422493 (1749) matej_jack
»

[Visual C#] posodabljanje polja

Oddelek: Programiranje
111641 (1461) iggy1

Več podobnih tem