Генератор случайных лабиринтов в WPF - PullRequest
0 голосов
/ 07 декабря 2018

РЕДАКТИРОВАТЬ: я пытался

Background.SetValue(Grid.RowProperty, 1)

и

Border.Background.SetValue(Grid.RowProperty, 1)

, но получил сообщение об ошибке "Не удается установить свойство для объекта" #FFFFFFFFF ", потому что он доступен только для чтениясостояние. "


Я пытаюсь сделать генератор случайных лабиринтов в WPF.До сих пор я сделал стартовую страницу и кнопку «Пуск», где, когда вы нажимаете кнопку «Пуск», она ведет вас в лабиринт, где я хочу, чтобы он сам начал генерировать.

https://i.imgur.com/gPu0rOA.png

Я смотрел учебные пособия и т. Д. О том, как это должно быть настроено, и всей теории, лежащей в основе.

Прямо сейчас я застрял с проблемой.Я хочу, чтобы красный квадрат переместился либо в поле справа, либо под ним, а затем закрасил предыдущее поле другим цветом, чтобы красный квадрат был ячейкой, генерирующей лабиринт, а предыдущие - самим лабиринтом.Но я не могу получить разрешение на изменение позиции красного квадрата в программном коде, поскольку он доступен только для чтения.Но мне это нужно, потому что я хочу использовать петли и т. Д.

    <Grid>
    <Rectangle Fill="Black" HorizontalAlignment="Left" Height="356" Margin="10,10,0,0" Stroke="Black" VerticalAlignment="Top" Width="772"/>
    <Button x:Name="Button1" Content="Start" HorizontalAlignment="Left" Margin="357,380,0,0" VerticalAlignment="Top" Width="74" Click="Button1_Click_1"/>
    <TextBlock x:Name="Title1" HorizontalAlignment="Center" TextWrapping="Wrap" VerticalAlignment="Top" Height="70" Width="654" Margin="70,71,68,0" Foreground="White" FontSize="60" FontFamily="Impact" FrameworkElement.FlowDirection="LeftToRight" TextAlignment="Center">
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="Title1" Storyboard.TargetProperty="(FrameworkElement.Height)" To="0.0" Duration="00:00:02" DecelerationRatio="0" AutoReverse="True" BeginTime="00:00:02" RepeatBehavior="Forever" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBlock.Triggers><Run Text="Random Maze Generator">
            <Run.Background>
                <ImageBrush/>
            </Run.Background>
        </Run></TextBlock>
    <TextBlock x:Name="Title2" HorizontalAlignment="Left" Margin="246,254,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="54" Width="298" Foreground="White" FontSize="30" Text="Press Start to continue"/>
    <Grid Name="GridLines" ShowGridLines="False" Width="772" Height="356" Margin="10,10,10,53">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Border Name="Cell" Grid.Row="0" Grid.Column="0" Background="Red" Opacity="0" Visibility="Visible"/>
        <StackPanel Name="Stack"  Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left"></StackPanel>
    </Grid>
</Grid>

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

    double columns = 16;
    int rows = 8;
    double square_width;
    double square_height;
    double square_area;
    int current_cell;
    int visited_cell;

    private void Button1_Click_1(object sender, RoutedEventArgs e) //After the Start button is pressed
    {
        Title1.Text = String.Empty; //Hide text for Title1
        Title2.Text = String.Empty; //Hide text for Title2

        GridLines.ShowGridLines = true; //Changes the value for GridLines from false to true
        Cell.Opacity = 100; //Changes the cell opacity from 0% to 100%

    }
}

}

Красный квадрат находится в Border.Grid.Row = "0 "и Border.Grid.Column =" 0 "в Xaml, но я не знаю, как получить доступ либо.Я долго думал, что это Grid.RowProperty или Grid.ColumnProperty, с которым мне пришлось связываться, но это только для чтения.

Я довольно новичок в программировании и ДЕЙСТВИТЕЛЬНО новичок в WPF, так что это можетбудь глупым вопросом, не пытаясь никого вызвать.

Спасибо за потраченное время.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

По сути, ваш вопрос «Как установить вложенное свойство в коде позади?».Присоединенное свойство - это, как правило, свойство, которое определяется элементом управления и наделяет его определенной ролью, но обычно это свойства устанавливаются для элементов управления других типов.В вашем случае свойства Column и Row используются сеткой для размещения дочерних элементов.

Установка этих свойств довольно проста.Вы просто используете все связанные функции сеттера следующим образом:

Grid.SetColumn(Cell, 1);

Однако, как упомянул Энди, использование Grid - не лучший вариант.

0 голосов
/ 07 декабря 2018

Я думаю, вам лучше использовать холст, а не сетку.Затем вы можете легко анимировать свой красный квадрат из любой позиции в другую плавно, анимируя canvas.left и canvas.top.

Вы можете накладывать элементы управления друг на друга, так что холст, на котором находится эта часть, может бытьна вершине контроля предметов.Дайте этому обертку как панель элементов, и она будет оборачиваться вокруг того, во что вы помещаете содержимое шаблона из одного ряда в другой.Свяжите коллекцию cellVM (модель представления для каждой ячейки) с источником элементов вашего элемента управления.Затем используйте шаблон элемента, чтобы превратить каждый в клетку вашего лабиринта.Это может быть так же просто, как прямоугольник, который имеет один цвет для закрытых и другой для открытого.Это может иметь границы для контура каждой ячейки, или вы можете наложить на изображение, которое является сеткой.В качестве альтернативы вы можете создать изображение, используя writeablebitmap для вашего фона лабиринта, но шаблон управления элементами относительно прост, если ваше требование простое.

...