Мне удалось уменьшить это до простого тестового примера. Исключение возникает при анализе этого XAML с помощью XamlReader.Parse()
:
<DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DockPanel.Resources>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="#FFEEEEEE" />
</Trigger>
</Style.Triggers>
</Style>
</DockPanel.Resources>
<TextBox IsReadOnly="True" />
</DockPanel>
Сообщение об исключении:
Невозможно установить неизвестный элемент 'System.Windows.Controls.TextBox.IsReadOnly'. Номер строки "13" и позиция линии "11".
Если я не устанавливаю IsReadOnly
на TextBox
, он отлично разбирается. Он также отлично разбирается, если я удаляю триггер стиля.
Может ли кто-нибудь пролить свет на это? Я новичок в WPF.
UPDATE:
Здесь unit test Я использую, чтобы воспроизвести это (он не работает на моем ПК):
[TestMethod]
public void TestIsReadOnlyOnTextBox()
{
// Arrange
var xaml =
@"<DockPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
<DockPanel.Resources>
<Style TargetType=""TextBox"">
<Style.Triggers>
<Trigger Property=""IsReadOnly"" Value=""True"">
<Setter Property=""Background"" Value=""#FFEEEEEE"" />
</Trigger>
</Style.Triggers>
</Style>
</DockPanel.Resources>
<TextBox IsReadOnly=""True"" />
</DockPanel>
";
// Act
try {
var root = XamlReader.Parse(xaml);
}
catch (XamlParseException ex) {
Assert.Fail(ex.Message);
}
// If we get here, test passes
}
ОБНОВЛЕНИЕ 2:
Я изначально ссылался только на PresentationFramework v4.0.30319. Добавление ссылок на PresentationCore, System.Xaml и WindowsBase не влияет.
.NET версия проекта - 4 (полный, а не профиль клиента).
ОБНОВЛЕНИЕ 3:
Arg, это отлично работает в ExpressionBlend 3.0.1927.0 и XamlPadX 4. Как сообщает AresAvatar, он, похоже, терпит неудачу при анализе с помощью XamlReader.Parse()
или XamlReader.Load()
!