Windows商店应用程序条件样式



我在StandardStyles中添加了一个样式。Xaml的定义如下:

        <TextBlock Name="txtStatus" Text="{Binding Status}" 
               Margin="10,2,0,0" Width="350" TextTrimming="WordEllipsis"/>

显示的文本将取决于绑定数据源的Status属性。我想在结束语前加上"Status:",这样结束语就像这样:" Status: Complete"。

我还想根据状态有一个条件颜色。在上面的例子中,我希望Completed是绿色的(状态字仍然是正常的颜色)。

我该怎么做呢?

对于条件样式,您必须使用数据绑定转换器。首先创建如下所示的新类。

public class StatusToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var _status = value.ToString();
        if (_status == "To Do")
            return new SolidColorBrush(Windows.UI.Colors.Red);
        else if (_status == "In Progress")
            return new SolidColorBrush(Windows.UI.Colors.Yellow);
        else if (_status == "Completed")
            return new SolidColorBrush(Windows.UI.Colors.Green);
        else
            return new SolidColorBrush(Windows.UI.Colors.White);
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

现在,当你想使用,添加它作为页面的资源,像这样

<Page.Resources>
    <local:StatusToColorConverter x:Key="StatusToColor"/>
</Page.Resources>

然后你必须使用TextBlock的前景属性中的转换器它是由Status约束的。它会根据Status返回合适的颜色。

您可以使用<Run />将文本与绑定文本合并。

<TextBlock Name="txtStatus"  Margin="10,2,0,0" Width="350" TextTrimming="WordEllipsis">
    <Run Text="Status :" /> <Run Text="{Binding Status}" Foreground="{Binding Status, Converter={StaticResource StatusToColor}}"/>
</TextBlock>

你也可以添加一个新的属性(StateColor)到你的DataContext,包装你的文本块在一个边界控件和绑定这个边界的背景属性(简单,但可能对MVVM,因为你得到一些UI的东西到你的视图模型)。

另一种实现目标的方法是使用一个样式选择器,参见:http://zamjad.wordpress.com/2010/01/01/applying-style-conditionally/http://blogs.u2u.be/diederik/post/2012/05/22/Using-Dynamic-XAML-in-Windows-8-Metro.aspx

欢呼,亚历克斯

最新更新