Расположение элементов в развернутом окне

#.net #wpf

#.net #wpf

Вопрос:

У меня есть окно с WindowState="Maximized" (которое также есть, AllowsTransparency="True" Background="Transparent" WindowStyle="None" если это имеет значение), и в левом верхнем углу окна есть Image элемент.

Но фактическое окно.Положение слева = -8 и окно.Top = -8.

Таким образом, мое изображение обрезано для этих значений.

Я сделал такой взлом, чтобы избежать этого:

 image1.Margin = new Thickness(-this.Left - 1, -this.Top - 1, 0, 0);
  

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

Комментарии:

1. в каком контейнере находится изображение? Холст, панель, сетка? и как это позиционируется? абсолютное, относительное?

2. Это в сетке. И оно расположено по умолчанию.

Ответ №1:

Я не могу воспроизвести вашу проблему.

Вот что я попробовал:

 <Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        WindowState="Maximized">

    <Grid>
        <Image Source="E:testImagestest.bmp" Stretch="None" VerticalAlignment="Top" HorizontalAlignment="Left" />
    </Grid>

</Window>
  

и при этом, действительно, окно имеет положение (-8, -8), что является нормальным, поскольку это способ MS Windows «скрыть» границы окон…

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

если я добавлю ваш хак, изображение получит заданное поле, и это увеличит его на 8 пикселей справа от левой части экрана и на 8 пикселей вниз от строки заголовка.

итак, либо я упускаю какую-то информацию, либо ваша проблема заключается не в этом


редактировать: я попробовал пример проекта, приведенный в комментарии, и обнаружил, что проблема заключается в том, что для параметра «AllowsTransparency» в окне установлено значение true.

почему это так себя ведет, я понятия не имею…

Комментарии:

1. Это проблема, даже с вашим образцом. Вот фиктивный проект, который демонстрирует это: dl.dropbox.com/u/4486681/WpfApplication2.7z

2. достаточно интересно, что моя отладка говорит мне, что виновником является «AllowsTransparency = true»… что касается «почему», я понятия не имею…

Ответ №2:

Вы могли бы установить триггер стиля, который добавляет поле при развернутом окне

 <Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"
    WindowState="Maximized"
    AllowsTransparency="True" 
    WindowStyle="None" name="Window1">

<Grid>


<Grid.Style>
    <Style TargetType="{x:Type Grid}">
        <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=Window1, Path=WindowState}" Value="Maximized">
                <Setter Property="Margin" Value="5"/> // set your own values
            </DataTrigger>
        </Style.Triggers>
    </Style>
    </Grid.Style>




    <Image Source="E:testImagestest.bmp" Stretch="None" VerticalAlignment="Top" HorizontalAlignment="Left" />
</Grid>
  

Ответ №3:

Попробуйте использовать окно просмотра. Вот так:

 <ViewBox>
  <Grid>
    <Image ..../>
  </Grid>
</ViewBox>
  

Окно просмотра автоматически изменит размер до размера изображения, поэтому изображение не будет обрезано.

Комментарии:

1. Это не то, о чем я спрашивал.