WPF - أنماط مع خصائص مخصصة
-
01-10-2019 - |
سؤال
أقوم بتطوير رقم مستند يتحقق من طلبي وكتبت سلوكًا مرفقًا إلى TextBox للتحقق من النص. هذا هو رمز السلوك:
public class CPFTextBehavior : Behavior<TextBox>
{
static readonly DependencyPropertyKey IsCPFPropertyKey =
DependencyProperty.RegisterAttachedReadOnly("IsCPF", typeof(bool), typeof(CPFTextBehavior),
new FrameworkPropertyMetadata(false));
public static readonly DependencyProperty IsCPFProperty = IsCPFPropertyKey.DependencyProperty;
public static bool GetIsCPF(TextBox tb)
{
return (bool)tb.GetValue(IsCPFProperty);
}
public bool IsCPF
{
get { return GetIsCPF(AssociatedObject); }
private set { AssociatedObject.SetValue(IsCPFPropertyKey, value); }
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.TextChanged += LocusProject.Validacao.CPF_CNPJValidation.ValidateCPF;
AssociatedObject.PreviewTextInput += LocusProject.Validacao.CPF_CNPJValidation.ValidateCPFMask;
DataObject.AddPastingHandler(AssociatedObject, LocusProject.Validacao.CPF_CNPJValidation.PastingCPFMask);
AssociatedObject.PreviewKeyDown += Interactivity.PreventInsertKey;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.TextChanged -= LocusProject.Validacao.CPF_CNPJValidation.ValidateCPF;
AssociatedObject.PreviewTextInput -= LocusProject.Validacao.CPF_CNPJValidation.ValidateCPFMask;
DataObject.RemovePastingHandler(AssociatedObject, LocusProject.Validacao.CPF_CNPJValidation.PastingCPFMask);
AssociatedObject.PreviewKeyDown -= Interactivity.PreventInsertKey;
}
}
وهنا ما أفعله في رعاية الموارد الخاصة بي:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="clr-namespace:LocusProject">
<Style TargetType="{x:Type TextBox}" x:Key="TextFields">
<Setter Property="BorderBrush" Value="DarkBlue"/>
<Setter Property="BorderThickness" Value="1"/>
<Style.Triggers>
<EventTrigger RoutedEvent="TextBox.GotFocus">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="00:00:00.0000000" Value="White"/>
<SplineColorKeyFrame KeyTime="00:00:00.3500000" Value="LightBlue"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="TextBox.LostFocus">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="00:00:00.0000000" Value="LightBlue"/>
<SplineColorKeyFrame KeyTime="00:00:00.3500000" Value="White"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type TextBox}" x:Key="CPFField" BasedOn="{StaticResource TextFields}">
<Setter Property="i:CPFTextBehavior.IsCPF" Value="True" />
</Style>
ولكن هذا هو الشيء. تقول "تم إلقاء استثناء هدف الاحتجاج." ولا يمكنني الحصول عليها للعمل.
أفعل شيئا خاطئا؟ شكرا مقدما.
المحلول
أنت تحاول تعيين قيمة خاصية ISCPF ، لكنك قمت بتسجيل تلك الخاصية كقراءة فقط.
أنت بحاجه إلى:
تغيير تسجيل العقار:
static readonly DependencyProperty IsCPFProperty = DependencyProperty.RegisterAttached("IsCPF", typeof(bool), typeof(CPFTextBehavior), new FrameworkPropertyMetadata(false));
أضف طريقة setIscpf:
public static bool SetIsCPF(TextBox tb, bool value) { tb.SetValue(IsCPFProperty, value); }
لا تنتمي إلى StackOverflow