【问题标题】:How to give a new location to a button in c#?如何为c#中的按钮提供新位置?
【发布时间】:2016-12-13 17:54:11
【问题描述】:
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。当我调试时,我看到按钮是在一个嵌套中创建的。我应该使用什么来将这些字母并排显示?

【问题讨论】:

    标签: c# xaml button uwp


    【解决方案1】:

    由于这些是具有单个字符的按钮(至少基于您的问题),因此项目的大小将始终相同。所以我建议你使用 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>
    

    【讨论】:

      【解决方案2】:

      如果您出于通常的原因坚持在代码后面做所有事情,那看起来更像这样:

      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(不是,但也许某天做 WPF 的人会点击它),您最好、最简单的解决方案是使用 UniformGrid 而不是常规的 Grid,并设置正确的数量上面的行和列:

      <UniformGrid x:Name="GridMain" Rows="10" Columns="10">
      </UniformGrid>
      

      VariableSizedWrapGrid might be an acceptable UWP substitute for UniformGrid 在您的情况下,但我在这里使用的是 Win7,无法对其进行测试。

      【讨论】:

      • 您好!感谢您的快速答复!实际上它是 UWP,我认为它也适用于 UWP?
      • @M.Kesküll 您必须指定您使用的 UI 框架。否则这个问题是完全无法回答的。也许VariableSizedWrapGrid 会和UniformGrid 做同样的工作。我认为具有显式ColumnDefinitionsRowDefinitionsGrid 解决方案应该可以在UWP 中使用。试一试。
      猜你喜欢
      • 1970-01-01
      • 2015-02-22
      • 2011-07-13
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多