c# WPF Tworzenie przycisku w kodzie

0

Witam.
Mam problem z wyświetleniem w okienku przycisku, który tworzę bezpośrednio w kodzie c#.
Tak prezentuje się mój XAML:

<Window x:Class="warcaby.ROUND"
        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:warcaby"
        mc:Ignorable="d"
        Title="round" Height="550" Width="446">
    <Grid Margin="10,10,0,0" HorizontalAlignment="Left" Width="420" Height="556" VerticalAlignment="Top">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="750*"/>
            <ColumnDefinition Width="0*"/>
            <ColumnDefinition Width="0*"/>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TextBlock x:Name="p1_show_name_textbox" HorizontalAlignment="Left" Margin="0,414,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="40" Width="137" FontSize="24" RenderTransformOrigin="1.81,0.775"><Run FontSize="20" Text="TextBlock"/></TextBlock>
        <TextBlock x:Name="p2_show_name_textbox" HorizontalAlignment="Left" Margin="309,413,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" FontSize="20" Width="93" Height="27" RenderTransformOrigin="0.504,-0.741"/>
        <TextBlock HorizontalAlignment="Left" Margin="137,396,0,0" TextWrapping="Wrap" Text="Czas gry:" VerticalAlignment="Top" Height="56" Width="143" FontSize="36" RenderTransformOrigin="0.949,3.849"/>
        <TextBlock x:Name="timer_textBlock" HorizontalAlignment="Left" Margin="137,436,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="50" Width="143" FontSize="36"><Run Text="00:00:00"/></TextBlock>
        <TextBlock x:Name="countdown_textBlock_p1" HorizontalAlignment="Left" Margin="0,436,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="25" Width="76" FontSize="20" Text="00:00:00"/>
        <TextBlock x:Name="countdown_textBlock_p2" HorizontalAlignment="Left" Margin="309,436,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="25" Width="74" FontSize="20" RenderTransformOrigin="-1.646,0.639"><Run Text="00:00:00"/></TextBlock>
        <Button x:Name="bunus_test" Content="Button" HorizontalAlignment="Left" Margin="308,467,0,0" VerticalAlignment="Top" Width="99" RenderTransformOrigin="-1.413,-0.6" Height="29" Click="bunus_test_Click"/>
        <!--<Image HorizontalAlignment="Left" Width="421" Source="files/table.png" Grid.ColumnSpan="5" Margin="0,0,-1,151"/>-->


    </Grid>
</Window>

Jednak zaszła potrzeba tworzenia pewnych przycisków dynamicznie w zależności od sytuacji podczas działania programu. W związku z tym muszę generować określone przyciski nie w XAMLu a bezpośrednio w kodzie programu.
Stworzyłem nową klasę (i zarazem nowy plik) który za coś odpowiada.
W pliku tym planuję właśnie tworzenie przycisków. Początkowo chciałem to zrobić w taki sposób:

                Button button = new Button();
                button.Margin= new Thickness(150, 150, 150, 150);
                button.Content = "Button 2";
                button.Width = 300;
                button.Height = 400;
                Grid.Children.Add(button);

Skoro w XAMLu moja siatka nazywa się Grid to chciałem do niej się odwołać i właśnie na niej zamieścić mój przycisk, jednak kompilator krzyczał i przed powyższym kodem musiałem dodać takie coś:

Grid grid = new Grid();
.
.
.
grid.Children.Add(button);

Obecnie po uruchomieniu programu mam wszystkie przyciski zrobione w XAMLu, ale niestety nie widzę przycisku który stworzyłem bezpośrednio w kodzie. Rozumiem, że używając tej linijki

Grid grid = new Grid();

spowodowałem, że Grid z XAMLa i grid z kodu to dwie różne siatki i dla tego mój przycisk się nie pojawia w okienku. W jaki inny sposób mogę sprawić aby przycisk zrobiony w kodzie pojawił się już w istniejącym Gridzie wygenerowanym w XAMLu ?

0

Potrzebujesz nazwać sobie tego grida

 <Grid x:Name="myGrid" Margin="10,10,0,0" HorizontalAlignment="Left" Width="420" Height="556" VerticalAlignment="Top">

I wtedy odwołujesz się do niego

myGrid.Children.Add();
0

Dzięki ! Działa. Mam jeszcze jedno pytanie.
Całe okienko jest opisane poprzez dwa pliki:

  • round.xaml
  • round.xaml.cs
    Załóżmy, że mój przycisk ma być tworzony w zupełnie innej klasie, w innym pliku np. BUTTONS.cs
    Gdy wklejam tam kod z tworzeniem przycisku to dostaję komunikat:
The name 'grid' does not exist in the current context

Analizując tą linijkę

<Window x:Class="warcaby.ROUND"

łatwo można zobaczyć, że XAML powiązany jesty z klasą i plikiem ROUND. W jaki sposób powiązać jeszcze XAMLa dodatkowo z plikiem BUTTONS.cs ? Chciałem do powyższej linijki dopisać to po przecinku, ale tak się nie da.
Niestety nauka c# i wpf coś mi nie idzie :( a nie chcę mieć całego programu napisanego w jednym pliku.

0

Twój obiekt grida nie istnieje w pliku buttons.cs. Stwórz obiekt przycisku w buttons.cs i zwróć go

public Button TworzenieButtona()
{
    Button btn = new Button();
    btn.Text = "Mój knefel";

    return btn;
}

I tam gdzie jest twój grid przypisujesz btn

myGrid.Children.Add(buttons.TworzenieButtona());

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