Итак, у меня есть форма для регистрации, и по дизайну она выглядит так:
И вот для этого XAML:
<Rectangle x:Name = "signInBox" Fill = "#FF5F5F6E" HorizontalAlignment = "Center" Height = "450" Margin = "0,0,0,0" Stroke = "Black" VerticalAlignment = "Center" Width = "640" StrokeThickness = "3" Visibility = "Visible"/>
<TextBlock x:Name = "signUpText" HorizontalAlignment = "Center" Margin = "0,-350,0,0" TextWrapping = "Wrap" Text = "Sign up for Horizon Chat" VerticalAlignment = "Center" FontFamily = "Muli" FontSize = "36" Foreground = "White"/>
<!-- For the username box -->
<TextBox x:Name = "nameSignUpBox" HorizontalAlignment = "Center" Margin = "0,-150,0,0" TextWrapping = "Wrap" VerticalAlignment = "Center" Width = "370" FontFamily = "Muli" FontSize = "26" BorderThickness = "2" MaxHeight = "61" MaxWidth = "686"/>
<TextBlock x:Name = "nameSignUpBoxDescription" HorizontalAlignment = "Center" Margin = "456,334,738,544" TextWrapping = "Wrap" Text = "Username" VerticalAlignment = "Center" FontFamily = "Muli" FontSize = "18" Foreground = "#FFDADADA"/>
<!-- For the email box -->
<TextBox x:Name = "emailSignUpBox" HorizontalAlignment = "Center" Margin = "0,0,0,0" TextWrapping = "Wrap" VerticalAlignment = "Center" Width = "370" FontFamily = "Muli" FontSize = "26" BorderThickness = "2" MaxHeight = "61" MaxWidth = "686"/>
<TextBlock x:Name = "emailSignUpBoxDescription" HorizontalAlignment = "Center" Margin = "456,408,778,468" TextWrapping = "Wrap" Text = "Email" VerticalAlignment = "Center" FontFamily = "Muli" FontSize = "18" Foreground = "#FFDADADA"/>
<!-- For the password box -->
<PasswordBox x:Name = "passwordSignUpBox" HorizontalAlignment = "Center" Margin = "0,150,0,0" VerticalAlignment = "Center" Width = "370" FontFamily = "Muli" FontSize = "26" BorderThickness = "2" MaxHeight = "61" MaxWidth = "686"/>
<TextBlock x:Name = "passwordSignUpBoxDescription" HorizontalAlignment = "Center" Margin = "455,484,742,393" TextWrapping = "Wrap" Text = "Password" VerticalAlignment = "Center" FontFamily = "Muli" FontSize = "18" Foreground = "#FFDADADA"/>
Затем, когда программа запускается, она претерпевает некоторые изменения, такие как изменение размера окна, чтобы оно соответствовало этому блоку, и его отображение, и все такое. Вот код для этого:
BrushConverter brushconverter = new BrushConverter();
this.Background = (Brush)brushconverter.ConvertFrom("#FF9C9C9C");
this.Width = 640;
this.Height = 450;
this.ResizeMode = ResizeMode.NoResize;
double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
double windowWidth = this.Width;
double windowHeight = this.Height;
this.Left = (screenWidth / 2) - (windowWidth / 2);
this.Top = (screenHeight / 2) - (windowHeight / 2);
Теперь все, что связано с окном, потому что в моем случае у меня уже есть все, что видно. Итак, когда я запускаю программу, я получаю все Кроме - небольшой текст над полями (Имя пользователя, Электронная почта и Пароль). Вот это:
Теперь я предполагаю, что он перемещает текст куда-то во время изменения размера, поскольку, когда я не изменяю размер окна, он все еще там (как в дизайнере). Тем не менее, это все еще проблема, если он перемещает мой текст в другое место. Как я могу это исправить?
Обновлено: Я попытался изменить размер окна дизайнера, и вот до и после изменения его размера примерно на 100 пикселей:
Перед:
50%:
И после:
@RonBeyer В чем недостаток использования полей в тексте?
Именно то, что вы переживаете! WPF сделан так, чтобы быть «независимым от разрешения», вы пытаетесь использовать смещения пикселей, а затем масштабировать их, в основном внедряя методы WinForms в WPF. Если вы правильно настроили сетку и разместили текст в нужных местах, вам не нужно беспокоиться о коде программной части для масштабирования формы, WPF сделает это за вас.
Если вам слишком лень переделывать свой XAML, есть одна строчка для решения вашей проблемы, несмотря на то, что это плохая практика для такого рода вещей - поместите все в ViewBox.





Используя @ shadow32, я реорганизовал элементы управления в окно просмотра и создал чисто xaml-решение для ваших требований к динамическому изменению размера.
Я также очистил XAML, меньше да лучше хе.
Надеюсь, вы сможете использовать этот подход, постарайтесь сохранить макет в дизайнере, если это возможно.
Это делает решение более удобным в обслуживании.
<Window x:Class = "WpfApp1.Window1"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:WpfApp1"
mc:Ignorable = "d"
Title = "Window1" Height = "450" Width = "800">
<Window.Resources>
<!--SET THE TEXT STYLING, AVOID REPEATING THE SAME STYLE-->
<Style TargetType = "TextBlock">
<Setter Property = "FontFamily" Value = "Muli" />
<Setter Property = "TextWrapping" Value = "Wrap" />
<Setter Property = "Foreground" Value = "#FFDADADA"/>
<!--MARGIN SPACES OUT THE DATA ENTRY FIELDS-->
<Setter Property = "Margin" Value = "0,5,0,0"></Setter>
</Style>
</Window.Resources>
<!--ROOT CONTAINER CONTROL WITH MARGIN TO CENTER-->
<DockPanel Margin = "50,0" >
<!--SIDE BORDER AND BACKGROUND-->
<Border BorderBrush = "Black" BorderThickness = "1,0" Background = "#FF5F5F6E">
<!--VIEWBOX FOR SCALING-->
<Viewbox VerticalAlignment = "Top">
<!--DOCK PANEL FOR WRAPPING HEADER AND DATA ENTRY CONTROLS-->
<DockPanel >
<!--HEADER WITH MARGIN TO PAD THE TOP-->
<TextBlock x:Name = "signUpText"
Text = "Sign up for Horizon Chat"
Foreground = "White"
Margin = "0,10,0,0"
DockPanel.Dock = "Top"
FontSize = "20"/>
<!--STACKPANEL FOR ORDERING CONTROLS-->
<StackPanel DockPanel.Dock = "Bottom" Margin = "5,0">
<!--TOP PADDING TEXTBLOCK-->
<TextBlock />
<!-- For the username box -->
<TextBlock x:Name = "nameSignUpBoxDescription"
Text = "Username" />
<TextBox x:Name = "nameSignUpBox" />
<!-- For the email box -->
<TextBlock x:Name = "emailSignUpBoxDescription"
Text = "Email" />
<TextBox x:Name = "emailSignUpBox" />
<!-- For the password box -->
<TextBlock x:Name = "passwordSignUpBoxDescription"
Text = "Password" />
<PasswordBox x:Name = "passwordSignUpBox" />
<!--BOTTOM PADDING TEXTBLOCK-->
<TextBlock />
</StackPanel>
</DockPanel>
</Viewbox>
</Border>
</DockPanel>
</Window>
Вам действительно не следует использовать поля для размещения текста, если вам нужно это сделать, используйте Canvas вместо Grid. Однако то, что вам действительно следует делать, - это правильно размещать ваши метки / текстовые поля в сетке, используя строки / столбцы, размер которых будет изменяться без кода программной части.