XAML:无法使用setter或触发器设置“Window”属性

时间:2018-03-08 12:18:31

标签: c# wpf xaml

我无法在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. 知道为什么吗?感谢。

3 个答案:

答案 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”