Pozycjonowanie kontrolek generowanych automatycznie

0

Witam,

Próbuje utworzyć aplikację WPF przy użyciu technologii C# i .net6
utknąłem w miejscu w którym już mam wygenerowane automatycznie kontrolki i próbuje nimi wypełnić grid

 <DockPanel Grid.Column="1"  Margin="5"   >

     <!--<StackPanel Name="controlsStackPanel" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />-->
     <Grid Grid.Column="1" Name="controlsGrid" Width="526" Height="342" />


     <Grid Grid.Column="1" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Bottom">
         <Button Content="Generuj" Margin="10" Click="GenerateButton_Click" x:Name="GenerateButton"/>
     </Grid>
 </DockPanel>

w kodzie behind w metodzie generującej mam wymuszone ustawienie wartości x i y jako odległości jakie mają zachować kontrolki pozycjonując się na gridzie

controlData.Control.Margin = new Thickness(controlType.X ?? 0, controlType.Y ?? 0, 0, 0);
controlData.Control.Width = controlType.Width ?? Double.NaN;
controlData.Control.Height = controlType.Height ?? Double.NaN;

którego zadaniem jest wymuszenie żeby kontroli pozycjonowały się na gridzie zgodnie z właściwością Margin (pozwoli mi to na ustawiani ich z bazy danych bez konieczności restartowania użytkownikom aplikacji, jeśli będą potrzebne zmiany)

jednka w takim przykładzie kontrolki wysypują mi się jedna na drugą i wypełniają wskazany grid w całości
sprawdzałem na debug, że pole Margin w kontrolkach jest wypełniony prawidłowo zgodnie z oczekiwaniem screenshot-20231026115049.png

natomiast w Stackpanel, Canvas lub WrapPanel wielkość kontrolek jest ok ale ustawiają się domyślnie w pionie lub poziomie nie reagując na właściwość margin jaką im przekazuję.
screenshot-20231026115818.png
Jestem dość zmieszany bo to moja pierwsza aplikacja w WPF.

Z góry dziękuję za pomoc.

0

W gridzie pozycjonujesz kontrolki tworząc siatkę za pomocą Grid.ColumnDefinitions oraz Grid.RowsDefinitions a następnie przypisujesz kontrolki do odpowiednich pól za pomocą attached property Grid.Row oraz Grid.Column z alternatywnym dodatkiem w postaci ColumnSpan oraz RowSpan jeśli dana kontrolka ma zajmować kilka pól

Ponieważ nic nie zdefiniowałeś to masz jedną komórek a ponieważ kontrolkom nie przypisujesz ani Row ani Column to wszystkie mają domyślą wartość 0 i lądują w tej samej domyślnej.

Przykładowy kod użycia Grida

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="20"></RowDefinition>
    </Grid.RowDefinitions>
    <Button Grid.Row="1" Grid.Column="2"></Button>
</Grid>
0
PawelLukasik napisał(a):

W gridzie pozycjonujesz kontrolki tworząc siatkę za pomocą Grid.ColumnDefinitions oraz Grid.RowsDefinitions a następnie przypisujesz kontrolki do odpowiednich pól za pomocą attached property Grid.Row oraz Grid.Column z alternatywnym dodatkiem w postaci ColumnSpan oraz RowSpan jeśli dana kontrolka ma zajmować kilka pól

Ponieważ nic nie zdefiniowałeś to masz jedną komórek a ponieważ kontrolkom nie przypisujesz ani Row ani Column to wszystkie mają domyślą wartość 0 i lądują w tej samej domyślnej.

Przykładowy kod użycia Grida

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="20"></RowDefinition>
    </Grid.RowDefinitions>
    <Button Grid.Row="1" Grid.Column="2"></Button>
</Grid>

Dzięki za odpowiedź,
Czy jest inny sposób (poza gridem) żeby kontrolki bardziej elastycznie ustawiać po zdefiniowanych koordynatach x i y ?

1
MiltonD napisał(a):

Dzięki za odpowiedź,
Czy jest inny sposób (poza gridem) żeby kontrolki bardziej elastycznie ustawiać po zdefiniowanych koordynatach x i y ?

Na to pozwala kontener Canvas i pozycjonowanie za pomocą attached properties Canvas.Left/Top/Right/Bottom.

<Canvas>
    <Button Content="Click Me!" Canvas.Left="200" Canvas.Top="20"></Button>
</Canvas>

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