我无法在XAML端设置WPF应用程序中Window
的高度(如果我在后面的代码中执行它,它可以工作,但我想在XAML中执行所有操作)。 />
这是一个非常基本的应用程序:单击按钮,按钮被禁用,进度条显示5秒(进度条未在以下代码中处理)。
由于后面的代码中的变量,我设法在点击时禁用按钮,但是Window
的相同机制不起作用。
我的代码背后,非常简单:
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows;
namespace WpfProgressBarXaml
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
private bool _IsWaiting;
/// <summary>Property indicating whether the program is in wait mode or not.</summary>
public bool IsWaiting
{
get { return this._IsWaiting; }
set
{
this._IsWaiting = value;
OnPropertyChanged("IsWaiting");
}
}
public MainWindow()
{
IsWaiting = false;
DataContext = this;
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
IsWaiting = true;
await Task.Delay(5000);
IsWaiting = false;
}
}
}
我的XAML:
<Window x:Class="WpfProgressBarXaml.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:WpfProgressBarXaml"
mc:Ignorable="d"
x:Name="mainWindow"
Title="Progress bar test" Height="120" Width="250">
<!-- style for window doesn't work. -->
<Window.Style>
<Style TargetType="{x:Type Window}">
<Setter Property="Height" Value="120" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsWaiting}" Value="True">
<Setter Property="Height" Value="150" />
</DataTrigger>
<DataTrigger Binding="{Binding IsWaiting}" Value="False">
<Setter Property="Height" Value="120" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Style>
<Grid x:Name="mainGrid">
<Grid.RowDefinitions>
<RowDefinition Height="80" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button x:Name="myButton" Grid.Row="0" Margin="10, 10, 10, 10" Content="Click to wait" Height="50" Width="100" Click="Button_Click">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsWaiting}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding IsWaiting}" Value="False">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</Window>
正如我所说,按钮被禁用的部分有效。但是,Window
的相同机制没有做任何事情
即便如此,第一个<Setter Property="Height" Value="120" />
应该将Window
设置为所需的高度,但如果我将其设置为200,那么Window
仍然保持其原始高度为120. >
知道为什么吗?感谢。
答案 0 :(得分:1)
如果您更改MinHeight
中的 DataTrigger
并为SizeToContent
设置 Window
,则可以更改身高至少 Height
或WidthAndHeight
。
<Style.Triggers>
<DataTrigger Binding="{Binding IsWaiting}" Value="True">
<Setter Property="MinHeight" Value="150" />
</DataTrigger>
<DataTrigger Binding="{Binding IsWaiting}" Value="False">
<Setter Property="MinHeight" Value="120" />
</DataTrigger>
</Style.Triggers>
答案 1 :(得分:1)
您正在为Window设置本地值Height="120"
。本地值的优先级高于其他值,例如来自setter(<Setter Property="Height" Value="120" />
)。删除Height="120"
属性
Button的样式正常工作,因为IsEnabled只能通过setter设置。
也是DataTrigger
<DataTrigger Binding="{Binding IsWaiting}" Value="False">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
是一个开销,可以删除,因为它只是重复defaul setter
<Setter Property="IsEnabled" Value="True" />
答案 2 :(得分:-2)
您应该将窗口属性SizeToContent更改为“WidthAndHeight”