【问题标题】:How to debug DependencyProperty.Unsetvalue errors when the InnerException is null当 InnerException 为 null 时如何调试 DependencyProperty.Unsetvalue 错误
【发布时间】:2011-04-16 23:16:19
【问题描述】:

我有一个自定义的登录用户控件,它有一个普通的文本框和一个密码框。

Blend 拒绝与PasswordBox 合作,说“DP.UnsetValue”对 PasswordChar 属性无效。然而,该项目在 Blend 或 VS2010 中编译并运行良好。 VS2010 中的苹果酒设计师似乎并不介意这个错误,因为它实际上呈现了我的 UserControl 以进行设计时配置。

通常,当我遇到这些错误之一时,会出现 InnerException,其中缺少文件/资源​​的路径。这不是这里的情况,我不知道如何弄清楚如何解决它,以便将来出现这种情况。

我交换了标签以将PasswordBox 变成普通的TextBox,这似乎没问题。但是我需要PasswordBox 提供的输入屏蔽。注释掉该对象并在 Blend 中完成我的控件样式并不是很实际。

这是我的 Xaml:

 <PasswordBox x:Name="PasswordTextbox" PasswordChar="*" Height="26" VerticalAlignment="Center" Grid.Column="1" Grid.Row="1" Margin="5" RenderTransformOrigin="0.5,0.5" TabIndex="3">
                <PasswordBox.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform/>
                    </TransformGroup>
                </PasswordBox.RenderTransform>
                <PasswordBox.Effect>
                    <DropShadowEffect />
                </PasswordBox.Effect>
                <PasswordBox.Triggers>
                    <EventTrigger RoutedEvent="UIElement.GotFocus">
                        <BeginStoryboard Storyboard="{StaticResource StoryboardScaleUpFontIncrease}"/>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="UIElement.LostFocus">
                        <BeginStoryboard Storyboard="{DynamicResource StoryboardScaleNormalFontNormal}"/>
                    </EventTrigger>
                </PasswordBox.Triggers>
            </PasswordBox>

有人知道如何调试这种行为吗?

【问题讨论】:

    标签: wpf dependency-properties


    【解决方案1】:

    似乎是一个旧帖子。我通过在 resourceDictionnary 合并中按使用顺序排列这些东西来解决我的问题。在下面的示例中,我稍后调用了资源“Couleur.xaml”并且收到了错误消息。所以我把它放在首位,它解决了我的问题:

        <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/TS;component/Ressources/Couleur.xaml"/>
                    <ResourceDictionary Source="/TS;component/Ressources/ButtonStyle.xaml"/>
                    <ResourceDictionary Source="/TS;component/Ressources/DataGridStyle.xaml"/>
                </ResourceDictionary.MergedDictionaries>
    
    Hope it's gonna help somebody out there!
    

    【讨论】:

      【解决方案2】:

      我建议重新检查(两次或多次)您的 ResourceDictionary。添加到我的 ResourceDictionary 后,我遇到了这个错误:

      <Style TargetType="Label" x:Key="myLabel">
          <Setter Property="Foreground" Value="{StaticResource myDefinedColor}"/>
          ...
      </Style>
      

      {StaticResource myDefinedColor} 是在它下面定义的。在我的情况下,错误是关于具有 UnsetValue 的前景。所以实际上它确实是一个未设置的值...... 我将 Label 的样式移到下面定义我的颜色,就是这样!

      【讨论】:

        【解决方案3】:

        我终于能够通过使用此博客条目中描述的技术解决此问题:

        http://web.archive.org/web/20090602111317/http://bea.stollnitz.com/blog/?p=52

        【讨论】:

        • 事实证明,在我的情况下,WPF 类型的默认样式是使用未定义的静态资源设置属性“Foreground”。
        • 这是唯一有用的东西。适用于数据绑定的相同跟踪也可以配置为在 WPF 资源故障时发出跟踪。
        【解决方案4】:

        我在 xaml 设计器中也遇到了同样的问题,但方式截然不同。我在这里添加细节以防对某人有帮助。

        我使用的是第 3 方控件,它在 dll 中定义了自己的主题。我引用了这个 dll 并使用“StaticResource”来引用该 dll 中定义的一些资源。然后 xaml 设计器在我的 xaml 代码下划线,说“D.Unset 不是 xxx 的有效值”。但是程序编译运行没有任何问题。

        要消除这些烦人的下划线,解决方案很简单:将“StaticResource”更改为“DynamicResource”。 另一种更复杂的方法是使用“ResourceDictionary.MergedDictionaries”将该 dll 中的资源包含到您的 xaml 文件中。

        【讨论】:

        • 我在错误模板的 PRISM 应用程序中遇到了类似的错误。只需将 StaticResource 更改为 Dynamic 即可解决我的问题。
        • 注意静态资源是编译时改的,动态资源是设置运行时的,所以对性能有轻微影响
        • 很抱歉重新打开这篇文章,但是您的评论 Another more complicated way is to use 'ResourceDictionary.MergedDictionaries' 不准确。它一点也不复杂 - 它只是一行,您只需要了解指定驻留在 DLL(又名资源)中的文件的特定语法。此外,DynamicResource 指定了不同于StaticResource 的特定用法。您必须了解在项目中大量使用DynamicResource 之前会产生的性能成本。
        【解决方案5】:

        只是想补充一点,这有助于解决解决“DependencyProperty.UnsetValue is not a valid value for property”错误的问题,特别是博客的第一部分暗示您的资源可能无效(即先前定义并可供使用)。就我而言,这是一个经典问题,即没有在正确的范围内定义我的资源,它们实际被调用之前。

        我的建议:首先确保您在相应的 Element.Resources 部分中定义了 StaticResource。确保定义在实际调用资源之前位于物理位置。

        【讨论】:

        • 我也确实解决了这个问题。我现在在开发和测试时尽可能缩小范围,并在证明它们后慢慢将它们移到字典中。这使我减少了这些错误,但确实需要更长的时间来维护。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        • 2016-05-01
        相关资源
        最近更新 更多