Как установить размер кнопки относительно высоты ее контейнера в XAML?

Я разрабатываю приложение 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, Xamarin или MAUI?

ewerspej 27.10.2022 19:31

Это приложение WPF, которое я пытаюсь разработать.

iDppma 28.10.2022 10:24

Пожалуйста, покажите какой-нибудь код и то, что вы пробовали до сих пор

ewerspej 28.10.2022 11:03

Я добавил это в свой пост.

iDppma 28.10.2022 15:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
97
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы дадите своей сетке и своей кнопке имя, указав атрибут 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», принимающего первый аргумент типа « Сетка» может быть найдена (вам не хватает директивы использования или ссылки на сборку?) Я пробовал несколько исправлений, и, наконец, это работает.

iDppma 03.11.2022 11:22

Я использовал следующий код: MyGrid.SizeChanged += (s, e) => { if (e.HeightChanged) { MyButton.Height = MyGrid.Height * 0,2; } };

iDppma 03.11.2022 11:26

Самый простой способ — поместить кнопку в ее собственную сетку с размерами строк, соответствующими размеру интервала.

например

<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 28.10.2022 18:05

@iDppma Вы не можете выполнять вычисления в XAML. Вы можете сделать это только в коде позади (часть C# вашего представления)

ewerspej 29.10.2022 19:47

Спасибо за ответ. Я не знал, возможно это или нет.

iDppma 03.11.2022 11:19

Вы можете добиться этого с помощью преобразователя и привязки свойства ActualHeight Grid.

<Button Height = "{Binding ElementName = "mygGrid" Path=ActualHeight, Converter = {StaticResource percentageConverter}}"/>

Это неплохая идея. Вы также должны показать, как PercentageConverter определяется и добавляется в Ресурсы для полноты и для будущих читателей. Кроме того, может быть полезно добавить параметр преобразователя, чтобы значение не было жестко запрограммировано в реализации преобразователя.

ewerspej 30.10.2022 08:55

Спасибо вам обоим за ваши ответы. Я попытался использовать конвертер, привязку и параметр конвертера, и он работает.

iDppma 03.11.2022 11:18

Мне удалось использовать следующее:

  1. Создание нового класса Converters с функцией Convert

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;
    }
}
  1. Привяжите фактическую высоту моей кнопки к высоте моей сетки + используйте конвертер как статический ресурс и параметр конвертера

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 к конвертеру

Спасибо за вашу помощь.

Другие вопросы по теме