我的用户控件中有一个名为IsPromptShown
的依赖项属性:
public static DependencyProperty IsPromptShownProperty = DependencyProperty.
Register("IsPromptShown", typeof(bool), typeof(AutoCompleteSearchBox), new
PropertyMetadata(true));
public bool IsPromptShown
{
get { return (bool)GetValue(IsPromptShownProperty); }
set { SetValue(IsPromptShownProperty, value); }
}
该自定义控件包含TextBox
。该文本框没有为其Text
属性分配任何值:
<TextBox Name="_searchTextBox" Grid.Row="0" VerticalAlignment="Top"
GotFocus="SearchTextBox_GotFocus" LostFocus="SearchTextBox_LostFocus"
TextChanged="SearchTextBox_TextChanged"/>
现在我在托管窗口中设置以下触发器:
<Trigger Property="IsPromptShown" Value="True">
<!--<Setter Property="FontStyle" Value="Italic"/>-->
<Setter Property="TextBox.Text" Value="Seek"/>
</Trigger>
设置FontStyle
的注释行有效但设置TextBox.Text
的第二行没有。我也一直试图设置Foreground
属性,但也失败了。发生了什么事?
答案 0 :(得分:3)
当我开始使用WPF时,我遇到了类似的问题。你只需要以不同的方式看待事物。不是查看IsPromptShown
属性的值并尝试更改TextBox
中Trigger
中UserControl
的属性,而是反过来。查看IsPromptShown
属性的值,然后尝试更改TextBox
中Trigger
中TextBox
的属性。
<TextBox Name="_searchTextBox" Grid.Row="0" VerticalAlignment="Top"
GotFocus="SearchTextBox" LostFocus="SearchTextBox_LostFocus"
TextChanged="SearchTextBox_TextChanged">
<TextBox.Style>
<Style>
<Setter Property="TextBox.Text" Value="Default value if required" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsPromptShown, ElementName=This}"
Value="True">
<Setter Property="TextBox.Text" Value="Seek" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
请注意,为了实现此目的,您需要在Name=This
的声明中添加UserControl
。这只是让框架知道在哪里找到IsPromptShown
属性...如果您愿意,可以轻松地使用RelativeSource Binding
。
答案 1 :(得分:1)
我认为问题是您无法从外部访问UserControl中Textbox的TextProperty!
尝试创建Text DependencyProperty,在UserControl中设置Textbox的值,并在Trigger中设置此属性!
答案 2 :(得分:0)
我找到了解决方案。这不是微不足道的,而是有效的。假设我们有一个包含UserControl
和ather控件的自定义TextBox
。我们希望能够根据某些bool UserControl.IsSomething
依赖属性为每个内部控件分配样式。首先,我们必须声明另一个依赖属性Style UserControl.AlternativeStyle
。然后我们将事件处理程序附加到IsSomething
,以便在Style
更改时切换当前AlternativeStyle
和IsSomething
:
public static DependencyProperty AlternativeStyleProperty =
DependencyProperty.Register(
"AlternativeStyle",
typeof(Style),
typeof(MyUserControl));
public Style AlternativeStyle
{
get { return (Style)GetValue(AlternativeStyleProperty); }
set { SetValue(AlternativeStyleProperty, value); }
}
public static DependencyProperty IsSomethingProperty =
DependencyProperty.Register(
"IsSomething",
typeof(bool),
typeof(MyUserControl),
new PropertyMetadata(true, IsSomethingProperty_Changed));
public bool IsSomething
{
get { return (bool)GetValue(IsSomethingProperty); }
set { SetValue(IsSomethingProperty, value); }
}
private static void IsSomethingProperty_Changed(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
// Swap styles
// e.g.
// var tempStyle = Style;
// Style = AlternativeStyle;
// AlternativeStyle = tempStyle;
}
更难的部分是在自定义AlternativeStyle
之外设置UserControl
。下面是如何在托管我们自定义控件的窗口的XAML中实现它:
<Window.Resources>
<Style x:Key="DefaultTextBoxStyle" TargetType="TextBox">
<Setter Property="Background" Value="Red"/>
</Style>
<Style x:Key="DefaultUserControlStyle" TargetType="local:MyUserControl">
<Style.Resources>
<Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyle}">
<Setter Property="Background" Value="Blue"/>
</Style>
</Style.Resources>
</Style>
<Style x:Key="AlternativeUserControlStyle" TargetType="local:MyUserControl" BasedOn="{StaticResource DefaultUserControlStyle}">
<Style.Resources>
<Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyle}">
<Setter Property="Background" Value="Green"/>
</Style>
</Style.Resources>
</Style>
<Style TargetType="local:MyUserControl" BasedOn="{StaticResource DefaultUserControlStyle}">
<Setter Property="AlternativeStyle" Value="{StaticResource AlternativeUserControlStyle}"/>
</Style>
</Window.Resources>
以上样式将自动添加到MyUserControl
的所有实例中,当我们更改IsSomething
值时,替代样式将应用于已更改IsSomething
的所有者。