我有一个扩展WPF TextBox
控件的简单控件。基本思想是在UI中保存空间,方法是让TextBox
在空的时候在其中显示自己的标签。
我已在其中声明了一个名为DependencyProperty
的{{1}},并将Label
属性设置为TextBox.Template
。 ControlTemplate
是默认的Windows Aero XAML,在控件后面添加了ControlTemplate
,显示TextBlock
属性的值。只要TextBox.Text
属性为空,其Visibility
属性就会与Converter
绑定。 (有很多,而且大部分都无趣,所以请原谅滚动条。)
Text
(对于绑定,控件的<ControlTemplate x:Key="LabelTextBoxTemplate" TargetType="{x:Type TextBoxBase}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Aero="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
<Aero:ListBoxChrome Background="{TemplateBinding Panel.Background}" BorderBrush="{TemplateBinding Border.BorderBrush}" BorderThickness="{TemplateBinding Border.BorderThickness}" RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" RenderFocused="{TemplateBinding UIElement.IsKeyboardFocusWithin}" Name="Border" SnapsToDevicePixels="True">
<Grid>
<TextBlock Text="{Binding Label, ElementName=This}" Visibility="{Binding Text, ElementName=This, Converter={StaticResource StringToVisibilityConverter}}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" FontWeight="Normal" FontStyle="Italic" Foreground="#99000000" Padding="3,0,0,0" />
<ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Grid>
</Aero:ListBoxChrome>
<ControlTemplate.Triggers>
<Trigger Property="UIElement.IsEnabled" Value="False">
<Setter TargetName="Border" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
<Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
属性设置为Name
所以无论如何,这一切都很好用,但我想知道我是否可以用附加属性替换这个功能。我创建了一个名为This
的附加属性,并添加了一个在设置属性时调用的回调委托。在此方法中,我计划从Label
中找到ControlTemplate
并将Application.Resources
属性设置为它...我找不到访问TextBox.Template
的方法所以这是我的第一个问题。
如何从附加资产中访问App.xaml中的ControlTemplate
中的ControlTemplate
?
问题的其余部分是如何在“ControlTemplate”中绑定到附加属性?
我尝试了几件事,比如
Application.Resources
但是包含附加属性的Text="{Binding Path=(Attached:TextBoxProperties.Label),
Source={x:Static Attached:TextBoxProperties}, FallbackValue=''}"
类不是静态的。
更新&gt;&gt;&gt;
感谢H.B.我发现我可以使用以下代码访问TextBoxProperties
。
ControlTemplate
答案 0 :(得分:0)
您应该可以从Application.Resources
访问Application.Current.Resources
。
绑定应该是这样的:
{Binding (Attached:TextBoxProperties.Label),
RelativeSource={RelativeSource AncestorType=TextBox}}
如果包含该属性的类是静态的,那么bindng引擎将查看该属性是否在TextBox
上设置,它不关心声明类。