网格的附加属性始终可用?
Grid's attached properties always available?
在 xaml 中,为此 window 我删除了 Grid 容器并放置了一个 DockPanel。
然而,我可以从 DockPanel 访问 Grid 的附加属性。这怎么可能?
谢谢!
<Window x:Class="testWindow"
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="testWindow" Height="300" Width="300">
<DockPanel Grid.Column="2">
</DockPanel>
</Window>
因为属性不在实例上,而是附加的 - 这意味着它们是在 Grid
class 上静态定义的,并且值存储在 属性 容器中在正常 属性 系统之外。
如果您在 Grid
中有一个 DockPanel
,您可以使用 Grid.Column
来设置 DockPanel
应该在哪一列。因此,它们可能非常有用。附加的依赖属性也可以从父树继承。
有关详细信息,请阅读此 link:
http://www.abhisheksur.com/2011/07/internals-of-dependency-property-in-wpf.html
如果我们以 Grid.Column
为例,内部结构是 Grid
class 中的某处是这样的定义:
public static readonly DependencyProperty ColumnProperty =
DependencyProperty.RegisterAttached(
"Column",
typeof(int),
typeof(Grid),
new PropertyMetadata(0));
以上代码实际上就是声明附加依赖项所需的全部代码 属性。请注意,这里没有 getter 和 setter,属性 是静态的。它只是一个行为声明 - 没有存储或检索它的逻辑。
这是因为 WPF 有自己的依赖属性 (DP) 内部存储区。普通 DP 在 classes 上也没有支持字段。换句话说,所有 DP 都由 WPF 内部存储。但是,WPF 仍然跟踪哪些值属于哪些实例,因此仍然可以为 TextBox1
存储 Width = 20
。这也意味着可以存储甚至没有在 classes 本身上定义的值——就像附加 DP 的情况一样。
由于没有关于可以设置哪些控件 Grid.Column
的规则,它甚至可以存储在不是 Grid 控件子控件的控件上。
在 xaml 中,为此 window 我删除了 Grid 容器并放置了一个 DockPanel。 然而,我可以从 DockPanel 访问 Grid 的附加属性。这怎么可能?
谢谢!
<Window x:Class="testWindow"
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="testWindow" Height="300" Width="300">
<DockPanel Grid.Column="2">
</DockPanel>
</Window>
因为属性不在实例上,而是附加的 - 这意味着它们是在 Grid
class 上静态定义的,并且值存储在 属性 容器中在正常 属性 系统之外。
如果您在 Grid
中有一个 DockPanel
,您可以使用 Grid.Column
来设置 DockPanel
应该在哪一列。因此,它们可能非常有用。附加的依赖属性也可以从父树继承。
有关详细信息,请阅读此 link:
http://www.abhisheksur.com/2011/07/internals-of-dependency-property-in-wpf.html
如果我们以 Grid.Column
为例,内部结构是 Grid
class 中的某处是这样的定义:
public static readonly DependencyProperty ColumnProperty =
DependencyProperty.RegisterAttached(
"Column",
typeof(int),
typeof(Grid),
new PropertyMetadata(0));
以上代码实际上就是声明附加依赖项所需的全部代码 属性。请注意,这里没有 getter 和 setter,属性 是静态的。它只是一个行为声明 - 没有存储或检索它的逻辑。
这是因为 WPF 有自己的依赖属性 (DP) 内部存储区。普通 DP 在 classes 上也没有支持字段。换句话说,所有 DP 都由 WPF 内部存储。但是,WPF 仍然跟踪哪些值属于哪些实例,因此仍然可以为 TextBox1
存储 Width = 20
。这也意味着可以存储甚至没有在 classes 本身上定义的值——就像附加 DP 的情况一样。
由于没有关于可以设置哪些控件 Grid.Column
的规则,它甚至可以存储在不是 Grid 控件子控件的控件上。