Powstawanie nowych button'ów po wciśnięciu jednego.

0

Zacząłem robić prosty program na informatykę. Z założenia miał być to konsolowy program w Turbo Pascalu do karaoke. Kombinowałem z wave'ami do tp, nie wychodziło mi. Stwierdziłem, że zrobię w c++. Pobrałem VS, widzę domyślnie C#. Popatrzyłem, popatrzyłem i znalazłem tutaj WPF - coś idealnego dla mnie, prosto i szybko, kilka przycisków, nie ma jakiegoś WinAPI, nie ma problemów. Robię na razie na luźno, poprawiać będę na końcu. Zrobiłem sobie piękny button Start i textblock'a. Chciałbym, żeby po wciśnięciu Start zniknęły dotychczasowe kontrolki i żebym mógł dodać sobie kolejne. Jak uzyskać taki efekt?

Do tej pory mam w xaml'u tak:

<Window x:Class="Karaoke.MainWindow"
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:Karaoke"
mc:Ignorable="d"
Title="KaraokeGóró v0.001 by Darke" Height="350" Width="525">
<Grid>
<Button x:Name="start" Content="Start" Margin="149,222,149,52" Click="start_Click" />
<TextBlock x:Name="textBlock" Margin="185,96,185,202" TextWrapping="Wrap" Text="Aby rozpocząć, naciśnij Start"/>
</Grid>
</Window>

w .cs na razie mam tylko domyślne linijki po utworzeniu projektu oraz

private void start_Click(object sender, RoutedEventArgs e)
{

    }

Jak się domyślacie nie mam bladego pojęcia, co wpisać między nawiasy ani co trzeba dopisać do xaml'a.

0

Ogólnie button i textblock możesz opakować w stackpanel :

        <StackPanel Name="SPStart" Orientation="Vertical" HorizontalAlignment="Center">
            <Button Name="BtnStart" Content="start" Height="50" Width="100"/>
            <TextBlock Text="Aby rozpocząć naciśnij start"/>
        </StackPanel>

Jeżeli masz określoną liczbę kontrolek to możesz utworzyć następny stackpanel i operować właściwością visibility. Jeżeli nie to tworzysz dynamicznie : http://stackoverflow.com/a/16329643

0

Nadal niezbyt rozumiem heh. Z tego co ogarnąłem to pakuję to button i textblock w stackpanel, ustawiam w .cs SPStart visibility i potem daję to z linku, żeby zrobić kolejne kontrolki, a potem znów visibility i kolejne rzeczy. Nie mogę jednak dojść jak tego visibility użyć, to z linku też niewiele mi mówi. Jakbyś mógł mi to wytłumaczyć poprzez opisanie co, w którym miejscu się wpisuje oraz co to robi byłym bardzo wdzięczny. Oczywiście do tego, co mi potrzebne. Nie czuję tych klas i tak dalej, tutoriale też mi nic nie mówią.

1

No niech Ci będzie :)
Przy założeniu, że wiesz ile buttonów chcesz mieć będzie to wyglądać przykładowo tak :

<StackPanel Name="SPStart" Orientation="Vertical" HorizontalAlignment="Center">
     <Button Name="BtnStart" Content="start" Height="50" Width="100"/>
     <TextBlock Text="Aby rozpocząć naciśnij start"/>
</StackPanel>
<StackPanel Name="SPBtns" Visibility="Hidden"  Orientation="Vertical" HorizontalAlignment="Center">
      <Button Content="Btn1" Height="50" Width="100"/>
      <Button Content="Btn2" Height="50" Width="100"/>
      <Button Content="Btn3" Height="50" Width="100"/>
</StackPanel>

W zdarzeniu Click wstawiasz przykładowo ten kod :

if (SPBtns.Visibility == System.Windows.Visibility.Hidden)
{
    SPStart.Visibility = System.Windows.Visibility.Hidden;
    SPBtns.Visibility = System.Windows.Visibility.Visible;
}
0

Dzięki wielkie za pomoc. Nie chciały mi dwa stackpanele działać (Obiekt „Window” ma już element podrzędny i nie można dodać elementu „StackPanel”) nie chciało mi się w tym dłubać więc poszedłem na skróty i wpakowałem to wszystko, co dotychczas sobie wymyśliłem w grida. Może to nie najlepsze rozwiąznie, ale działa :D

Poniżej zamieszczam efekt z nadzieją, że może komuś się przyda.

using System.Windows;

namespace Karaoke
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void zamknij_Click(object sender, RoutedEventArgs e)
        {
            System.Diagnostics.Process.GetCurrentProcess().Kill();
        }

        private void start_Click(object sender, RoutedEventArgs e)
        {
            if (start.Visibility == System.Windows.Visibility.Visible)
            {
                Informacja.Visibility = System.Windows.Visibility.Hidden;
                start.Visibility = System.Windows.Visibility.Hidden;
                zamknij.Visibility = System.Windows.Visibility.Hidden;
                ListaTytulow.Visibility = System.Windows.Visibility.Visible;
            }
        }
    }
}

natomiast w xaml'u zrobiłem analogicznie, jak Ty z stackpanelem

 
<window 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:WpfApplication1"
x:class="Karaoke.MainWindow"
mc:ignorable="d"
title="KaraokeGóró v0.001 by Darke" height="350" width="525">
    <grid>
        <textblock x:name="Informacja" margin="172,155,172,115" textwrapping="Wrap"><run text="Aby zamknąć, naciśnij Zamknij." /></textblock>
        <button x:name="start" content="Start" margin="149,222,149,52" click="start_Click" />
        <button x:name="zamknij" content="Zamknij" margin="206,276,206,16" click="zamknij_Click" />
        <listbox x:name="ListaTytulow" Visibility=" hidden"="Hidden&quot;" horizontalalignment="Left" height="100" verticalalignment="Top" width="100" />

    </grid>
</window>

Oczywiście listbox jest do zrobienia jak i dalsze elementy, ale to już nie na temat.
Mało to efektowne i z kolejnymi kontrolkami będzie coraz więcej kodu, ale działa szybko i sprawnie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1