2013-07-22 3 views
2

Кажется, что я не могу установить свойство Height для элемента Window равным 0. Есть ли объяснение этому?Как установить размер окна на 0?

Этот код не работает, а также не приводит к превышению высоты до 0 в коде. ActualHeight всегда возвращает 14.0 для моей машины

<Window x:Class="AnimWindow.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="0" Width="525" AllowsTransparency="True" WindowStyle="None" Background="YellowGreen" > 

</Window> 

Подсказка оценена.

Редактировать: Извините, забыли пояснение :) Я хотел бы создать своеобразное всплывающее окно уведомления, например, Outlook, чтобы уведомить пользователя о чем-то. В то время как непрозрачность работает хорошо, анимирование или установка высоты на 0 - нет.

+4

Зачем вам это нужно? –

+0

Для чего вы хотите? –

+0

Извините, отредактировано для объяснения. – Samuel

ответ

1

Ну, я провел небольшое исследование. Во-первых, этот код:

<Window x:Class="ZeroHwindow.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="0" Width="525" 
    WindowStyle="None" 
    AllowsTransparency="True" 
    Background="Yellow" /> 

Возвращает значение высоты 6, потому что у вас есть 14. Я запускаю этот код на Windows XP, я подозреваю, что у вас другая ОС. Далее я установил параметр ResizeMode в NoResize и получил высоту 2.

Если вы установили ResizeMode="CanResizeWithGrip", мы получаем столько, сколько 17 пикселей, которые соответствуют бы Grip. Поэтому мы видим, что сама система вставляет стандартные элементы, даже если параметры: WindowStyle="None", AllowsTransparency="True".

Я также попытался установить параметры: ShowInTaskbar = False, ShowActivated = False, не дали никаких результатов, окно не было видно, но высота была 2 (получается, что некоторые люди не считают, ничего к этим параметрам, на самом деле, высота/ширина не ноль).

Кстати, я забыл упомянуть: я показал все значения в

ContentRendered="Window_ContentRendered" 

так:

private void Window_ContentRendered(object sender, EventArgs e) 
{ 
    MessageBox.Show(this.Height.ToString()); 
    MessageBox.Show(this.ActualHeight.ToString()); 
} 

Просто пытаются установить SizeToContent = WidthAndHeight: ту же высоту - 2, но Window не отображается.

Единственное, что как-то помог, это:

private void Window_ContentRendered(object sender, EventArgs e) 
{ 
    this.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
    this.Arrange(new Rect(0, 0, 0, 0)); 

    MessageBox.Show(this.Height.ToString()); 
    MessageBox.Show(this.ActualHeight.ToString()); 
} 

В thic случае ActualHeight возврата 0.

Возможно, нарисован стандартный элемент, и невозможно получить 0. Я также попытался установить Styles/Templates, но высота не была установлена ​​равной нулю. В принципе, как и ожидалось, он наверняка установлен на системном уровне.

Все еще решили посмотреть на него через Snoop.

Part #1. Standard state

enter image description here

Вы можете видеть, что локальное значение устанавливается высокий уровень.

Part #2. Using Arrange and Measure

enter image description here

Некоторые ссылки:

UIElement.Arrange

UIElement.Measure

3

Поскольку вы не имеют границ, просто Hide и Show окно вместо того, чтобы это Height к нулю или положительное значение.

+0

Спасибо за ваш ответ, я расширил свой вопрос, чтобы объяснить свою мотивацию. – Samuel

+0

@Samuel Это не объясняет, почему использование Show/Hide не будет работать лучше, хотя ... –

+0

Предназначен для анимирования. Наконец, будет вызвана «Скрыта», но я хотел бы добиться некоторого эффекта сжатия. – Samuel

Смежные вопросы