C# 奇怪的WPF错误
我有一些间歇性工作的代码,我不明白为什么(直到今天早上windows自动安装了一些更新,但没有一个与我的项目中使用的.NET4版本相关) 我的密码框C# 奇怪的WPF错误,c#,.net,wpf,xaml,blend,C#,.net,Wpf,Xaml,Blend,我有一些间歇性工作的代码,我不明白为什么(直到今天早上windows自动安装了一些更新,但没有一个与我的项目中使用的.NET4版本相关) 我的密码框 <PasswordBox x:Name="TboxPassword" Grid.Row="1" Grid.Column="0" controls:TextboxHelper.Watermark="Password ..." controls:TextboxHelper.Clea
<PasswordBox x:Name="TboxPassword" Grid.Row="1" Grid.Column="0"
controls:TextboxHelper.Watermark="Password ..."
controls:TextboxHelper.ClearTextButton="True"
Margin="10, 10, 0, 0">
<i:Interaction.Behaviors>
<misc:PasswordBoxBehavior Password="{Binding Path=Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
</i:Interaction.Behaviors>
</PasswordBox>
调试器在标记交互处停止。行为
请记住,直到今天我才收到这个错误。现在我收到它,即使我恢复了我今天所做的一切
请告知D
PS:我刚刚注释掉了行为内部的所有代码。还删除了密码绑定。仍然不起作用:(
PPS:如果我关闭Visual Studio(2012),删除我的bin文件夹,打开VS,打开project,全部重建,应用程序将一直运行到代码的第一次更改。我知道这个问题已经很老了。但我会发布答案,以防有人再次遇到它 我刚刚遇到了同样的问题并找到了解决方案,我注意到您在代码中使用了行为。请确保您引用的是Blend SDK Windows的正确版本。交互性 在我的例子中,问题是我只在主WPF项目上安装了NugetPackage for Blend SDK for WPF 4.5,而忘记在使用行为的解决方案中的其他WPF项目上安装它 我通过在包含导致问题的代码的项目上安装相同的NugetPackage解决了这个问题
希望这对您有所帮助!发布此行为的代码可能对其他人有所帮助我会冒险猜测PasswordBoxBehavior构造函数中的某些内容在运行时引发异常。正如您所说,不确定为什么会在今天而不是昨天发生。您能发布更多代码吗?无构造函数重写…@User123456789该集合由Microsoft定义。为了添加到该集合中,我所做的只是将我的行为放在I:Interaction.Behaviors部分中。纯粹出于兴趣的问题-此行为技术是否可以防止窥探,如中所示?(我猜不是,因为密码现在是一个依赖属性,但我还是很想知道。)
public class PasswordBoxBehavior : Behavior<PasswordBox>
{
#region Fields
private readonly object _tryToExecuteActionSyncObject = new object();
private bool _isUpdating;
#endregion
#region Properties
public string Password
{
get { return (string)GetValue(PasswordProperty); }
set { SetValue(PasswordProperty, value); }
}
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.Register("Password", typeof(string), typeof(PasswordBoxBehavior),
new PropertyMetadata(string.Empty, OnPasswordPropertyChanged));
#endregion
#region Methods
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PasswordChanged += OnAssociatedObjectPasswordChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PasswordChanged -= OnAssociatedObjectPasswordChanged;
}
private void OnAssociatedObjectPasswordChanged(object sender, RoutedEventArgs e)
{
TryToExecuteAction(() => Password = AssociatedObject == null
? string.Empty
: AssociatedObject.Password);
}
private static void OnPasswordPropertyChanged
(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
PasswordBoxBehavior passwordBoxBehavior;
if (sender == null
|| (passwordBoxBehavior = sender as PasswordBoxBehavior) == null
|| passwordBoxBehavior.AssociatedObject == null)
{
return;
}
passwordBoxBehavior.TryToExecuteAction
(() => passwordBoxBehavior.AssociatedObject.Password =
(e.NewValue == null
? string.Empty
: (string) e.NewValue));
}
private void TryToExecuteAction(Action actionToExecute)
{
bool continueExecution;
lock (_tryToExecuteActionSyncObject)
{
continueExecution = _isUpdating == false;
_isUpdating = true;
}
if (continueExecution == false)
{
return;
}
try
{
if (actionToExecute != null)
{
actionToExecute();
}
}
finally
{
lock (_tryToExecuteActionSyncObject)
{
_isUpdating = false;
}
}
}
#endregion
}
{"Cannot add instance of type 'PasswordBoxBehavior' to a collection of type 'BehaviorCollection'. Only items of type 'T' are allowed."}