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)
| 归档时间: |
|
| 查看次数: |
5997 次 |
| 最近记录: |