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 添加自定义属性
自定义控件的依赖属性

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# WPF MVVM 是一种常用的框架,用于开发 Windows 桌面应用程序。进销存是一种常见的管理系统,用于管理企业的进货、销售、库存等业务。下面是一个简单的 C# WPF MVVM 进销存的实现示例: 1. 数据库设计 首先需要设计数据库,包括商品表、进货表、销售表、库存表等。可以使用 MSSqlserver 数据库。 2. MVVM 模式 使用 MVVM 模式可以将业务逻辑与界面分离,提高代码的可维护性和可测试性。MVVM 模式包括 Model、View 和 ViewModel 三个部分。 3. Model Model 层负责数据的读取和存储,可以使用 Entity Framework 或者 NHibernate 等 ORM 框架。例如,可以定义一个 Product 类表示商品,包括商品编号、商品名称、商品单价等属性。 4. View View 层负责界面的显示和用户交互,可以使用 XAML 语言定义界面。例如,可以定义一个商品列表界面,包括商品编号、商品名称、商品单价等列。 5. ViewModel ViewModel 层负责将 Model 层的数据绑定到 View 层的界面上,并处理用户交互事件。例如,可以定义一个 ProductViewModel 类表示商品列表界面的 ViewModel,包括商品列表、添加商品、删除商品等方法。 6. 插件式开发 使用插件式开发可以将业务模块分离,提高多人协作开发效率。可以使用 MEF(Managed Extensibility Framework)框架实现插件式开发。 7. 使用 DevExpress 插件 DevExpress 是一个常用的 UI 控件库,可以提高开发效率和用户体验。可以使用 DevExpress 的 Grid 控件实现商品列表界面,包括排序、筛选、分页等功能。 8. 使用 NLog 记录日志 NLog 是一个常用的日志记录框架,可以记录应用程序的运行日志,方便排查问题。 9. 相关问题:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值