zoukankan      html  css  js  c++  java
  • 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();
    }
    导航

     效果如下:

  • 相关阅读:
    oracle 查询 主机名和对应的IP地址
    mysql 常用命令
    linux 下 mysql-5.5.8 安装
    oracle批量插入数据(测试)
    Oracle数据库查询优化(上百万级记录如何提高查询速度)
    针对分区表一个月3个分区定期清理脚本
    C语言中%p,%u,%lu都有什么用处
    MAC下查看环境变量的值的方法
    Mac 终端 Linux 命令总结(简单命令)
    TypeScript学习-TypeScript环境配置
  • 原文地址:https://www.cnblogs.com/ShengM/p/4198140.html
Copyright © 2011-2022 走看看