0

我的用户控件中有一个依赖属性,称为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属性,但也失败了。到底是怎么回事?

4

3 回答 3

3

当我开始使用 WPF 时,我遇到了类似的问题。你只需要以不同的方式看待事物。与其查看属性的值IsPromptShown并尝试更改 a 中的属性,TextBox不如Trigger反其道而行之UserControl。查看属性的值并尝试更改中的IsPromptShown属性。TextBoxTriggerTextBox

<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属性......如果您愿意,您可以轻松地使用 a RelativeSource Binding

于 2013-07-30T09:09:44.017 回答
1

我认为问题在于您无法从外部访问 UserControl 中文本框的 TextProperty!

尝试创建一个 Text DependencyProperty,它在 UserControl 内设置文本框的值,并在触发器中设置此属性!

于 2013-07-30T08:30:55.680 回答
0

我找到了解决方案。这不是微不足道的,而是有效的。假设我们有一个UserControl包含 aTextBox和 ather 控件的自定义。我们希望能够根据某些bool UserControl.IsSomething依赖属性为每个内部控件分配样式。首先我们必须声明另一个依赖属性Style UserControl.AlternativeStyle。然后我们附加一个事件处理程序IsSomething以切换当前StyleAlternativeStyle何时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在 custom 之外设置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值时,替代样式将应用于 changed 的​​所有者IsSomething

于 2013-07-30T11:16:25.787 回答