Как отлаживать ошибки DependencyProperty.Unsetvalue, когда значение InnerException равно null

У меня есть пользовательский пользовательский элемент управления, который имеет обычный текстовый ящик и пароль.

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>

Кто-нибудь знает, как отлаживать это поведение?

Ответы

Ответ 2

У меня также была такая же проблема в дизайне xaml, но по-другому. Я добавляю детали здесь, если это кому-то полезно.

Я использовал сторонний элемент управления, который имеет собственную тему, определенную в dll. Я ссылался на эту DLL и использовал "StaticResource" для ссылки на некоторые ресурсы, определенные в этой DLL. Затем дизайнер xaml подчеркнул, что мой код xaml говорит что-то вроде "D.Unset не является допустимым значением для xxx". Но программа компилируется и запускается без проблем.

Чтобы устранить эту раздражающую подчеркивание, решение прост: Изменить 'StaticResource' на 'DynamicResource'. Другой более сложный способ - использовать 'ResourceDictionary.MergedDictionaries' для включения ресурсов в эту dll в ваш файл xaml.

Ответ 3

Просто хотел добавить, что это было полезно при решении проблемы для получения ошибки "DependencyProperty.UnsetValue не является допустимым значением для свойства", в частности, в первой части блога, предполагающей, что ваш ресурс может быть недействительным ( т.е. предварительно определенные и доступные для использования). Оказывается, в моем случае это была классическая проблема, заключающаяся в том, что я не определял свои ресурсы в правильном объеме и до того, как их действительно вызвали.

Мой совет: сначала убедитесь, что вы определили StaticResource в соответствующем разделе Element.Resources. Убедитесь, что определение физически расположено до фактического вызова ресурса.

Ответ 4

Я советую перепроверить (дважды или более) ваш ResourceDictionary. Я пришел к этой ошибке после добавления в свой ResourceDictionary:

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

а {StaticResource myDefinedColor} - НИЖЕ. В моем случае ошибка была связана с Foreground, у которой есть UnsetValue. Так что на самом деле это действительно была неустановленная ценность... Я переместил свой стиль для метки ниже, определяя свой цвет, и это все!