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.