WPF界面XAML中的if……else……

时间:2021-06-19 13:13:53

xaml本身并不支持if……else……,要用Converter替代if……else……来实现我们想要的效果,知者请速离开,不要浪费时间

 
需求:按照Window的WindowState来决定Grid的颜色,如果是最大化就显示红色,否则蓝色
思路:
1.首先想到的是触发器,但这里我们不用触发器来实现,因为在某些场合我们无法简单的用触发器来实现或者过程曲折。
2.在CS后台代码里通过事件之类的来实现。业务跟界面混在一起了(没毛病,但总感觉有瑕疵,心里不爽)。
3.用Converter实现IValueConverter
    public class ColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            WindowState state = (WindowState)value;
            if(state == WindowState.Maximized)
            {
                , , , ));
            }
            else
            {
                , , , ));
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

前台调用

<Window x:Class="WpfApp2.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:WpfApp2"
        mc:Ignorable="d"
        Title="
        Name="window">
    <Window.Resources>
        <local:ColorConverter x:Key="ColorConverter"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid Background="{Binding ElementName=window, Path=WindowState, Converter={StaticResource ColorConverter}}"/>
    </Grid>
</Window>
应用场合:
比如我们需要重新定制Window的外观,在定制最大化还原按钮 btnMaxNormal 的时候
如果当前 WindowState=Normal,鼠标悬停在按钮上方时,需要显示一个从小变大的 图标
如果当前 WindowState=Max,鼠标悬停在按钮上方时,需要显示一个从大变小的 图标
这个需求用触发器就不太好实现了,或者我不知道怎样实现。But Converter is OK.