本人刚刚实习,来公司做一个WCF加WPF 一个充当客服端一个充当服务端,WCF 用的三层架构,WPF 框架,今天被师傅说了,说是最好用MVVM不然当数据量增大系统运行卡顿,刚才做项目foreach循环过多不好,说是要优化代码,多用算法,可是我不会啊,唉,我也很想学的,以后慢慢加油吧,下面是我自己做项目时遇到的小知识点。都是一边做项目一边拿这记事本记录的。分享一下。
WPF 随手笔记
ScrollViewer.CanContentScroll="False" // 修改ListBox 滚动条平滑度
Cursor 鼠标移动到该控件上 更改鼠标样式
WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute) 
如第一个示例所示,如果将 TargetType 属性设置为 TextBlock 而不为样式分配 x:Key,样式就会应用于所有 TextBlock 元素。
这种情况下,x:Key 隐式设置为 {x:Type TextBlock}。这意味着,如果将 x:Key 值显式设置为 {x:Type TextBlock} 之外的任何值,
Style 就不会自动应用于所有 TextBlock 元素。此时,必须通过使用 x:Key 值,将样式显式应用于 TextBlock 元素。如果样式位于资源部分
,并且未设置样式的 TargetType 属性,则必须提供 x:Key。
除了提供 x:Key 的默认值之外,TargetType 属性还指定要应用 setter 属性的类型。
如果未指定 TargetType,则必须通过语法 Property="ClassName.Property",用类名限定 Setter 对象的属性。
例如,必须将 Property 设置为 "TextBlock.FontSize" 或 "Control.FontSize",而不要设置 Property="FontSize"。 //http://blog.sina.com.cn/s/blog_3ef2364d0102vxmm.html
StackPanel 是以堆叠的方式显示在其中的控件 可以用Orientation 属性更改堆叠的顺序
Dockpanel 以上下左右为基本结构的布局方式
Grid是以表格形式组织控件的一种布局方式:WPF中的Grid 支持单元格的和合并 Grid的行和列可以自定义高度和宽度 Height="60*" 加星号表示再调整窗体大小的时候,大小或宽度 窗体的大小改变的比列进行缩放
Grid Split 分割 可是使用 GridSplit 结合Grid控件实现类似于Windows应用程序中SplitContainer 的功能
Uniformgrid 控件为空件提供了一种简单化的网格式布局,当控件添加到Uniformgrid 时 他们会排列在一个网格状中,该网格会自动调政府以是控件之间的距离保持均衡,以适应控件的数目。 扫雷模式
“形而上者谓之道,形而下者谓之器”,这句话出自《易经》,大意是我们能够观察到的世间万物形象之上的抽象的结果就是思维,而形象之下掩盖的就是其本质
WPF中的Template 分两大类:
ControlTemplate 是算法和内容的表现形式,一个空间怎么组织内部结构才能让他更符合业务逻辑,让用户操作起来更舒服就是由他来控制的,就是决定他长成了什么样子
DataTemplate 是数据内容的展示方式,一条数据显示成什么样子,是简单的文本还是直观的图形就由她来决定了。
Cursor="Hand" 当鼠标指向该控件时,鼠标光标发生变化
ScrollViewer 滚动条 <ItemsControl>子控件</ItemsControl>
实现空件外发光,可以在空间外层套<Border> 改变其透明度
{WPF的滤镜效果,目前框架自带的只有BlurEffect和DropShadowEffect两种。DropShadowEffect为投影效果,只能显示黑灰颜色的效果,如果想让一个边框达到别的颜色的滤镜效果,我们可以利用BlurEffect进行模糊处理实现。
实现原理主要是用两个Border进行叠加,第一个Border进行背景色的模糊效果处理,第二个Border设置背景色、边框色以及叠加在第一个Border上面。}
Background="Black" BorderBrush="Red"边框颜色 BorderThickness="5"边框粗细 发光https://www.cnblogs.com/muan/p/8051688.html
<Border Background="#770669af" Margin="110" CornerRadius="9">
<Border.Effect>
<BlurEffect Radius="4" KernelType="Box" RenderingBias="Quality"/>
</Border.Effect>
</Border>
<Border Background="White" Margin="110" CornerRadius="12" BorderBrush="#0669af" BorderThickness="1"/>
利用控件Effect属性 可是空间边框模糊
自定义 滚动条 https://www.cnblogs.com/anding/p/4987426.html
style BaseOn={ style: key } style可以继承 原有的style 如果设置的属性冲突那么就近原则
TargetType 属性 可以确定控件类型 被设置的属性将自动使用该样式 如果不想使用的话,则style{x:null}
触发器:
简单触发器,事件触发器 https://www.cnblogs.com/zhcw/archive/2013/01/12/2857433.html WPF触发器教学 https://www.cnblogs.com/zhangtao/archive/2011/03/29/1998315.html 详细
控件隐藏:修改Visibility为Collapsed或Hidden
Application.Current.Shutdown(); WPF中关闭所有程序
Rectangle 矩形 RadiusX 宽的锐角程度 RadiusY高的锐角程度 Stroke边框颜色 可变化圆润程度 Ellipse椭圆形 容器 height width可调整圆形 stroke边颜色
干货:
WPF GIF 实现
用wpf的mediaelement控件,这控件本身是用来显示视频的,但是可以拿来放gif,
这种方式有一个局限就是图片路径必须是绝对路径
<MediaElement Source="file://C:\129.gif" />
并且你还需要设置让他循环播放
<MediaElement Source="file://C:\129.gif" MediaEnded="MediaElement_MediaEnded"/>
private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
((MediaElement)sender).Position=((MediaElement)sender).Position.Add(TimeSpan.FromMilliseconds(1)); 只实用Win7以上的系统
}
WPF中动态显示时间
using system.windows.Threading
private Dispachertimer ShowTimer
public void ShowCurTimer(object sender, EventArgs e)
{
ShowTime();
} //时间
private void ShowTime()
{
//获得年月日
// this.tbDateText.Text = DateTime.Now.ToString("yyyy/MM/dd"); //yyyy/MM/dd
//获得时分秒
this.tbTimeText.Text = DateTime.Now.ToString("HH:mm:ss");
} //时间
public void Time()
{
ShowTimer = new System.Windows.Threading.DispatcherTimer();
ShowTimer.Tick += new EventHandler(ShowCurTimer);//起个Timer一直获取当前时间
ShowTimer.Interval = new TimeSpan(0, 0, 0, 1, 0);
ShowTimer.Start();
} // 时间
WPF 页面加载 TreeView 子节点全部打开
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
绑定TreeVIew 父节点
tree.Items.Clear();
ServiceReference1.BranchServiceClient branch = new ServiceReference1.BranchServiceClient();
ServiceReference1.BranchModel branchModel = new ServiceReference1.BranchModel();
branchModel.Fid = 0;
DataTable dt = branch.GetBranchuFid(branchModel);
foreach (DataRow drtemp in dt.Rows)
{
item1 = new TreeViewItem();
item1.Tag = drtemp["ID"].ToString();
item1.Header = drtemp["Name"].ToString();
tree.Items.Add(item1);
item1.IsExpanded = true;
}
TreeView 遍历节点传递数据时强制转换 TreeViewItem item = (TreeViewItem)tree.SelectedItem;用绑定是Add的数据类型接受 MessageBox.Show(item.Tag.ToString());
这个是师傅教的! 自己弄了两天也不会
链接数据库 递归实现 树状图遍历
public void TreeViewBind(DataTable dt,TreeView tr)
{
if (dt != null || dt.Rows.Count > 0) //判断一线有没有数据
{
//首先遍历父节点
TreeViewItem item;//wpf不再是节点了 改成item 其实是一样的
DataRow[] dr = dt.Select("FID='0'"); //判断一下啊 ,我用ParentID(父节点的值)这个是我定义好的要根据
// 这个读父节点的
if (dr.Length != 0)
{
foreach (DataRow drTemp in dr)
{
item = new TreeViewItem();
item.Tag = drTemp["ID"].ToString(); //一般绑定ID
item.Header = drTemp["Name"].ToString(); //名称
tr.Items.Add(item);
// item.IsExpanded = true;
BindNode(dt,item);
}
}
}
}
private void BindNode(DataTable dt, TreeViewItem item)
{
DataRow[] dr = dt.Select("FID = '" + item.Tag + "'");
if (dr.Length > 0)
{
foreach (DataRow drTemp in dr)
{
TreeViewItem childItem = new TreeViewItem();
childItem.Header = drTemp["Name"].ToString();
childItem.Tag = drTemp["ID"].ToString();
item.Items.Add(childItem);
// item.IsExpanded = true;
BindNode(dt, childItem);
}
}
}
分享给一些想我一样的初学者加油。
当程序员也不能总是趴在电脑桌前,多运动多看书多看电影多听歌 哈哈