WPF 做项目的随手笔记

本人刚刚实习,现在用WPF和WCF 做一个系统,由于没有接触过这两样技术所以每次做项目都要用笔记本来记录一下当天的新的知识点,分享给新人。 WPF 要用MVVM架构可是我还没有使用,本人WCF中用的是三层架构,在学习的过程中一定要把底层搞懂多算法会灵活运用,两天没弄会的动西,被师傅用递归5分钟搞定,还是要多学习。



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);
                }
            }
        }

增加一个小案例 


很好的一个,刚才师傅发给我的


前台:
 <TreeView x:Name="tree" ItemsSource="{Binding Nodes}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type local:TreeNodeInfo}" ItemsSource="{Binding Path=Nodes}">
                    <TextBlock Text="{Binding Name}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>


后台:

  public partial class MainWindow : Window
    {
        SortedDictionary<string, TreeNodeInfo> nodeList = new SortedDictionary<string, TreeNodeInfo>();


        public MainWindow()
        {
            InitializeComponent();


            DataTable dt = new DataTable();
            dt.Columns.Add("ID");
            dt.Columns.Add("Name");
            dt.Columns.Add("ParentID");
            dt.Rows.Add("1", "研发部", "0");
            dt.Rows.Add("2", "技术部", "0");
            dt.Rows.Add("3", "销售部", "0");
            dt.Rows.Add("4", "硬件组", "1");
            dt.Rows.Add("5", "软件组", "1");
            dt.Rows.Add("6", "软件组一", "5");
            dt.Rows.Add("7", "Test", "6");
            TreeNodeInfo rootNode = new TreeNodeInfo();
            rootNode.ID = "0";


            nodeList.Add("0", rootNode);
            foreach (DataRow row in dt.Rows)
            {
                string id = row["ID"].ToString();
                if (!nodeList.ContainsKey(id))
                {
                    nodeList.Add(id, new TreeNodeInfo() { ID = id, Name = row["Name"].ToString(), ParentID = row["ParentID"].ToString() });
                }
            }
            foreach (var node in nodeList.Values)
            {
                TreeNodeInfo tnParent = null;
                if (!string.IsNullOrEmpty(node.ParentID))
                {
                    if (nodeList.TryGetValue(node.ParentID, out tnParent))
                    {
                        tnParent.Nodes.Add(node);
                    }
                }
            }


            this.DataContext = rootNode;


        }
    }


    public class TreeNodeInfo : INotifyPropertyChanged 
    {
        public string ID { get; set; }
        public string name = "";
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                RaisePropertyChanged("Name");
            }
        }
        public string ParentID { get; set; }


        private ObservableCollection<TreeNodeInfo> nodes = new ObservableCollection<TreeNodeInfo>();
        public ObservableCollection<TreeNodeInfo> Nodes
        {
            get
            {
                return nodes;
            }
        }


        public void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;
 
    }




多看书,多运动,多看电影,多听歌,做一个阳光的程序员,不要一说起来程序员都是死肥宅。。。

加油
























































































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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值