如何在用户控件中定义样式的触发器

时间:2011-07-04 12:17:56

标签: c# wpf xaml triggers styles

我有一个用户控件,其中有几个文本框/日历/ ...控件,根据我的用户控件(IsEditing)的原理,它们都应该被启用或禁用

我在我的用户控件中创建了一个依赖项属性IsEditing,现在我想定义一个样式,所有控件都使用它来启用或禁用它。

我正在尝试做这样的事情:

<ad:DocumentContent.Resources>
    <Style x:Key="ReadOnlyMode">
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="Visibility" Value="Visible"/>
        <Setter Property="IsEnabled" Value="False" />
        <Style.Triggers>
            <Trigger Property="IsEditing" Value="True">
                <Setter Property="Background" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

但我收到此错误:在'FrameworkElement'类型中找不到属性'IsEditing'。

如何解决触发器的正确​​属性?


更新1:

我将IsEditing定义如下:

public static readonly DependencyProperty IsEditingProperty = DependencyProperty.Register(
            "IsEditing", typeof(Boolean), typeof(MyDetailDataControl), new PropertyMetadata(false));

定义的样式如下:

<ad:DocumentContent.Resources>
    <Style x:Key="ReadOnlyMode" xmlns:u="clr-namespace:MyProject.Controls" TargetType="{x:Type u:MyDetailDataControl}">
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="Visibility" Value="Visible"/>
        <Setter Property="IsEnabled" Value="False" />
        <Style.Triggers>
            <Trigger Property="IsEditing" Value="True">
                <Setter Property="Background" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

但我现在收到以下错误: 在'MyDetailDataControl'类型中找不到属性'IsEditing'。

我认为依赖项属性定义存在问题。


更新2:

我更改了xaml如下(在用户控件部分添加xmlns:l =“clr-namespace:MyProject.Controls”,以便命名空间随处可用)并且还使用了此处定义的方法http://www.wpfmentor.com/2009/01/how-to-debug-triggers-using-trigger.html调试触发器)

<ad:DocumentContent.Resources>
    <Style x:Key="ReadOnlyMode" TargetType="TextBox">
        <Style.Triggers>
            <Trigger my:TriggerTracing.TriggerName="BoldWhenMouseIsOver" my:TriggerTracing.TraceEnabled="True" Property="l:MyDetailDataControl.IsEditing" Value="True">
                 <Setter Property="TextBox.Background" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

但触发器没有被触发?你需要实现通知属性机制吗?如果是的话,我该怎么做?当属性是附加属性时,是否有任何特殊技术来实现属性更改通知?


更新3: 更改为此版本,与我自己的IsEditing属性无关。但仍然无效。

<ad:DocumentContent.Resources>
    <Style x:Key="MyStyle" TargetType="{x:Type l:MyDetailDataControl}" >
        <Style.Triggers>
            <Trigger my:TriggerTracing.TriggerName="BoldWhenMouseIsOver" my:TriggerTracing.TraceEnabled="True" Property="IsMouseOver" Value="True">
                <Setter Property="FontWeight" Value="Bold"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ad:DocumentContent.Resources>

1 个答案:

答案 0 :(得分:5)

您需要将样式的TargetType设置为UserControl的类型。或者用它作为所有属性的前缀。

<!-- Using TargetType -->
<Style xmlns:u="clr-namespace:Test.UserControls"
       x:Key="ReadOnlyMode"
       TargetType="{x:Type u:MyUserControl1}">
    <Style.Triggers>
        <Trigger Property="IsEditing" Value="True">
            <!-- ... -->
        </Trigger>
    </Style.Triggers>
</Style>
<!-- Using qualified property -->
<Style xmlns:u="clr-namespace:Test.UserControls"
       x:Key="ReadOnlyMode">
    <Style.Triggers>
        <Trigger Property="u:MyUserControl1.IsEditing" Value="True">
            <!-- ... -->
        </Trigger>
    </Style.Triggers>
</Style>

关于您的其他问题:该属性需要CLR-Wrapper:

public static readonly DependencyProperty IsEditingProperty =
        DependencyProperty.Register("IsEditing", typeof(Boolean), typeof(MyDetailDataControl), new UIPropertyMetadata(false));
// This:
public Boolean IsEditing
{
    get { return (Boolean)GetValue(IsEditingProperty); }
    set { SetValue(IsEditingProperty, value); }
}