如何为c#中的按钮指定新位置?

时间:2016-12-13 17:54:12

标签: c# xaml button uwp

private void Hangman_OnLoaded()
{
    const int btnSize = 25;
    for (var i = 65; i <= 90; i++)
    {
        var btn = new Button { Content = (char)i };
        btn.Width = btn.Height = btnSize;
        var margin = btn.Margin;
        margin.Left += btnSize + 100;
        btn.Margin = margin;
        GridMain.Children.Add(btn);
    }
}

所以,我有这个代码块,我想用 ASCII 创建字母。我有一个名为 GridMain 的网格。我想显示 A-Z 。当我调试时,我看到按钮是在一个嵌套中创建的。我应该用什么来显示这些字母彼此相邻?

2 个答案:

答案 0 :(得分:3)

由于这些是按钮,具有单个字符(至少根据您的问题),项目的大小将始终相同。所以我建议你使用GridView和DataTemplate将ASCII字符作为按钮加载。

将您的Hangman_OnLoaded更改为以下。

private void Hangman_OnLoaded()
{
    List<char> bindingData = new List<char>();
    for (var i = 65; i <= 90; i++)
    {
        bindingData.Add((char)i);
    }
    variableGrid.DataContext = bindingData;
}

下面是你的GridView。

<GridView x:Name="variableGrid" ItemsSource="{Binding }">
    <GridView.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding ''}" />
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

答案 1 :(得分:0)

如果你因为通常的原因坚持在代码中做所有事情,那就更像是这样:

var GridMain = new System.Windows.Controls.Primitives.UniformGrid
{
    Name = "GridMain",
    Rows = 10,
    Columns = 10
};

如果由于某种原因您真的想使用Grid,则需要在Grid中定义行和列,并在每个Button上设置行和列值。

XAML

<Grid x:Name="GridMain">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <!--  etc. however many rows -->
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <!--  etc. however many columns -->
    </Grid.ColumnDefinitions>
</Grid>

C#:

//  Row zero, column zero
Grid.SetRow(btn, 0);
Grid.SetColumn(btn, 0);

如果这是WPF(事实并非如此,但是某些人可能会在某天点击这一点),那么您最好,最简单的解决方案是使用UniformGrid代替常规Grid,并设置正确的行数和列数:

<UniformGrid x:Name="GridMain" Rows="10" Columns="10">
</UniformGrid>
在您的情况下,对于UniformGrid

VariableSizedWrapGrid might be an acceptable UWP substitute,但我在这里使用Win7并且无法测试它。