【WPF】日常笔记
本文专用于记录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】日常笔记的更多相关文章
- .Net 转战 Android 4.4 日常笔记目录
.Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建 .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序 .Net 转战 Android 4.4 ...
- 【日常笔记】java文件下载返回数据流形式
@RequestMapping("/downloadFile") @ResponseBody public void download(String uploadPathUrl, ...
- 《深入浅出WPF》笔记——绘画与动画
<深入浅出WPF>笔记——绘画与动画 本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- WPF学习笔记-用Expression Design制作矢量图然后导出为XAML
WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...
- WPF 学习笔记-在WPF下创建托盘图标
原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...
- WPF 学习笔记-设置属性使窗口不可改变大小
原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...
- 《深入浅出WPF》笔记——事件篇
如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的)http://www.cnblogs.com/JimmyZhan ...
- WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决
原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...
- 《深入浅出WPF》笔记——资源篇
原文:<深入浅出WPF>笔记--资源篇 前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源.我们平时的“资源”一词是指“资财之源”,是创造人类社会财富的源泉.在计算机程 ...
随机推荐
- C# 多种方式发送邮件(附帮助类)
因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...
- 再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入
说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子) 中,介绍过采集用的工具,其实很Low的,分析 ...
- 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)
WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...
- Spark读写Hbase的二种方式对比
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...
- 利用注册表在右键添加VS15的快捷方式打开文件夹
1.简介 最近安装VS15 Preview 5,本版本可以打开"文件夹" 是否可以向Visual Studio Code一样在文件夹或文件右键菜单添加"Open with ...
- 代码的坏味道(21)——中间人(Middle Man)
坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- jQuery可自动播放动画焦点图插件Koala
Koala是一款简单而实用的jQuery焦点图幻灯片插件,焦点图不仅可以在播放图片的时候让图片有淡入淡出的动画效果,而且图片可以自动播放.该jQuery焦点图的每一张图片都可以设置文字描述,并浮动在图 ...
- interpreter(解释器模式)
一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用 ...
- 【干货分享】流程DEMO-事务呈批表
流程名: 事务呈批表 业务描述: 办公采购.会议费用等事务的申请.流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金 ...