如何在Grid.Row/Grid.Column中引用行/列定义?

Sem*_*ike 9 wpf xaml reference

这可能很明显......我如何在同一个XAML文件中引用XAML元素?

例:

<Grid.RowDefinitions>
    <RowDefinition Height="661*" Name="someGridRow" />
    <RowDefinition Height="230*" Name="someOtherGridRow"/>
</Grid.RowDefinitions>
Run Code Online (Sandbox Code Playgroud)

然后我在网格中定义了各种控件,我想按名称而不是数字来引用这些行:

<RichTextBox Grid.Row="someGridRow" ... />
Run Code Online (Sandbox Code Playgroud)

因为如果我Grid.Row="0"在许多控件上使用,那么当我在第一行之前添加一行时,我必须Grid.Row="1"手动更改所有引用.

谢谢.

编辑:

感谢答案,我一直在阅读XAML.

毕竟,显然可以通过名称引用前一个元素:

Grid.Row="{Binding ElementName=someGridRow}"
Run Code Online (Sandbox Code Playgroud)

要么

Grid.Row="{x:Reference someGridRow}"
Run Code Online (Sandbox Code Playgroud)

但这并没有完全解决问题,因为Grid.Row需要一个int,而someGridRow不是一个int,它是一个System.Windows.Controls.RowDefinition.

所以需要的是XAML等价物

Grid.Row = grid.RowDefinitions.IndexOf(someGridRow)
Run Code Online (Sandbox Code Playgroud)

在后面的代码中将写入

Grid.SetRow(richTextBox, grid.RowDefinitions.IndexOf(someGridRow))
Run Code Online (Sandbox Code Playgroud)

或者Grid.Row在对象上对属性进行绑定,该对象grid具有"RowDefinitions.IndexOf"带参数的路径someGridRow:

PropertyPath path = new PropertyPath("RowDefinitions.IndexOf", someGridRow);
Binding binding = new Binding() { ElementName = "grid", Path = path };
richTextBox.SetBinding(Grid.RowProperty, binding);
Run Code Online (Sandbox Code Playgroud)

(这实际上在C#中不起作用,所以我必须做错事,尽管Grid.SetRow上面有效)

XAML 2009定义<x:Arguments>了调用具有参数的构造函数.如果在WPF XAML中有效,那么我想这样的东西会起作用吗?

<Grid.Row>
  <Binding ElementName="grid">
    <Binding.Path>
      <PropertyPath>
        <x:Arguments>
          RowDefinitions.IndexOf
          <Binding ElementName="someGridRow"/>
        </x:Arguments>
      </PropertyPath>
    </Binding.Path>
  </Binding>
</Grid.Row>
Run Code Online (Sandbox Code Playgroud)

这里<Binding ElementName="someGridRow"/>也被替换<x:Reference Name="someGridRow"/>在2009年XAML.

H.B*_*.B. 15

对于lulz:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Markup;
using System.Windows.Controls;
using System.Windows;

namespace Test.MarkupExtensions
{
    class GridDefinitionExtension : MarkupExtension
    {
        public string Name { get; set; }

        public GridDefinitionExtension(string name)
        {
            Name = name;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var refExt = new Reference(Name);
            var definition = refExt.ProvideValue(serviceProvider);
            if (definition is DefinitionBase)
            {
                var grid = (definition as FrameworkContentElement).Parent as Grid;
                if (definition is RowDefinition)
                {
                    return grid.RowDefinitions.IndexOf(definition as RowDefinition);
                }
                else
                {
                    return grid.ColumnDefinitions.IndexOf(definition as ColumnDefinition);
                }
            }
            else
            {
                throw new Exception("Found object is neither a RowDefinition nor a ColumnDefinition");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
<Grid Width="200" Height="200"
      xmlns:me="clr-namespace:Test.MarkupExtensions">
    <Grid.RowDefinitions>
        <RowDefinition Name="row1" />
        <RowDefinition Name="row2" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="col1" />
        <ColumnDefinition Name="col2" />
    </Grid.ColumnDefinitions>
    <Border Background="Lime" Grid.Row="{me:GridDefinition row1}" Grid.Column="{me:GridDefinition col1}" />
    <Border Background="Red" Grid.Row="{me:GridDefinition row2}" Grid.Column="{me:GridDefinition col1}" />
    <Border Background="Yellow" Grid.Row="{me:GridDefinition row1}" Grid.Column="{me:GridDefinition col2}" />
    <Border Background="Blue" Grid.Row="{me:GridDefinition row2}" Grid.Column="{me:GridDefinition col2}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)