C# WPF记录

学习博客

A way to use triggers anywhere in WPF

WPF快速入门教程之绑定Binding
WPF PATH语法详解
WPF 用户控件(UserControl)
WPF教程(一)CLR属性和依赖属性
INotifyPropertyChanged接口的详细说明

0.0 UI框架

ModernWpf
PanuonUI.Silver
HandyControl
MahApps.Metro
MaterialDesignInXamlToolkit
AduSkin
PanuonUI.Silver
LiveCharts2(图表)
Avalonia (类WPF,跨平台)
Newbeecoder.UI

0.1 多语言

WPF 本地多语言总结

1 DataContext

WPF入门(1)——DataContext
WPF教程(三十五)使用DataContext
WPF中 ItemsSource 和DataContext不同点
DataContext就是设置使用 Binding 时,变量的查找范围,对应的类必须是继承自INotifyPropertyChanged
如下:Samples的查找范围就是home:HomeViewModel

<controls:MetroWindow.DataContext>
        <home:HomeViewModel></home:HomeViewModel>
    </controls:MetroWindow.DataContext>
<ItemsControl Margin="0,0,-12,0" ItemsSource="{Binding Samples}" >

DataContext可通过XAML前台UI文件设定,也可通过C#语言后台设定
通过XAML前台UI文件设定:可在设计页面直接查看效果

<Grid.DataContext>
            <Binding Source="{StaticResource myData1}" />
</Grid.DataContext>

<controls:MetroWindow.DataContext>
        <home:HomeViewModel></home:HomeViewModel>
</controls:MetroWindow.DataContext>

 <UserControl.DataContext>
        <local:DropDownViewModel></local:DropDownViewModel>
    </UserControl.DataContext>
    

通过C#语言后台设定:程序运行后,才可以查看效果

 public partial class HomeView : MetroWindow
    {
        public HomeView()
        {
            InitializeComponent();
            DataContext = new HomeViewModel();
        }
	}
public partial class DataContextSample : Window
        {
                public DataContextSample()
                {
                        InitializeComponent();
                        this.DataContext = this;
                }
        }

1.1 UserControl的DataContext设置

  1. 在 XAML文件中设置DataContext
<!--UserControl.Resources 必须放在UserControl.DataContext之前-->
<!--UserControl.Resources 相当于实例化EventWaveViewModel-->
<UserControl.Resources>
 <vm:EventWaveViewModel x:Key="EventWaveViewModel" />
</UserControl.Resources>
<UserControl.DataContext>
 <Binding Source="{StaticResource EventWaveViewModel}" />
</UserControl.DataContext>
<!--控件绑定数据-->
<d3:LineGraph x:Name="linegraphUA"
              Description="UA"
              Stroke="{Binding UAStrock, Mode=TwoWay }"
              StrokeThickness="1"/>
  1. 在cs文件中设置DataContext
public partial class EventWaveView : UserControl
{
	//实例化EventWaveViewModel 
	EventWaveViewModel eventWaveViewModel = new EventWaveViewModel();
	public EventWaveView()
	{
	 InitializeComponent();
	 //设置UserControl的DataContext
	 this.DataContext = eventWaveViewModel;
	 }
 }

2 事件

WPF MouseLeftButtonDown事件无法触发
路由事件概述
如何:处理路由事件

  <Border MouseDown="UIElement_OnMouseDown" Style="{StaticResource MenuItem}" Width="280">
   <TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource H5}" HorizontalAlignment="Left" Text="{Binding Title}"/>
</Border>

3 command

WPF自学入门(十一)WPF MVVM模式Command命令
[WPF] MVVM中实现不含Command属性的控件的Command绑定
WPF中的Command事件绑定
wpf 在代码CommandBinding的使用

<Button VerticalAlignment="Top" HorizontalAlignment="Left" 
                Command="{Binding GoBackCommand}">
            Go Back
        </Button>
 GoBackCommand = new RelayCommand(() =>
            {
                if (!navigation.Any())return;
                var previous = navigation.Last();
                if(previous == null) return;
                Series = previous;
                navigation.Remove(previous);
            });
            
namespace Wpf.PieChart.DropDowns
{
    public class RelayCommand : ICommand
    {
        private Action _action;

        public RelayCommand(Action action)
        {
            _action = action;
        }

        public void Execute(object parameter)
        {
            _action();
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;
    }
}

4 Hyperlink

4.1 使用 Click 事件

<TextBlock Margin="10,20,-10,-20">
    <Hyperlink NavigateUri="http://www.tianma3798.cn" Click="Hyperlink_Click">www.tianma3798.cn</Hyperlink>
</TextBlock>
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
    Hyperlink link = sender as Hyperlink;
    Process.Start(new ProcessStartInfo(link.NavigateUri.AbsoluteUri));
}

4.2 使用 RequestNavigate 事件

<Button Margin="5 0">
<Hyperlink NavigateUri="https://lvcharts.net/App/documentation/wpf/introduction" RequestNavigate="RequestNavigate">Object Explorer</Hyperlink>
</Button>
 private void RequestNavigate(object sender, RequestNavigateEventArgs e)
        {
            Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
            e.Handled = true;
        }

5 Resource

wpf资源是为了存储一系列我们常复用的对象。每个元素都有Resource属性
WPF 入门教程Resources使用方法
资源基础Resource的定义及使用,动态资源、静态资源、系统资源

5.1 DynamicResource与StaticResource

WPF中的资源简介、DynamicResource与StaticResource的区别(转)

5.2 ResourceDictionary

WPF中关于合并资源字典
WPF中的RESOURCEDICTIONARY

6 x:Key和x:Name

WPF x:Key和x:Name用法

7 xmlns命名空间

【C#】wpf中的xmlns命名空间为什么是一个网址,代表了什么意思
深入浅出WPF笔记——X名称空间详解
xmlns的目的是什么,XML:x, XML编号:d, xmlns:mc公司, xmlns:本地,mc:可在WPF的XAML文件中忽略?[复制]
wpf visual-studio xaml
我正在学习WPF,遇到了一个疑问,我在研究中没有得到满意的答案。我想知道xmlns的目的是什么,XML:x, XML编号:d,xmlns:mcxmlns公司:local,mc:Ignorable在WPF XAML文件中,以及在其中添加URL的原因。

<Window x:Class="WpfApp1.New"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="New" Height="450" Width="800"> 

这些东西的目的是什么?

首先,XAMl是一种基于XML的语言(请参阅这里):从语法的角度来看,您看到的这些行实际上是使用XML名称空间的示例。

简而言之,XML命名空间

XML名称空间映射由前缀(例如x)和名称空间URI(如"http://schemas.microsoft.com/winfx/2006/xaml")组成。它的目标是唯一地标识可能具有相同标识符的成员,这与编写C代码时使用名称空间的方式相同。例如,名称空间System.Windows和System.Drawing都定义了标识符Point,在代码中,您需要以某种方式指定名称空间来消除歧义。这在XML中也是一样的,不同的名称空间可以使用名称Class。{2835开头的{285}不是所有来自@285}前缀的元素。

对你来说

让我们来描述一下这些线条:

xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”:这是默认名称空间,因为它没有定义前缀。这意味着没有前缀的任何子元素都在这个命名空间中定义。在这里可以找到所有基本的砖块,比如Button和TextBlock。
xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml”:这个名称空间包含了XAML for WPF的大部分特定和必需的内容,比如Class
xmlns:d=“http://schemas.microsoft.com/expression/blend/2008”:此命名空间仅定义与design-time相关的元素。
xmlns:mc=“http://schemas.openxmlformats.org/markup-compatibility/2006”:这个命名空间定义了如何为XML解析器表达兼容性问题。
mc:Ignorable=“d”:这不是一个名称空间映射,而是一个使用名称空间的示例。mc中定义的Ignorable属性告诉XAML解析器可以安全地忽略哪些标记。这意味着文档中任何以d:开头的元素如果不被理解,就不能引发错误。
xmlns:local=“clr-namespace:WpfApp1”:这将名称空间WpfApp1映射到前缀local。这意味着,如果您希望在XAML中使用您在名称空间WpfApp1中的代码中定义的类或属性之一,则应该在其前面加上local:,以便XAML解析器理解它。

8 WPF 路径用法

WPF 路径用法
在 WPF 中打包 URI

9 数据绑定

WPF Binding CheatSheet version 1.1
数据绑定概述 (WPF .NET)
WPF 中双向绑定通知机制之ObservableCollection使用
Wpf DataGrid数据刷新,更改后台前台刷新
WPF学习笔记:Binding的数据转换
WPF Data Binding之指定源(Source)的几种方法

namespace MyWindow.Views
{
    /// <summary>
    /// BasicDataView.xaml 的交互逻辑
    /// </summary>
    public partial class BasicDataView : UserControl
    {
        ObservableCollection<Member> memberData = new ObservableCollection<Member>();
        public BasicDataView()
        {
            InitializeComponent();
            
            memberData.Add(new Member()
            {
                Name = "Joe",
                Age = "23",
                Sex = SexOpt.Male,
                Pass = true,
                Email = new Uri("mailto:Joe@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "Mike",
                Age = "20",
                Sex = SexOpt.Male,
                Pass = false,
                Email = new Uri("mailto:Mike@school.com")
            });
            memberData.Add(new Member()
            {
                Name = "Lucy",
                Age = "25",
                Sex = SexOpt.Female,
                Pass = true,
                Email = new Uri("mailto:Lucy@school.com")
            });
            dataGrid.DataContext = memberData;
        }

        private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //程序中改变值,页面显示会自动更新
            memberData[0].Age = "128";
            memberData[1].Age = "18";
        }
    }
    public enum SexOpt { Male, Female };

    public class Member: NotificationObject
    {
   		private string _name;
        public string Name 
        {
            get { return _name; }
            set
            {
                _name= value;
                RaisePropertyChanged("Name");
            }
        }
        private string _age;
        public string Age
        {
            get { return _age; }
            set
            {
                _age= value;
                RaisePropertyChanged("Age");
            }
        }
        private SexOpt _sex;
        public SexOpt Sex 
        {
            get { return _sex; }
            set
            {
                _sex= value;
                RaisePropertyChanged("Sex");
            }
        }
        private bool _pass;
        public bool Pass 
        {
            get { return _pass; }
            set
            {
                _pass= value;
                RaisePropertyChanged("Pass");
            }
        }
        private Uri _email;
        public Uri Email 
        {
            get { return _email; }
            set
            {
                _email= value;
                RaisePropertyChanged("Email");
            }
        }
    }
}

9.1 TabControl 大小随windows窗口大小变化

将TabControl的宽度和高度绑定到窗口的宽度和高度

<TabControl x:Name="tabControl"
                    HorizontalAlignment="Left"
                    SelectedIndex="0"
                    controls:TabControlHelper.IsUnderlined="True"
                    controls:TabControlHelper.Underlined="SelectedTabItem"
                    controls:ScrollViewerHelper.IsHorizontalScrollWheelEnabled="True"
                    FontFamily="Montserrat Alternates Medium"
                    FontSize="8"
                    controls:ControlsHelper.HeaderFontSize="10"
                    Width="{Binding ActualWidth, ElementName=Window, Mode=OneWay}"
                    Height="{Binding ActualHeight, ElementName=Window, Mode=OneWay}"
                    VerticalAlignment="Top">

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

9.2 UserControl中控件的大小随windows变化

  1. 在UserControl中添加gird
  2. grid的宽度和高度绑定UserControl的实际宽度和高度
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="800"
             d:DesignWidth="800">
		<Grid Margin="2"
          Height="{Binding ActualHeight, ElementName=userControl, Mode=OneWay}"
          Width="{Binding ActualWidth, ElementName=userControl, Mode=OneWay}">
         </Grid>
</UserControl>

在这里插入图片描述
在这里插入图片描述

9.3 数据格式化显示

wpf之IValueConverter接口

  1. CS文件中写IValueConverter类
 public class IntToUserTypeConverter:IValueConverter
    {
        //实现接口的两个方法
        #region IValueConverter 成员
		//正向转换,用于将Int数值转换为用户类型
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string TypeInt = value.ToString();
            string TypeStr = string.Empty;
            switch (TypeInt)
            {
                case "0":
                    TypeStr = "单个学校(单位)";
                    break;
                case "1":
                    TypeStr = "教育行政部门";
                    break;
            }

            return TypeStr;
        }
		//反向转换,用于将用户类型转换为Int型
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string TypeStr = value.ToString();
            int TypeInt = 0;
            switch (TypeStr)
            {
                case "单个学校(单位)":
                    TypeInt = 0;
                    break;
                case "教育行政部门":
                    TypeInt = 1;
                    break;
            }

            return TypeInt;
        }

        #endregion
    }

  1. 在XAML文件中声明资源,并实例化类
<mdi:MdiChild.Resources>
 <local:IntToUserTypeConverter x:Key="IntToUserTypeConverter"/>
 </mdi:MdiChild.Resources>
  1. 在控件使用该资源
 <DataGrid.Columns>
	<DataGridTextColumn Binding="{Binding Name}" Width="*" Header="账套名称" IsReadOnly="True" />
	<DataGridTextColumn Binding="{Binding Path=Type,Converter={StaticResource IntToUserTypeConverter}}" Width="*" Header="用户类型" IsReadOnly="True" />
	<DataGridTextColumn Binding="{Binding DQDM}" Width="*" Header="地区代码" IsReadOnly="True" />
	<DataGridTextColumn Binding="{Binding DQMC}" Width="*" Header="地区名称" IsReadOnly="True" />
</DataGrid.Columns>

在这里插入图片描述

10 TreeView

TreeView

11 布局

在Windows下创建grid,将tabcontrol的大小绑定到grid的大小
WPF中如何调整TabControl的大小,使其跟随Window的大小而改变?

12 DataGrid

WPF中Binding使用StringFormat格式化字符串方法
Q:WPF的datagrid绑定数据库后显示的数据会多出来一行空白的
A:解决方案 :在DataGrid 里边添加 CanUserAddRows=“False” 属性就ok
Q:DataGrid 多一列问题
A:
在DataGrid Columns属性中添加column
在添加的column的xaml中添加 Width=“*” 如

<DataGridTextColumn Header="Header1" Width="*" x:Name="col1" />
<DataGridTextColumn Header="Header2" Width="*" x:Name="col2" />

13 在线程中更新界面

在wpf子线程访问UI线程时,给UI的控件赋值,如果不做处理的话,会报异常:“调用线程无法访问此对象,因为另一个线程拥有该对象。”
解决办法如下:

//方法一
this.Dispatcher.Invoke((Action)delegate()
	{
               //你的代码
	}); 

//方法二
App.Current.Dispatcher.Invoke((Action)delegate()
	{
		//你的代码
	});
 public void ReadBasicData()
        {
            //isStartRead = true;
            ////MessageBoxX.Show("数据读取已启动!", "提示", configKey: "InfoTheme");
            ushort startReg, endReg;
            while (true)
            {
                startReg = 80;
                endReg = 101;
                ushort[] HoldingRegs = ModbusComm.ModbuReadHoldingRegisters(1, startReg, (ushort)(endReg - startReg + 1));
                meterPara.ResolveMeterPara(HoldingRegs, startReg, (ushort)(endReg - startReg + 1));
                this.Dispatcher.Invoke((Action)delegate ()
                {
                    MeterParaDisp();
                });
                Thread.Sleep(1000);
            }
        }

14 窗口关闭时,线程仍然运行,解决办法

C# 退出程序时,强制结束线程

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        System.Environment.Exit(System.Environment.ExitCode);
    }

15 Adorners

【WPF学习手记】控件修饰Adorners

15.1 AdornerLayer.GetAdornerLayer 返回 null

If you put items in a container that not supports adorner layer, you should have an AdornerDecorator (this provides an adorner layer).
Try this instead:

<AdornerDecorator>

<Menu Name="Menu1">

<MenuItem Name="miViewToolBarsFile">

<MenuItem.Header>

<CheckBox

Name="cbxViewToolBarsFile" HorizontalContentAlignment="Left">

<Label Name="lblViewToolBarsFile" Content="File" />

</CheckBox>

</MenuItem.Header>

</MenuItem>

</Menu>

</AdornerDecorator>

16 tooltip

WPF 工具提示(ToolTip)

17 tigger

Style、ControlTemplate 和 DataTemplate 都具有 Triggers 属性,该属性可以包含一组触发器。某个属性值更改时,或某个事件引发时,触发器会相应地设置属性或启动操作(如动画操作)。

触发器包含以下几种:

属性触发器

EventTrigger 和 Storyboard

MultiTrigger、DataTrigger 和 MultiDataTrigger

<UserControl.Resources>
 <Style TargetType="{x:Type CheckBox }">
            <Setter Property="FontFamily"
                    Value="Microsoft YaHei" />
            <Setter Property="FontSize"
                    Value="12" />
            <Setter Property="VerticalAlignment"
                    Value="Center" />
            <Setter Property="HorizontalAlignment"
                    Value="Center" />
            <Style.Triggers>
                <Trigger Property="IsChecked"
                         Value="true">
                    <Setter Property="Foreground"
                            Value="Red" />
                </Trigger>
                <Trigger Property="IsChecked"
                         Value="false">
                    <Setter Property="Foreground"
                            Value="Green" />
                </Trigger>
            </Style.Triggers>
        </Style>
</UserControl.Resources>

18 checkbox

WPF 自定义CheckBox样式

19 控件添加自定义属性

wpf Button 添加自定义属性
自定义控件的依赖属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值