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();

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

     

    更多细节可以参考

     

  • 相关阅读:
    237. Delete Node in a Linked List
    430. Flatten a Multilevel Doubly Linked List
    707. Design Linked List
    83. Remove Duplicates from Sorted List
    160. Intersection of Two Linked Lists
    426. Convert Binary Search Tree to Sorted Doubly Linked List
    142. Linked List Cycle II
    类之间的关系
    初始化块
    明确类和对象
  • 原文地址:https://www.cnblogs.com/meteortent/p/2085156.html
Copyright © 2011-2022 走看看