Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 重新定义控件模板时,依赖项属性从何而来?_Wpf_Templates_Dependency Properties_Textblock - Fatal编程技术网

Wpf 重新定义控件模板时,依赖项属性从何而来?

Wpf 重新定义控件模板时,依赖项属性从何而来?,wpf,templates,dependency-properties,textblock,Wpf,Templates,Dependency Properties,Textblock,假设您有两个WPF按钮。一个使用TextBlock,而不是另一个 <Button x:Name="Button1"> <TextBlock>inside textblock</TextBlock> </Button> 内部文本块 及 无文本块 两个按钮都使用此模板,该模板将“前台”依赖项属性设置为白色: <ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type B

假设您有两个WPF按钮。一个使用TextBlock,而不是另一个

<Button x:Name="Button1">
    <TextBlock>inside textblock</TextBlock>
</Button>

内部文本块


无文本块
两个按钮都使用此模板,该模板将“前台”依赖项属性设置为白色:

<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">            
   <Border Name="Border" TextElement.Foreground="White">
   <ContentPresenter/>
</ControlTemplate>


带有TextBlock的按钮具有黑色文本。另一个很好用。为什么?

如果您的TextBlock具有自己的样式和设置,可能会覆盖您在外部设置的附加特性,则找不到与此相关的引用


编辑:可能是和一般的问题。

如果您有一个带有颜色的隐式文本块样式,那么它不会拾取前景色,除非您显式地进行模板绑定。

这是H.B.指出的值继承问题。属性值继承通常遵循逻辑树

在第一种情况下:

<Button x:Name="Button1">
    <TextBlock>inside textblock</TextBlock>
</Button>

内部文本块
TextBlock的逻辑父对象是按钮,因此它将从逻辑树上的按钮等继承其值。因此,在以下代码中,文本块将为红色:

<Button x:Name="Button1" TextBlock.Foreground="Red">
    <TextBlock>inside textblock</TextBlock>
</Button>

内部文本块
在第二种情况下:

<Button x:Name="Button2">
   no textblock
</Button>

无文本块
TextBlock最终由ContentPresenter创建(请参阅ILSpy/Reflector中的ContentPresenter.ChooseTemplate方法)。在本例中,TextBlock的逻辑父对象是ContentPresenter。因此,它将从ContentPresenter继承它的值,依此类推,直到逻辑树上定义了白色前景的边框


这是简要的说明。

实际上,直接设置内容的按钮工作正常。这是一个使用TextBlock的,它有意外的颜色。找不到它,但TextBlock的显式创建可能会覆盖AttachedProperties的效果,不太清楚TextBlock是如何隐式创建的…实际上,我不想从按钮获取值。我希望我的ControlTemplate将其硬编码为白色。在ContentPresenter中显式地绑定前景模板将颜色设置为黑色。我有点搞不清楚您想要的是什么,为什么要在边框上设置内容颜色。在任何情况下,如果您使用ContentControl替换ContentPresenter,您可以在其上设置前景,这可能会解决您的问题。您的意思是在ContentPresenter中放置边框可能不是一个好做法?(事实上,我只是想更好地理解WPF的行为,这样我就不会惊讶或困惑地看到黑色文本,而我希望它是白色的。)不,你的数据模板中的边框很好,只是意识到让我困惑的是你没有粘贴结束标记,所以看起来ContentPresenter好像在边框之外!非常好,我一直在看相同的可视树,我从来没有想到逻辑树负责继承。@H.B.-属性可能会让事情变得更糟,因为它可以在元素到元素的基础上缩短值继承。
<Button x:Name="Button2">
   no textblock
</Button>