Я разрабатываю приложение WPF в XAML. Я новичок и у меня проблема с кнопкой. Мне нужно установить его высоту как пропорцию его контейнера, который является сеткой. Я видел, что высота может быть установлена на значение или на «Авто», но я не знаю, как сказать моей кнопке, что ее высота должна составлять 3/4 высоты сетки, в которой она содержится.
Кто-нибудь знает, как с этим бороться? Можно ли это сделать с помощью XAML?
Цель состоит в том, чтобы когда сетка росла, кнопка росла вместе с ней.
Любая помощь будет оценена.
Спасибо
Вот код, который я написал:
<Window x:Class = "WpfAppButtonSize.MainWindow"
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:WpfAppButtonSize"
mc:Ignorable = "d"
Title = "MainWindow" Height = "450" Width = "800">
<Grid>
<Grid Height = "100" Width = "250" HorizontalAlignment = "Center" VerticalAlignment = "Center">
<Button Content = "Button 1" FontSize = "30" Height = "75" Width = "150"/>
</Grid>
</Grid>
Для кнопки вместо высоты = "75" я хотел бы сказать, что высота = 0,75 * высота сетки
Это приложение WPF, которое я пытаюсь разработать.
Пожалуйста, покажите какой-нибудь код и то, что вы пробовали до сих пор
Я добавил это в свой пост.





Если вы дадите своей сетке и своей кнопке имя, указав атрибут x:Name, вы можете установить Height кнопки в коде всякий раз, когда изменяется размер сетки.
XAML
<Grid x:Name = "MyGrid">
<Button x:Name = "MyButton" />
</Grid>
MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
MyGrid.PropertyChanged += (s,e) =>
{
if (e.PropertyName == nameof(MyGrid.Height))
{
MyButton.Height = MyGrid.Height * 0.75;
}
}
}
Обновлено: может потребоваться использовать свойство ActualHeight сетки вместо Height.
Я попытался использовать ваш код, но получил следующую ошибку: CS1061 Код серьезности Описание Ошибка состояния подавления строки файла проекта CS1061 «Сетка» не содержит определения для «PropertyChanged» и нет доступного метода расширения «PropertyChanged», принимающего первый аргумент типа « Сетка» может быть найдена (вам не хватает директивы использования или ссылки на сборку?) Я пробовал несколько исправлений, и, наконец, это работает.
Я использовал следующий код: MyGrid.SizeChanged += (s, e) => { if (e.HeightChanged) { MyButton.Height = MyGrid.Height * 0,2; } };
Самый простой способ — поместить кнопку в ее собственную сетку с размерами строк, соответствующими размеру интервала.
например
<Grid ...>
<Grid Grid.Row = "???" Grid.Column = "???" ...>
<Grid.RowDefinitions>
<RowDefinition Height = "3*" />
<RowDefinition Height = "*" />
</Grid.RowDefinitions>
<Button Grid.Row = "0" ... />
</Grid>
</Grid>
Спасибо за ваш ответ, но это не совсем то, что я хочу сделать. Я хочу выполнить вычисления в XAML, чтобы определить высоту моей кнопки. И я хочу связать высоту моей кнопки с высотой сетки. Но я не знаю, возможно ли это с XAML. Вы понимаете, что я имею в виду ? Может быть, для этого необходимо использовать XAML в сочетании с C#?
@iDppma Вы не можете выполнять вычисления в XAML. Вы можете сделать это только в коде позади (часть C# вашего представления)
Спасибо за ответ. Я не знал, возможно это или нет.
Вы можете добиться этого с помощью преобразователя и привязки свойства ActualHeight Grid.
<Button Height = "{Binding ElementName = "mygGrid" Path=ActualHeight, Converter = {StaticResource percentageConverter}}"/>
Это неплохая идея. Вы также должны показать, как PercentageConverter определяется и добавляется в Ресурсы для полноты и для будущих читателей. Кроме того, может быть полезно добавить параметр преобразователя, чтобы значение не было жестко запрограммировано в реализации преобразователя.
Спасибо вам обоим за ваши ответы. Я попытался использовать конвертер, привязку и параметр конвертера, и он работает.
Мне удалось использовать следующее:
Converters.cs
namespace WpfAppButtonSize
{
public class Converters : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double.TryParse((parameter as string).Replace(',', '.'), NumberStyles.Any, CultureInfo.InvariantCulture, out double param);
return param * (double)value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return true;
}
}
MainWindow.xaml
<Window.Resources>
<converter:Converters x:Key = "converter" />
</Window.Resources>
<Grid>
<Grid x:Name = "MyGrid" Height = "100" Width = "250" HorizontalAlignment = "Center" VerticalAlignment = "Center">
<Button x:Name = "MyButton" Content = "Button 1" FontSize = "30" Width = "150" Height = "{Binding ElementName=MyGrid, Path=ActualHeight, Converter = {StaticResource converter}, ConverterParameter=0.75}" />
</Grid>
</Grid>
**And dont forget to add the converter namespace to the xaml :**
xmlns:converter = "clr-namespace:WpfAppButtonSize"
Мне также помог следующий пост: Привязка XAML к конвертеру
Спасибо за вашу помощь.
Это WPF, Xamarin или MAUI?