man*_*ans 5 c# wpf xaml triggers styles
我有一个用户控件,在其中我有几个textbox/calendar/...控件,根据我的用户控件(IsEditing)中的properety启用或禁用它们
我在我的用户控件中创建了一个依赖项属性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>
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:在'FrameworkElement'类型中找不到属性'IsEditing'.
如何解决触发器的正确属性?
更新1:
我将IsEditing定义如下:
public static readonly DependencyProperty IsEditingProperty = DependencyProperty.Register(
"IsEditing", typeof(Boolean), typeof(MyDetailDataControl), new PropertyMetadata(false));
Run Code Online (Sandbox Code Playgroud)
并定义如下样式:
<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>
Run Code Online (Sandbox Code Playgroud)
但是我现在收到以下错误:在'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>
Run Code Online (Sandbox Code Playgroud)
但触发器没有解雇?你需要实现通知属性机制吗?如果是的话,我该怎么做?当属性是附加属性时,是否有任何特殊技术来实现属性更改通知?
更新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>
Run Code Online (Sandbox Code Playgroud)
您需要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>
Run Code Online (Sandbox Code Playgroud)
关于你的另一个问题:该属性需要一个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); }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4880 次 |
| 最近记录: |