代码之家  ›  专栏  ›  技术社区  ›  benichka

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

  •  2
  • benichka  · 技术社区  · 7 年前

    我无法设置 Window 在WPF应用程序中,从XAML方面来看(如果我在代码隐藏中执行它,它就可以工作,但我想在XAML中执行所有操作)。
    这是一个非常基本的应用程序:单击一个按钮,按钮被禁用,进度条显示5秒(以下代码中不处理进度条)。
    由于代码中的一个变量,我成功地在单击时禁用了to按钮,但对于 不起作用。
    我的代码很简单:

    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>
    

    正如我所说,按钮被禁用的部分工作正常。但是,对于 什么都不做。
    即便如此,第一 <Setter Property="Height" Value="120" /> 应设置 到所需的高度,但如果我将其设置为200 仍然保持其原来的高度120。
    知道为什么吗?谢谢

    3 回复  |  直到 7 年前
        1
  •  1
  •   Rekshino    7 年前

    如果改变高度,可以改变高度 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>
    
        2
  •  1
  •   ASh aminescm    7 年前

    您正在设置本地值 Height="120" 用于窗口。本地值的优先级高于其他值,例如来自setter( <Setter Property="Height" Value="120" /> )。去除 高度=“120” 属性

    按钮的样式工作正常,因为IsEnabled仅通过setters设置。

    还有数据触发器

    <DataTrigger Binding="{Binding IsWaiting}" Value="False">
        <Setter Property="IsEnabled" Value="True" />
    </DataTrigger>
    

    是一种开销,可以删除,因为它只是重复默认setter

    <Setter Property="IsEnabled" Value="True" />
    
        3
  •  -2
  •   Dion Mul    7 年前

    您应该将窗口属性SizeToContent更改为“WidthAndHeight”