WPF 将按钮从 StackPanel 移动到网格单元不起作用

问题描述

我有一个网格(2x2)和网格内的按钮。 我想以编程方式将 Button 从单元格 (0,0) 移动到单元格 (0,1)。

A:有效(以编程方式) 将 Button 从一个网格单元格移动到另一个网格单元格。

B:不起作用(以编程方式) 将 StackPanel 内的 Button 移动到网格单元。

C:有效(以编程方式) 将整个 StackPanel(带有里面的 Button)移动到另一个网格单元

我能做什么?

<Window x:Class="CovidGamePrototype.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"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Grid.RowDeFinitions>
        <RowDeFinition Height="1*" />
        <RowDeFinition Height="1*" />
    </Grid.RowDeFinitions>
    <Grid.ColumnDeFinitions>
        <ColumnDeFinition Width="1*" />
        <ColumnDeFinition Width="1*" />
    </Grid.ColumnDeFinitions>

    <StackPanel  Name="stackPanel" Grid.Column="0" Grid.Row="0" Orientation="Vertical">
        <Button Name="btnTopLeft1"  Content="I am TopLeft 1" Height="Auto" />
        <Button Name="btnTopLeft2"  Content="I am TopLeft 2" Height="Auto" />
    </StackPanel>

    <Button Name="btnBottomLeft" Grid.Column="0" Grid.Row="1" Width="Auto" Content="I am BottomLeft" />
    <Button Name="btnTopRight" Grid.Column="1" Grid.Row="0" Content="I am TopRight" />
    <Button Name="btnBottomright" Grid.Column="1" Grid.Row="1" Content="I am Bottomright"/>

</Grid>
 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // does NOT work (move from left to right)
        // this Button is inside of a StackPanel
        Grid.SetColumn(btnTopLeft1,1);
        Grid.SetZIndex(btnTopLeft1,5);

        // works (move from left to right)
        Grid.SetColumn(btnBottomLeft,1);
        Grid.SetZIndex(btnBottomLeft,5);

        // works (move from left to right)
        // Grid.SetColumn(stackPanel,1);
        // Grid.SetZIndex(stackPanel,5);
    }
}

解决方法

Button 中删除 StackPanel 并将 Button 插入到 StackPanel 的父级中,在您的情况下是 Grid

stackPanel.Children.Remove(btnTopLeft1);
var grid = (stackPanel.Parent as Grid);
grid?.Children.Add(btnTopLeft1);

Grid.SetColumn(btnTopLeft1,1);
Grid.SetZIndex(btnTopLeft1,5);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...