zoukankan      html  css  js  c++  java
  • SilverLight之路(十)

    这节我们看看“基金行情”表格中的细节,比如以不同颜色显示涨或跌;以横线显示没有值的数据等。

    我们的表格是要体现基金的走势的,和股市一样,红色表示上涨,绿色表示下跌等,效果如

     

    这个使用我们在“客户管理”中介绍的StringFormat就不行了,这里就要使用值转换器了。值转换器其实就是一个IValueConverter,它要求实现两个方法

    Convert:表示数据由源向目标的转换

    ConvertBack:表示数据由目标向源的转换(只在绑定为双向时才使用)

    那么这里我要转换的目标值是颜色,我们的判断依据是数值,怎么做呢?看代码

    View Code
    public class IncomeColorConverter : IValueConverter

    {

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    {

    decimal syl;

    if (value == null) return new SolidColorBrush(Colors.White);

    if (Decimal.TryParse(value.ToString(), out syl))

    {

    if(syl>0)

    return new SolidColorBrush(Colors.Red);

    else if (syl < 0)

    return new SolidColorBrush(Colors.Green);

    else

    return new SolidColorBrush(Colors.White);

    }

    else

    {

    return new SolidColorBrush(Colors.White);

    }

    }



    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    {

    throw new NotImplementedException();

    }

    }
    <TextBlock Text="{Binding 三个月收益}" Foreground="{Binding 三个月收益, Converter={StaticResource IncomeColorConverter}}"/>

    这样就可以进行正常转换了,且效果也是我们想要的。(其实这里大可不必每次都去new,我是范懒了,呵呵)

    同理,如果我们想在数据为空时以其它形式表现出来,比如两个小横线这样的要求,也可以使用转换器进行,方法是一样的,而且不会给排序带来问题,当然前提是你的数据源是正确的数据类型。但如果因为某种原因数值是以字符串来表示的,就像我这里这样,就会有问题了,那么解决办法也很简单,给列指定SortMemberPath属性,并且在数据源中增加一个数值型的属性成员,在访问处理器中进行数据转换就可以了,代码如

    private string _一个月收益;

    public string 一个月收益

    {

    set

    {

    _一个月收益
    = value;

    Decimal d;

    if (Decimal.TryParse(value, out d))

    一个月收益_Dec
    = d;

    else

    一个月收益_Dec
    = null;

    }

    get { return _一个月收益; }

    }

    public Decimal? 一个月收益_Dec { set; get; }

    完整的前台代码如

    <sdk:DataGridTemplateColumn Header="一个月收益率" IsReadOnly="True" SortMemberPath="一个月收益_Dec">
    <sdk:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <TextBlock Text="{Binding 一个月收益, Converter={StaticResource IncomeTextConverter}}" Foreground="{Binding 一个月收益, Converter={StaticResource IncomeColorConverter}}"/>
    </DataTemplate>
    </sdk:DataGridTemplateColumn.CellTemplate>
    </sdk:DataGridTemplateColumn>

    这样就解决了颜色显示,格式化显示以及排序问题了。

    这里提一下我在做WPF时遇到的一个问题,我用WPF做了一个类似sql server的查询分析器,表格列是自动生成的,即AutoGeneratingColumn,当某一列的内容超长时,如文章内容列,则默认情况下,datagrid会自适应大小,这样这一列的单元格就被撑的好大,不利于查看,行高可以设置,有直接属性,但列宽似乎不行,于是辗转反侧了好久,最后找到了一个办法,代码如

     

    void gridResult_LoadingRow(object sender, DataGridRowEventArgs e)

    {

    e.Row.Loaded
    += new RoutedEventHandler(Row_Loaded);

    e.Row.Header
    = e.Row.GetIndex() + 1;

    }


    void Row_Loaded(object sender, RoutedEventArgs e)

    {

    foreach (DataGridColumn dc in this.gridResult.Columns)

    {

    if (dc.ActualWidth > 300)

    dc.Width
    = 300;

    }

    }

    不知道这个问题在sl中有木有,至少在我们“基金行情”与“客户管理”中没遇到。

    这个界面数据量并不是很大,但当从服务器获取时也是有一定的延迟的。那做一个屏蔽好了,比如一个等待窗体,这里可以使用ChildWindow来实现。

     

    实现代码,如加载时 

    cw.HasCloseButton = false;

    cw.Height
    = 100;

    cw.Width
    = 300;

    cw.Content
    = "正在加载数据。。。";

    cw.Show();

     

    加载完成后再cw.Close();

    默认情况下它会有一个背景遮罩层来覆盖全屏幕,当然这个遮罩也是可以设置的,如

     

    更多细节可以参考

     

  • 相关阅读:
    android自定义视图
    CISCO PVST+配置和结果验证 per vlan spanning tree(51cto 实验10)
    读入a,b当a,b不同时为零时结束
    跨交换机VLAN 配置和结果验证(51cto :实验9)
    单交换机VLAN 配置和结果验证(51cto-o8)
    cocos2d(1)
    servlet-session
    Servlet-servletContext
    mysql数据库从windows迁移到linux,或者linux迁移到windows教程
    linux (centos) 安装MySql详细教程!!实战详解
  • 原文地址:https://www.cnblogs.com/meteortent/p/2085156.html
Copyright © 2011-2022 走看看