WPF那些事儿

概述

感觉学习的东西必须做个记录,不然很快就忘掉了。现在把WPF学习过程中一些零碎的东西记录在下面,没有具体的主题,想到啥、看到啥都写在这里,算是复习一下并做个备忘吧。

1. 等待对话框

看到同事做的项目中需要一个等待对话框大致如下:

同事用定时器实现了这个效果,实际在WPF中,这个效果可以很容易通过动画实现。

<Grid>
    <TextBlock x:Name="searchTextBlock"
               HorizontalAlignment="Center"
               VerticalAlignment="Center"
               FontFamily="微软雅黑"
               FontSize="24">
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="TextBlock.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <StringAnimationUsingKeyFrames Duration="0:0:1.6"
                                                       RepeatBehavior="Forever"
                                                       Storyboard.TargetName="searchTextBlock"
                                                       Storyboard.TargetProperty="(TextBlock.Text)">
                            <DiscreteStringKeyFrame KeyTime="0:0:0" Value="正在查询" />
                            <DiscreteStringKeyFrame KeyTime="0:0:0.4" Value="正在查询." />
                            <DiscreteStringKeyFrame KeyTime="0:0:0.8" Value="正在查询.." />
                            <DiscreteStringKeyFrame KeyTime="0:0:1.2" Value="正在查询..." />
                        </StringAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBlock.Triggers>
    </TextBlock>
</Grid>

2. XAML中的特殊字符

2.1 在XAML中设置“{”和"}"

3. 静态资源当作元素使用

如果不设置x:Shared="false"(默认情况x:Shared="true"),这个资源将只有一个实例,不能使用多次(因为不能是多个Visual对象的子元素或者CompositionTarget的根元素)

4. 同步选中项

如果多个选择控件(ListBox、ComboBox)绑定到同一个集合,可以通过设置"IsSynchronizedWithCurrentItem"让这些控件的选中项保持一致,但是如果有多个选中项,则目前只有第一项会保持一致

<StackPanel>
    <ListBox DisplayMemberPath="Name"
             IsSynchronizedWithCurrentItem="True"
             ItemsSource="{Binding Students}" />
    <ListBox DisplayMemberPath="Age"
             IsSynchronizedWithCurrentItem="True"
             ItemsSource="{Binding Students}" />
    <ComboBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Students}" />
</StackPanel>
同步选中项

5. 定义一个集合的视图

如果把一个集合绑定到一个ItemsControl,则会在ItemsControl和集合之间插入视图,可以对视图进行排序、分组、过滤、导航等操作。

5.1 排序、分组、过滤和导航

分组需要为ItemsControl指定一个GroupStyle。

var view = CollectionViewSource.GetDefaultView(this.Students);

if (view.SortDescriptions.Count > 0
    && view.SortDescriptions[0].PropertyName == "Age"
    && view.SortDescriptions[0].Direction == ListSortDirection.Ascending)
{
    view.SortDescriptions.Clear();
    view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Descending));
}
else
{
    view.SortDescriptions.Clear();
    view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));
}
排序
var view = CollectionViewSource.GetDefaultView(this.Students);

if (view.GroupDescriptions.Count > 0)
{
    view.GroupDescriptions.Clear();
}
else
{
    view.GroupDescriptions.Add(new PropertyGroupDescription("Birthday",
        new DateTimeToDateConverter()));
}
分组 
<ListBox.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <Border BorderBrush="Black" BorderThickness="1">
                    <TextBlock FontWeight="Bold" Text="{Binding Name}" />
                </Border>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ListBox.GroupStyle>
分组Style 
var view = CollectionViewSource.GetDefaultView(this.Students);

if (view.Filter != null)
{
    view.Filter = null;
}
else
{
    view.Filter = obj => ((Student)obj).Name == "Jim";
}
过滤  
var view = CollectionViewSource.GetDefaultView(this.Students);
view.MoveCurrentToPrevious();

if (view.IsCurrentBeforeFirst)
{
    view.MoveCurrentToLast();
}
导航

 效果如下:

 

posted @ 2015-03-12 19:25  ShengM  阅读(1016)  评论(0编辑  收藏  举报