WPF Textbox & Borders - любопытное изменение размеров - PullRequest
3 голосов
/ 15 июня 2009

Следующий XAML создает окно со странным поведением вокруг текстового поля:

<Window x:Class="WpfSandbox.CuriousExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="CuriousExample" Height="300" Width="300">
    <DockPanel Margin="15">
        <TextBox BorderThickness="1" BorderBrush="#FF000000"></TextBox>
    </DockPanel>
</Window>

Что происходит, по крайней мере, во время моего ограниченного тестирования, так это то, что текстовое поле отображается с вставленным шаблоном границы (верх / левый черный, правый / нижний серый). Однако при изменении размера на любую позицию, кроме оригинала, вся граница текстового поля становится черной. Всякий раз, когда вы возвращаете окно к точному количеству пикселей на экране, которое было у формы при первой загрузке, оно снова вставляется.

Я предполагаю, что это не привязка к пикселям, так как я могу легко исправить проблему с помощью этого кода:

<Window x:Class="WpfSandbox.CuriousExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="CuriousExample" Height="300" Width="300">
    <DockPanel Margin="15">
        <Border BorderThickness="1" BorderBrush="#FF000000">
            <TextBox BorderThickness="0" ></TextBox>
        </Border>
    </DockPanel>
</Window>

Кто-нибудь хочет найти объяснение тому, что я вижу? Или все это в моей голове?

Как я уже сказал, описанный выше обходной путь может решить эту проблему - просто попытаться понять, что здесь происходит.

Спасибо

-Скотт

Ответы [ 2 ]

0 голосов
/ 16 июня 2009

Хм ... у вас проблемы с фокусом? Я загрузил тему Aero, и я вижу вашу вставку TextBox, когда TextBox имеет фокус или наведен курсор. Вы можете увидеть это довольно ясно, когда добавите второй TextBox, например:

<DockPanel Margin="15">
    <TextBox BorderThickness="1" BorderBrush="#FF000000"></TextBox>
    <TextBox BorderThickness="1" BorderBrush="#FF000000"></TextBox>
</DockPanel>

Стиль по умолчанию для Aero использует ControlTemplate, который устанавливает границу TextBox для использования ListBoxChrome, который пытается установить некоторые дополнительные свойства, когда элемент управления имеет фокус или наведен поверх него.

С другой стороны, стиль по умолчанию для темы Luna связывает BorderBrush, содержащий Border, непосредственно с TemplateBinding, что означает, что это всегда соблюдается (и почему он работает в XP / Luna, а не в 2008 или Vista).

0 голосов
/ 16 июня 2009

Вы можете заставить приложение использовать тему Vista (Aero)

Откройте ваш app.xaml и поместите что-то вроде:

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

Не забудьте добавить ссылку PresentationFramework.Aero в ваш проект.

С этим вы увидите приложение в XP, как в Vista.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...