初学WPF 随项目笔记 (一)

本人刚刚实习,来公司做一个WCF加WPF 一个充当客服端一个充当服务端,WCF 用的三层架构,WPF 框架,今天被师傅说了,说是最好用MVVM不然当数据量增大系统运行卡顿,刚才做项目foreach循环过多不好,说是要优化代码,多用算法,可是我不会啊,唉,我也很想学的,以后慢慢加油吧,下面是我自己做项目时遇到的小知识点。都是一边做项目一边拿这记事本记录的。分享一下。 



WPF 随手笔记


ScrollViewer.CanContentScroll="False" // 修改ListBox 滚动条平滑度


Cursor 鼠标移动到该控件上 更改鼠标样式


WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)&nbsp


如第一个示例所示,如果将 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);
                }
            }
        }



分享给一些想我一样的初学者加油。

当程序员也不能总是趴在电脑桌前,多运动多看书多看电影多听歌 哈哈






















































































  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值