学习博客
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 多语言
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设置
- 在 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"/>
- 在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
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 路径用法
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变化
- 在UserControl中添加gird
- 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 数据格式化显示
- 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
}
- 在XAML文件中声明资源,并实例化类
<mdi:MdiChild.Resources>
<local:IntToUserTypeConverter x:Key="IntToUserTypeConverter"/>
</mdi:MdiChild.Resources>
- 在控件使用该资源
<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
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
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
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>