Я хочу сделать свое приложение WPF полностью адаптивным, я прочитал много сообщений по этой теме, но, к сожалению, все эти сообщения не помогли мне достичь того, что я хочу.
Что я хочу сделать, так это сделать мое приложение отзывчивым, как веб-сайт ... это означает, что если мне нужно расположить Buttons вертикально и я минимизирую ширину страницы, тогда два Buttons должны быть расположены горизонтально. Как это:
Normal Window
After Resize
Возможно ли это в WPF? То, что я хочу сделать, называется "жидким макетом", упомянутым в вопросе Этот?





Да, один из способов добиться этого - использовать WrapPanel и хитрый конвертер, чтобы средний элемент занимал все оставшееся пространство:
<Window.Resources>
<local:WpConverter x:Key = "WpConverter"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height = "Auto"/>
<RowDefinition Height = "*"/>
<RowDefinition Height = "Auto"/>
</Grid.RowDefinitions>
<Rectangle Grid.Row = "0" Fill = "BlueViolet" Height = "75" HorizontalAlignment = "Stretch"/>
<WrapPanel x:Name = "wp" Grid.Row = "1" HorizontalAlignment = "Stretch" Orientation = "Horizontal">
<StackPanel Width = "100">
<Rectangle Fill = "CornflowerBlue" Height = "20" Margin = "3"/>
<Rectangle Fill = "CornflowerBlue" Height = "20" Margin = "3"/>
<Rectangle Fill = "CornflowerBlue" Height = "20" Margin = "3"/>
<Rectangle Fill = "CornflowerBlue" Height = "20" Margin = "3"/>
</StackPanel>
<Grid HorizontalAlignment = "Stretch" Width = "{Binding Path=ActualWidth, ElementName=wp,Converter = {StaticResource WpConverter}}"></Grid>
<Rectangle Margin = "3" Fill = "CornflowerBlue" Width = "94" Height = "200" ></Rectangle>
</WrapPanel>
<Rectangle Margin = "3" Grid.Row = "2" Fill = "Cyan" Height = "50" HorizontalAlignment = "Stretch"/>
</Grid>
Роль конвертера состоит в том, чтобы убедиться, что средняя сетка растягивается, чтобы занять все оставшееся пространство (ширина обертки - ширина левой боковой панели - ширина правой боковой панели):
public class WpConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Int32.Parse(value.ToString()) - 200;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Ps: вы также можете использовать многозначный преобразователь и передать ActualWidths левой и правой боковых панелей вместо жесткого кодирования их значений в преобразователе.
Результат:
Убедитесь, что вы привязаны к ActualWidth, а не Width
Я копирую и вставляю ваш код, но как установить значение ActualWidth?
ActualWidth будет установлен автоматически во время выполнения, вы используете его, когда хотите получить текущую ширину элемента управления, скажем, после изменения размера или чего-то еще. Что касается приведенного выше кода, он действительно работает (снимок экрана доказывает это;))) перепроверьте свой код, в противном случае отредактируйте свой вопрос и передайте его, и я посмотрю;
Пожалуйста, проверьте тестовое приложение mediafire.com/file/56w21mrr2glae07/WpfApp1.zip
Да, работает без проблем !! prntscr.com/kcgdqc Чем ты занимаешься?
Попробуйте изменить метод синтаксического анализа в конвертере, используйте tryParse или явное приведение return ((int)value) - 200;
Невероятно .. Получил ошибку: mediafire.com/file/54hys1a59qc2ljw/capture.PNGmediafire.com/file/54hys1a59qc2ljw/capture2.PNG
ОС Windows 10, VS 2017
Попробуйте то, что я предложил, и дайте мне знать
К сожалению .. та же проблема
Позвольте нам продолжить обсуждение в чате.
Спасибо за ответ, но я думаю, вам следует изменить сетку внутри WrapPanel на WrapPanel. Еще раз спасибо.
Пожалуйста, опубликуйте свой xaml