本文专用于记录WPF开发中的小细节,作为备忘录使用。

1. 关于绑定:

Text ="{Binding AnchorageValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"

2. 关于ListBox的样式

  //第一种
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
</Style.Resources>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>

//第二种

<Style TargetType="ListBoxItem">
     <Style.Resources>
                  <!--SelectedItem with focus-->
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#C7C7C7" />
       <!--SelectedItem without focus-->
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#C7C7C7" />
     </Style.Resources>
                 <!-- 设置触发器 -->
     <Style.Triggers>
       <Trigger Property="IsSelected" Value="true">
             <Setter Property="Background" Value="#C7C7C7"/>
             <Setter Property="Foreground" Value="Black"/>
       </Trigger>
       <Trigger Property="IsFocused" Value="true">
             <Setter Property="Background" Value="#C7C7C7"/>
             <Setter Property="Foreground" Value="Black"/>
       </Trigger>
     </Style.Triggers>
  </Style>

3. DataGrid数据添加折叠

Resource:

  <ResourceDictionary>
<Style x:Key="GridGroupHeadStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="GroupExpander" IsExpanded="True" >
<Expander.Header>
<TextBlock Foreground="SlateBlue" FontSize="">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} ({1})">
<Binding Path="Name"/>
<Binding Path="ItemCount"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary> //还有一种样式:
  <ResourceDictionary>           
       <Style x:Key="GridGroupHeadStyle" TargetType="{x:Type GroupItem}">
           <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                         <Expander x:Name="GroupExpander" IsExpanded="True">
                             <Expander.Style>
                                  <Style TargetType="{x:Type Expander}">
                                        <Setter Property="Background" Value="CornflowerBlue"/>
                                  </Style>
                             </Expander.Style>
                          <Expander.Header>
                          <TextBlock Foreground="Black"  FontWeight="ExtraBold" FontSize="12" Text="{Binding Path=Name}"/>
                        </Expander.Header>
                          <ItemsPresenter />
                       </Expander>
                   </ControlTemplate>
               </Setter.Value>
           </Setter>
         <Setter Property="Background" Value="Gainsboro"></Setter>
     </Style>
  </ResourceDictionary>
 //还有一种样式:
  <ResourceDictionary>
      <Style x:Key="GridGroupHeadStyle" TargetType="{x:Type GroupItem}">
             <Setter Property="Template">
                  <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander x:Name="GroupExpander" IsExpanded="True" FlowDirection="RightToLeft">
                                <Expander.Style>
                                    <Style TargetType="{x:Type Expander}">
                                        <Setter Property="Background" Value="CornflowerBlue"/>
                                    </Style>
                                </Expander.Style>
                                <Expander.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=DataContext.Name}"
                                                   Width="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=ActualWidth}"
                                                   Margin="-30,0,0,0"
                                                   FlowDirection="LeftToRight">
                                        </TextBlock>
                                    </DataTemplate>
                                </Expander.HeaderTemplate>
                                <ItemsPresenter FlowDirection="LeftToRight"/>
                            </Expander>
                      </ControlTemplate>
                  </Setter.Value>
           </Setter>
       <Setter Property="Background" Value="Gainsboro"></Setter>
    </Style>
</ResourceDictionary>

DataGrid:  需要注意的是DataGrid的ItemsSource绑定的是ViewModel中的Groups而不是Info

<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GridGroupHeadStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>

ViewModel: 这里的PropertyGroupDescription填写的是你分组所依据的字段,并且是存在于<Model>中的。

public ObservableCollection<Model> Info { get; set; }

public ListCollectionView Groups { get; set; }

Groups = new ListCollectionView(Info);
Groups.GroupDescriptions.Add(new PropertyGroupDescription("Your Group Name"));

4. KeyboardNavigation.TabIndex

 <TextBlock
Grid.Row=""
Grid.Column=""
VerticalAlignment="Center"
Height="" Margin="0,17" KeyboardNavigation.TabIndex="" >
<Hyperlink x:Name="registerHyperlink" Click="Hyperlink_Click" KeyboardNavigation.TabIndex="">
<Run Text="点此注册"/>
</Hyperlink>
</TextBlock>

5. Button设置IsDefault=“true”则可以按Enter键触发这个按钮

6. DataGrid有些列需要ToolTip,最好的方法是重新Template。不建议DataGrid.CellStyle全部统一加上ToolTip,因为值所在列内容较短根本不需要ToolTip。

 <DataGridTemplateColumn Width="0.6*"  Header="设置名称" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" ToolTip="{Binding Name}" FontSize="" VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

7. 假设一个DataGrid的一列全是button,建议不在Model中去实现button的功能,而是在ViewModel中统一用一个命令去完成,界面上必须这样做:

Command命令为UninstallCmd,写在ViewModel里

<UserControl.Resources>
<ResourceDictionary>
<DataTemplate x:Key="btnTemplate">
<Button Margin="" Content="卸载" Command="{Binding Path=DataContext.UninstallCmd,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid}}" CommandParameter="{Binding Isbn}" />
</DataTemplate>
</ResourceDictionary>
</UserControl.Resources> <DataGrid Name="dataGrid" Grid.Row="" Margin="5,5"
ItemsSource="{Binding Path=Isbns}"
Background="White"
AlternatingRowBackground="#EBEBEB"
SelectionMode="Single"
CanUserSortColumns="False"
CanUserAddRows="False"
AutoGenerateColumns="False"
CanUserReorderColumns="False"
CanUserResizeColumns="True" > <DataGrid.Columns>
<DataGridTemplateColumn Header="是否卸载" Width="Auto" CellTemplate="{StaticResource btnTemplate}"/>
</DataGrid.Columns>
</DataGrid>

8. 在一些界面中使用PreviewMouseLeftButtonDown或者MouseLeftButtonDown会没有反应,这时候就只能使用PreviewMouseLeftButtonUp事件了。

 <i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewMouseLeftButtonUp">
<i:InvokeCommandAction Command="{Binding ChangeDisplayCmd}"/>
</i:EventTrigger>
</i:Interaction.Triggers>

9. DataGrid的ColumnHeader需要绑定整个界面ViewModel的某一个属性,而不是DataGrid.ItemsSource中的值:

下面这个例子的DataGridTextColumn的Header绑定的就是界面ViewModel的ColorConfig属性。

<DataGridTextColumn  Binding="{Binding SectionName}"  IsReadOnly="True" Width="Auto" ElementStyle="{StaticResource standardCell}" MinWidth="">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.ColorConfig, RelativeSource={RelativeSource AncestorType=DataGrid}}" VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>

10. Image后台绑定时需要的是BitMapImage而不是简单的图片路径string,需要写Converter

//Xaml Code
<converters:MyConverter x:Key="MyImageConverter" FolderName="MyFolder"/> <Image Grid.Row="" VerticalAlignment="Stretch" gif:ImageBehavior.AnimatedSource="{Binding MyImageSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,Converter={StaticResource MyImageConverter}}"/>
  //Converter Code
public class MyConverter : IValueConverter
{
public string FolderName { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
if (((string) value).Contains("SpecialText"))
{
return new BitmapImage(new Uri(value as string, UriKind.Absolute));
}
else
{
string uriString = $"pack://application:,,,/{Assembly.GetExecutingAssembly().GetName()};component/Resources/Image/{FolderName}/{value}";
return new BitmapImage(new Uri(uriString));
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}

11. Datagrid的水平及竖向网格都为虚线

 <DataGrid.HorizontalGridLinesBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="3,0" MappingMode="Absolute" SpreadMethod="Repeat">
<GradientStop Offset="" Color="Black"/>
<GradientStop Offset="0.5" Color="Black"/>
<GradientStop Offset="0.5" Color="Transparent"/>
<GradientStop Offset="" Color="Transparent"/>
</LinearGradientBrush>
</DataGrid.HorizontalGridLinesBrush>
<DataGrid.VerticalGridLinesBrush>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,3" MappingMode="Absolute" SpreadMethod="Repeat">
<GradientStop Offset="" Color="Black"/>
<GradientStop Offset="0.5" Color="Black"/>
<GradientStop Offset="0.5" Color="Transparent"/>
<GradientStop Offset="" Color="Transparent"/>
</LinearGradientBrush>
</DataGrid.VerticalGridLinesBrush>

12. 当ListBox自定义Template时我们会发现,点选ListBox会出现两个选中项,但是我们已经设置了ListBox的SelectionMode为Single。我们需要对ListBox的Template中的控件做一些Style设置:

<TextBox Grid.Column="" Width="" Height=""
VerticalAlignment="Center"
FontSize=""
Text="{Binding LowestHeight,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
TextChanged="LowHeight_TextChanged"> <TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="IsHitTestVisible" Value="False" />
<Style.Triggers>
<DataTrigger
Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ListBoxItem}, AncestorLevel=}}"
Value="True"><Setter Property="IsHitTestVisible" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>

13.Button的Style如何重写才能有效

<Style x:Key="BtnStyle" TargetType="{x:Type Button}">
<Setter Property="Control.Background" Value="Red"></Setter>
<Setter Property="Control.Foreground" Value="White"></Setter>
<Setter Property="Template">
  <Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
   </Setter.Value>
</Setter>
</Style>

【WPF】日常笔记(持续更新)的更多相关文章

  1. mysql日常笔记(持续更新)

    常用场景 sql_mode问题:http://blog.csdn.net/ccccalculator/article/details/70432123 连续日期补全/数据补零操作 在不使用存储过程和函 ...

  2. BLE资料应用笔记 -- 持续更新

    BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...

  3. [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)

    持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...

  4. react-native-storage 使用笔记 持续更新

    React-native-storage是在AsyncStorage之上封装的一个缓存操作插件库,刚开始接触这个也遇到了一些问题,在这里简单记录总结一下,碰到了就记下来,持续更新吧 1.安卓下stor ...

  5. web前端开发随手笔记 - 持续更新

    本文仅为个人常用代码整理,供自己日常查阅 html 浏览器内核 <!--[if IE]><![endif]--> <!--[if IE 6]><![endif ...

  6. 数据分析之Pandas和Numpy学习笔记(持续更新)<1>

    pandas and numpy notebook        最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...

  7. BLE资料应用笔记 -- 持续更新(转载)

    简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.’让我们’更深入地探索这些方面吧. 蓝牙无处不在—,您可以在几乎每一台电话.笔记本电脑 .台式电脑和平板电脑中找到蓝牙.因此,您可以便利地连接键盘 ...

  8. Semantic ui 学习笔记 持续更新

    这个semantic 更新版本好快~ 首先是代码的标识<code></code> 具体样式就是红框这样的 圈起来代码感觉不错 不过要在semantic.css里在加上如下样式~ ...

  9. Git学习笔记(持续更新)

    1.强制同步为远程的代码 远程仓库回退了commit的情况下(第2条描述之情况),强制同步远程的代码到本地 #更新远程最新的所有代码,但是不merge或者rebase git fetch --all ...

  10. Codeforces/TopCoder/ProjectEuler/CodeChef 散题笔记 (持续更新)

    最近做到了一些有趣的散题,于是开个Blog记录一下吧… (如果有人想做这些题的话还是不要看题解吧…) 2017-03-16 PE 202 Laserbeam 题意:有一个正三角形的镜子屋,光线从$C$ ...

随机推荐

  1. javaweb(三十八)——mysql事务和锁InnoDB(扩展)

    MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就My ...

  2. commons fileupload上传报错

    这个问题困扰我好久了一直没有找到解决方法,先记录下来. 生产环境(简称A)上老是出错,而测试环境(简称B)一切正常. 我们的框架是JAVA语言编写,基于struts1技术总监自己搭的框架,我在stru ...

  3. Python和Pycharm的安装

    目录 安装Python 安装Pycharm IDE 破解Pycharm 用Pycharm创建Python工程 安装Python 去Python官网下载Python软件,网址:https://www.p ...

  4. python的pip升级问题

    近来由于pip升级为10.0.1了,导致使用pip命令报错,使用过很多方法,最终找到一种相对靠谱的方法,一下是步骤: 进入https://pypi.python.org/pypi/pip 下载pip- ...

  5. 自己动手做AI:Google AIY开发工具包解析

    2018年国际消费性电子展(CES)上,最明显的一个趋势是Amazon与Google的语音技术进驻战,如AmazonAlexa进驻到Acer笔电内,Google Assist进驻到KIA汽车内,其他如 ...

  6. django中model字段与属性

    model field 类型1.AutoField     一个自增的IntegerField,一般不直接使用,Django会自动给每张表添加一个自增的primary key. 2.BigIntege ...

  7. 从零开始的Python学习Episode 13——常用模块

    模块 一.time模块 时间戳(timestamp) :时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 元组(struct_time)   :struct_time元组共有9 ...

  8. 从零开始的Python学习Episode 8——深浅拷贝

    深浅拷贝 一.浅拷贝 列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存.当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数 ...

  9. 数据库MySql在python中的使用

    随着需要存储数据的结构不断复杂化,使用数据库来存储数据是一个必须面临的问题.那么应该如何在python中使用数据库?下面就在本篇博客中介绍一下在python中使用mysql. 首先,本博客已经假定阅读 ...

  10. Qt类继承关系图

    分享两个资源,对于系统了解Qt框架的整体脉络很有帮助. Qt4类关系图+Qt5类关系图,PDF+JPG格式 [下载] Qt5类关系图(基于Qt5.1版),JPG格式[下载]