编辑: 我尝试过
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%
}
}
}
红色正方形位于Xaml中的Border.Grid.Row =“ 0”和Border.Grid.Column =“ 0”中,但我也不知道如何访问。 很长一段时间以来,我一直以为是我不得不惹的是Grid.RowProperty或Grid.ColumnProperty,但是它们是只读的。
我对编程很陌生,对WPF真的很陌生,所以这可能是一个愚蠢的问题,而不是试图触发任何人。
谢谢您的时间。
答案 0 :(得分:0)
我认为您最好使用画布而不是网格。然后,可以通过对canvas.left和canvas.top进行动画处理,轻松地将红色方块从任何位置平滑地动画化为另一个位置。
您可以将控件彼此叠加,以便使“放置”在其上的画布可以位于项目控件的顶部。给出一个wrappanel作为itemspanel,它将包装您将内容模板化的内容从一行到另一行。 将cellVM的集合(每个单元格的视图模型)绑定到itemscontrol的itemssource。然后使用itemtemplate将每个模板变成迷宫的一个单元。这可能就像一个矩形一样简单,矩形是一种颜色,表示封闭,另一种颜色表示开放。 每个单元格的轮廓可能带有边框,或者您可以覆盖网格图像。 您也可以使用writeablebitmap为迷宫背景构建图像,但如果您的需求很简单,则itemscontrol模板相对容易。
答案 1 :(得分:0)
基本上,您的问题是“如何在后面的代码中设置附加属性?”。 附加属性通常是由赋予其某些角色的控件所定义的属性,但是通常此属性是在其他类型的控件上设置的。在您的情况下,网格使用列和行属性来布置子元素。
设置此属性非常简单。您只需像这样关联所有的setter函数即可:
Grid.SetColumn(Cell, 1);
但是,正如Andy提到的使用Grid并不是最佳选择。