WPF-页面-DataGrid数据处理-多线程-Winform嵌入

页面

if(NavigationService.CanGoBack == true) NavigationService.GoBack();
NavigationService.Navigate(new Uri("Page.xaml",UriKind.Relative));
  • 打印对话框PrintDialog
  • 如果要一下启动两个窗口,可以重写App.cs中的OnStartUP方法
  • 设置窗口所属关系,窗体A.Owner=窗体B
  • 单例模式
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        Mutex mutex = new Mutex(true, "MainWindow", out bool isNewInstance);
        if (!isNewInstance )
        {
            IntPtr intPtr = FindWindowW(null, "MainWindow");
            if (intPtr !=IntPtr.Zero)
            {
                SetForegroundWindow(intPtr);
            }
            Shutdown();
        }
    }
    [DllImport("User32", CharSet = CharSet.Unicode)]
    static extern IntPtr FindWindowW(string ClassName, string WindowName);
    [DllImport("User32", CharSet = CharSet.Unicode)]
    static extern bool SetForegroundWindow(IntPtr hWnd);
}
  • 启动参数同样是在OnStartup函数中设置string[] args = e.Args;
  • 异常处理
//在程序级别捕获
protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    DispatcherUnhandledException += App_DispatcherUnhandledException;
}

private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;//异常已经处理
}
//在主窗口级别捕获,这样可以在程序级别重新启动主窗口
public MainWindow()
{
    InitializeComponent();
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    MessageBox.Show("dd");
}
//异常首先被程序级别捕获再传到窗口级别,如果在程序级别中不设置e.Handled = true;则会传到窗口级别,然后主程序挂掉。
//所以在主程序挂掉之前要重启

Label

TextBlock合理Label相比,更加轻量化,Lable常用在可以连接到指定地方,加下划线。

Image

img.Source = new ImageSourceConverter().ConvertFromString("path.png") as ImageSource;这种方式需要设置图片不能为资源
img.Source = new BitmapImage(new Uri("path.png", UriKind.RelativeOrAbsolute));

对DataGrid数据进行排序

var cvs=  CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);//获得默认视图
 if (cvs!=null && cvs.CanSort)
 {
     cvs.SortDescriptions.Clear();
     cvs.SortDescriptions.Add(new System.ComponentModel.SortDescription("Name", System.ComponentModel.ListSortDirection.Descending));
 }

对DataGrid数据进行分组

var cvs=  CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);
 if (cvs!=null && cvs.CanGroup)
 {
     cvs.GroupDescriptions.Clear();
     cvs.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
 }

对DataGrid数据进行筛选

var cvs=  CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);
 if (cvs!=null && cvs.CanFilter)
 {
     cvs.Filter = (obj) =>
     {
         if (obj is Person per)
         {
             return per.FirstName.Contans("TOM");
         }
         return false;
     };
 }

使用行为来扩展控件的功能

  1. nuget安装System.Windows.Interactivity.WPF
public class GrowTextBehavior:Behavior<TextBlock>
{
   public int Size { get; set; }
   protected override void OnAttached()//增加事件
   {
       base.OnAttached();
       AssociatedObject.MouseEnter += AssociatedObject_MouseEnter;
       AssociatedObject.MouseLeave += AssociatedObject_MouseLeave;
   }
   protected override void OnDetaching()//减少事件
   {
       base.OnDetaching();

       AssociatedObject.MouseEnter -= AssociatedObject_MouseEnter;
       AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave;
   }
   //缩小
   private void AssociatedObject_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
   {
       AssociatedObject.FontSize -= Size;
   }
   //放大
   private void AssociatedObject_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
   {
       AssociatedObject.FontSize += Size;
   }
}

  1. XAML
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<StackPanel VerticalAlignment="Center">
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="HHHH">
        <i:Interaction.Behaviors>
            <local:GrowTextBehavior Size="10"/>
        </i:Interaction.Behaviors>
    </TextBlock>
</StackPanel>

在这里插入图片描述

使用DLL中的资源

Source="/LibraryName;component/Images/img.jpg"
在代码中访问Application.GetRemoteStream(new Uri("/MyLib;component/Img/R-C.png", UriKind.RelativeOrAbsolute));

资源管理

在Application.Resources中合并其他资源字典

使用系统的颜色和字体

{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}

其他线程更新UI

//下划线忽略不使用的变量
ThreadPool.QueueUserWorkItem(_ =>
{
    //其他现成更新UI
    Dispatcher.BeginInvoke(new Action(()=> {
        this.btn.Content = "aa";
    }));
});

BackgroundWorker组件

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;//支持取消
worker.DoWork += Worker_DoWork;//执行的任务事件
worker.RunWorkerCompleted += Worker_RunWorkerCompleted;// 执行的任务完成事件
worker.RunWorkerAsync(new Tuple<int, int>(1, 2));
worker.WorkerReportsProgress = true;//设置进度可用
worker.ProgressChanged += Worker_ProgressChanged;//计算进度更新
worker.CancelAsync();//取消

定时更新界面

DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(1.0);
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Start();

WPF中放入Winform控件

加入引用WindowsFormsIntegration和System.Windows.Forms
xaml中

<WindowsFormsHost>
            <forms:PropertyGrid x:Name="proForms"/>
</WindowsFormsHost>

proForms.SelectedObject = txtWPF;

Winform中放入WPF控件

直接拖控件

WPF如何将DLL嵌入到exe文件中

1)使用第三方库的WPF应用程序
2)修改项目文件

<Target Name="AfterResolveReferences">
    <ItemGroup>
      <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
        <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
      </EmbeddedResource>
    </ItemGroup>
</Target>

3)修改App.Xaml.cs

private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
    {
        Assembly executingAssembly = Assembly.GetExecutingAssembly();
        var executingAssemblyName = executingAssembly.GetName();
        var resName = executingAssemblyName.Name + ".resources";

        AssemblyName assemblyName = new AssemblyName(args.Name); string path = "";
        if (resName == assemblyName.Name)
        {
            path = executingAssemblyName.Name + ".g.resources"; ;
        }
        else
        {
            path = assemblyName.Name + ".dll";
            if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
            {
                path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);
            }
        }

        using (Stream stream = executingAssembly.GetManifestResourceStream(path))
        {
            if (stream == null)
                return null;

            byte[] assemblyRawBytes = new byte[stream.Length];
            stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
            return Assembly.Load(assemblyRawBytes);
        }
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
    }

C#调用win32API参考网站
http://www.pinvoke.net

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步、步、为营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值