#.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. Это не то, о чем я спрашивал.