wpf 如何在XAML中根据按钮容器的高度设置按钮大小?

ni65a41a  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(352)

我正在用XAML开发一个WPF应用程序。我是一个初学者,我的按钮有一个问题。我需要设置它的高度作为它的容器的一个比例,这是一个网格。我看到高度可以设置为一个值或“自动”,但我不知道如何告诉我的按钮,他的高度必须是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 * 网格高度

lskq00tm

lskq00tm1#

最简单的方法是将按钮放置在它自己的网格中,行的大小适当以生成间距。
例如:

<Grid ...>

    <Grid Grid.Row="???" Grid.Column="???" ...>
        <Grid.RowDefinitions>
            <RowDefinition Height="3*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
    
        <Button Grid.Row="0" ... />
    </Grid>

</Grid>
hyrbngr7

hyrbngr72#

如果通过指定x:Name属性给予Grid和Button命名,则可以在Grid大小更改时在后面的代码中设置Button的Height

XAML格式

<Grid x:Name="MyGrid">
    <Button x:Name="MyButton" />
</Grid>

主窗口.xaml.cs

public MainWindow()
{
    InitializeComponent();
    
    MyGrid.PropertyChanged += (s,e) =>
    {
        if(e.PropertyName == nameof(MyGrid.Height))
        {
            MyButton.Height = MyGrid.Height * 0.75;
        }
    }
}

编辑:可能需要使用网格的ActualHeight属性,而不是Height

v440hwme

v440hwme3#

您可以使用转换器并绑定Grid的“ActualHeight”属性来实现这一点。

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

zpqajqem4#

我成功地使用了以下代码:
1.使用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.将按钮的实际高度绑定到网格的高度+将转换器用作静态资源和转换器参数

主窗口.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>

不要忘记将转换器命名空间添加到xaml:

xmlns:converter="clr-namespace:WpfAppButtonSize"

下面的帖子也帮了我的忙:XAML Binding to a converter
谢谢大家的帮助。

相关问题