目录
22.查询datagrid中,模板中,TextBox中的Background颜色
27.快速创建WPF,使用Template Studio for WPF
21.强制退出、加载控件没有值报错、加载控件显示类名
WPF强制退出程序
Environment.Exit(0);
控件加载数据源的时候没有值,运行的时候报错
public event PropertyChangedEventHandler PropertyChanged = delegate { };
控件加载显示类名,不显示具体数据的时候
效果
解决方法2种
1.在实体类中重载一下
public override string ToString()
{
return Name;
}
2.在控件的数据模板中修改
<ComboBox Name="a" Width="100" Height="20" >
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Class}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
最终效果
22.查询datagrid中,模板中,TextBox中的Background颜色
private void GetTextBoxBackground(Visual myVisual)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
{
Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
if (childVisual is TextBox)
{
if ((childVisual as TextBox).Background != null && (childVisual as TextBox).Background.ToString() == "#FFFF0000")
{
isBackground = true;
return;
}
}
else
{
GetTextBoxBackground(childVisual);
}
}
}
GetTextBoxBackground(dgPerson);调用
23.WPF中全局捕捉异常
1.App.xaml
<Application x:Class="WpfApp1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
StartupUri="MainWindow.xaml"
DispatcherUnhandledException="App_OnDispatcherUnhandledException">
<Application.Resources>
</Application.Resources>
</Application>
2.App.xaml.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
namespace WpfApp1
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
private void App_OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show("程序出现严重错误" + e.Exception.Message);
e.Handled = true;
}
}
}
24.WPF中RichTextBox一秒弹一个展示数据
xaml
<Window x:Class="WpfApp3.MainWindow"
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:WpfApp3"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<StackPanel>
<Button Name="btnThd" Click="btnThd_Click" >一秒弹出一个</Button>
<RichTextBox x:Name="a" Height="100">
<FlowDocument>
<Paragraph>
<Run Text="RichTextBox"/>
</Paragraph>
</FlowDocument>
</RichTextBox>
</StackPanel>
</Grid>
</Window>
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace WpfApp3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void btnThd_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 100; i++)
{
await Task.Delay(1000);
await Task.Run(ModifyA);
}
}
private void ModifyA()
{
//模拟一些工作耗时的工作
this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
{
a.AppendText("1");
}));
}
}
}
效果
25.HandyControl控件
HandyControl是wpf中著名的控件
中文文档是欢迎使用HandyControl | HandyOrg
菜单栏的使用
<hc:Window x:Class="HCDemo.MainWindow"
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:HCDemo"
xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d"
Background="{DynamicResource RegionBrush}"
Title="MainWindow" Height="450" Width="800" Icon="/imgs/logo.ico">
<hc:Window.NonClientAreaContent >
<StackPanel Orientation="Horizontal">
<hc:Shield Subject="c#" Status="7.0" HorizontalAlignment="Left" Margin="4,0,0,0" Color="#1182c3"/>
<Button Margin="5,0,0,0" Content="菜单1"/>
<TextBlock Text="菜单2" VerticalAlignment="Center" Margin="5,0,0,0" />
</StackPanel>
</hc:Window.NonClientAreaContent>
<Grid>
<TextBlock Text="123" />
</Grid>
</hc:Window>
效果
26.WPF事件性能问题处理
e.Handled = true;
避免向上传递,降低性能。
27.快速创建WPF,使用Template Studio for WPF
28.wpf使用默认数据源
<StackPanel>
<DataGrid d:ItemsSource="{d:SampleData ItemCount=5}"/>
<ListBox d:ItemsSource="{d:SampleData ItemCount=6}"/>
</StackPanel>
29.wpf中使用XPath
wpf中使用XPath或者XMLDataProvider可以对xml文件进行绑定操作
30.wpf快速关闭程序的方法
Process.GetCurrentProcess().Kill();
31.wpf中设置dll输出的具体路径问题
双击项目,在里面增加,最下面3句代码,其中,最后一句是具体路径。
Gitee上面。主文件中生成多余的dll,选择dll后,选“复制本地”,“否”。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<OutputPath>F:\work\demo\HCDemo\hcdemo-h\HCDemo\bin\Debug\net6.0-windows\Libs\</OutputPath> <!--此处路径写HCDemo下的Libs-->
</PropertyGroup>
</Project>
32.iconfont字体库
阿里上点击“下载代码”(加载项目中),下载后有iconfont.ttf,然后引用iconfont.ttf,使用FontCreator软件,打开ttf文件,再输入图标编码
33.wpf中获取选择的项的其他值
获取属性值
cmbTest.SelectedItem.GetType().GetProperty("ID").GetValue(cmbTest.SelectedItem, null).ToString()
34.wpf控件装饰器
在控件上面画装饰器
//自定义装饰器,要继承Adorner
public class SimpleCircleAdorner : Adorner
{
public SimpleCircleAdorner(UIElement adornedElement)
: base(adornedElement)
{
}
// 实现装饰器渲染行为的常用方法是覆盖OnRender方法
// 该方法作为渲染传递的一部分由布局系统调用Custom
protected override void OnRender(DrawingContext drawingContext)
{
Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
// 一些任意的绘图实现。
SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
renderBrush.Opacity = 1;
Pen renderPen = new Pen(new SolidColorBrush(Colors.Green), 1.5);
double renderRadius = 5.0;
//在每个角上画一个圆
//drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
//drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
//drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
}
}
使用
private void Button_Click(object sender, RoutedEventArgs e)
{
//调用静态方法 GetAdornerLayer 以获取要装饰的 UIElement 的 AdornerLayer 对象
//GetAdornerLayer 从指定的 UIElement 开始向上遍历可视化树,并返回它找到的第一个装饰层。
//(如果未发现装饰器层,该方法将返回 null。)
AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(Button1);
myAdornerLayer?.Add(new SimpleCircleAdorner(Button1));
}
效果
35.wpf中图片路径转换成界面的Image控件内容
ImagePath = (ImageSource)new ImageSourceConverter().ConvertFrom(images.FirstOrDefault(a => a.Contains(Path.GetFileNameWithoutExtension(file))))