精华内容
下载资源
问答
  • WPF 启动页面

    2017-06-26 19:34:01
    WPF 启动页面
  • WPF实现带欢迎界面的客户端

    千次阅读 2012-09-07 17:41:04
    正常客户端一般需要1个界面:主界面,或者2个界面:登陆界面和主界面...此程序,使用wpf,并用了mvvmlight框架,包含3个界面:登陆界面欢迎界面、主界面。简易流程如下: 进入登陆界面-》点击开始-》调用backgroundw

    正常客户端一般需要1个界面:主界面,或者2个界面:登陆界面和主界面。但当主界面内容较多时,加载主界面需要一定的时间,当此时间超过10秒的时候,会让用户感觉出现假死的状态。此时就有必要在登陆和主界面初始化完成前增加一个欢迎界面来过度。

    此程序,使用wpf,并用了mvvmlight框架,包含3个界面:登陆界面、欢迎界面、主界面。简易流程如下:

    进入登陆界面-》点击开始-》调用backgroundwork开始对主程序中需要初始化的内容进行初始化,同时显示欢迎界面;在初始化过程中向欢迎界面传递数据报告初始化的进展;完成初始化后关闭欢迎界面,显示主界面。

    程序中主要使用了c#的BackgroundWorker做后台的初始化,由于C#库中默认提供的BackgroundWorker提供的功能,有些用不上遂自定义一个SimpleBackgroundWorker封装了默认的BackgroundWorker。

    SimpleBackgroundWorker提供了一个委托事件和2个虚方法:

    public delegate void WorkCompletedHandler();
    public event WorkCompletedHandler WorkCompletedEvent;
     
    protected virtual void process() { }
     
    protected virtual void complete() { }

    当需要运行自己的后台程序的时候,继承SimpleBackgroundWorker

    重写process方法自定义处理方法。

    重写complete方法自定义处理完后的方法。

    当需要增加complete后的事件响应的时候可以向WorkCompletedEvent注册事件。

    本程序中自定义初始化后台程序代码如下:

    protected override void process()
    {
        base .process();
        ViewModelLocator.MainStatic.Process = "正在进行第一阶段初始化" ;
        Thread.Sleep(1000);
        ViewModelLocator.MainStatic.Process = "正在进行第二阶段初始化" ;
        Thread.Sleep(1000);
        ViewModelLocator.MainStatic.Process = "正在进行第三阶段初始化" ;
        Thread.Sleep(1000);
        ViewModelLocator.MainStatic.Process = "正在进行第4阶段初始化" ;
        Thread.Sleep(1000);
        ViewModelLocator.MainStatic.Process = "正在进行第5阶段初始化" ;
        Thread.Sleep(1000);
    }
     
    protected override void complete()
    {
        base .complete();
    }

    只是重写了process方法增加处理过程,并模拟处理效果改变前台状态。

    在 欢迎界面窗口中从网上找到了一个时钟的代码用到了欢迎界面中,具体效果可通过下载程序运行。

    源码如下:

    实例演示源码



    展开全文
  • WPF收集页面样式

    2015-01-24 10:12:52
    本人收集自网络的WPF样式动画整合,欢迎学习交流
  • WPF 中的启动界面,为了能让 WPF 的启动界面显示足够快,需要在应用的 WPF 主机还没有启动完成之前就显示出启动图,此时的启动图需要自己解析图片同时也需要自己创建显示窗口 从 WPF 的 src\Microsoft.DotNet....

    本文是我在读 WPF 源代码做的笔记。在 WPF 中的启动界面,为了能让 WPF 的启动界面显示足够快,需要在应用的 WPF 主机还没有启动完成之前就显示出启动图,此时的启动图需要自己解析图片同时也需要自己创建显示窗口

    从 WPF 的 src\Microsoft.DotNet.Wpf\src\WindowsBase\System\Windows\SplashScreen.cs 文件可以看到 WPF 的 SplashScreen 的核心逻辑

    在 SplashScreen 的构造函数会传入资源名,也就是启动图的资源名,或者加上指定程序集和图片资源名

            public SplashScreen(string resourceName) : this(Assembly.GetEntryAssembly(), resourceName)
            {
            }
    
            public SplashScreen(Assembly resourceAssembly, string resourceName)
            {
            	// 忽略代码
            }

    当然了,这个设计扩展性不够好哈,不支持指定任意的图片。如果想要指定本地路径的任意图片作为启动图的,可以使用 lsj 提供的 kkwpsv/SplashImage: Fast splash Image with GDI+ in C# 库,当然了,这个库代码量特别少,我推荐大家可以抄抄代码。这个库提供的是高性能的版本,可以在另一个线程中执行,换句话说,就是使用 kkwpsv/SplashImage 作为欢迎界面,是可以做到不占用 WPF 主线程时间的,性能比 WPF 提供的好

    在 WPF 的 SplashScreen 的 Show 方法,就是启动图的核心逻辑

    先调用 GetResourceStream 从自己的程序集里面读取图片资源的原始 Stream 对象,通过此方式的读取性能特别强,因此不是真的读取到内存里面,而是获取一个指针而已。但是有趣的是在这个方法上面有注释说比 Assembly.GetManifestResourceStream 慢 200-300 毫秒,也许是当年的设备才需要这么长的时间

            // This is 200-300 ms slower than Assembly.GetManifestResourceStream() but works with localization.
            private UnmanagedMemoryStream GetResourceStream()

    在获取到启动图片的 UnmanagedMemoryStream 之后,将使用下面代码转换为指针,用于后续传入给 WIC 层

    IntPtr pImageSrcBuffer;
    unsafe
    {
        pImageSrcBuffer = new IntPtr(umemStream.PositionPointer);
    }

    接下来就是调用 CreateLayeredWindowFromImgBuffer 创建一个窗口然后这个窗口显示图片内容

    if (CreateLayeredWindowFromImgBuffer(pImageSrcBuffer, umemStream.Length, topMost) && autoClose == true)
    {
        Dispatcher.CurrentDispatcher.BeginInvoke(
            DispatcherPriority.Loaded,
            (DispatcherOperationCallback)ShowCallback,
            this);
    }

    可以看到在调用 CreateLayeredWindowFromImgBuffer 方法成功之后,就会调用 Dispatcher 插入 ShowCallback 函数,在 ShowCallback 里面用来自动关闭启动界面,如下面代码

            private static object ShowCallback(object arg)
            {
                SplashScreen splashScreen = (SplashScreen)arg;
                splashScreen.Close(TimeSpan.FromSeconds(0.3));
                return null;
            }

    从上面代码可以看到,在 WPF 中默认的启动图界面将会在 Loaded 完成之后延迟 0.3 秒执行,而具体是什么 Loaded 就不需要关注了。因为通过 BeginInvoke 插入的优先级是 DispatcherPriority.Loaded 优先级,也就是启动过程如果再没有什么比 DispatcherPriority.Loaded 更高的优先级,那就是启动完成了

    在 WPF 里面的 SplashScreen 的核心逻辑里面包含以下三步

    第一步是通过 WIC 层解码咱传入的图片,这样就支持不做任何优化的图片都能作为启动图

    第二步就是将解码之后的图片编码为 BGRA 图片格式传给 GDI 图片对象,这样就能将咱的图片作为 GDI 图片对象能使用的资源

    第三步是创建窗口显示这张 GDI 图片

    回到创建窗口的核心方法 CreateLayeredWindowFromImgBuffer 上,这个方法里面大量调用 WIC 层的逻辑,用来处理图片的渲染,过程代码大概如下,下面代码为了方便说明,和 WPF 源代码有些不相同

            private bool CreateLayeredWindowFromImgBuffer(IntPtr pImgBuffer, long cImgBufferLen, bool topMost)
            {
                bool bSuccess = false;
                IntPtr pImagingFactory = IntPtr.Zero;
                IntPtr pDecoder = IntPtr.Zero;
                IntPtr pIStream = IntPtr.Zero;
                IntPtr pDecodedFrame = IntPtr.Zero;
                IntPtr pBitmapSourceFormatConverter = IntPtr.Zero;
                IntPtr pBitmapFlipRotator = IntPtr.Zero;
    
                // 创建图片工厂,也就是获得 pImagingFactory 对象
                // 在 WPF 里面使用的 WINCODEC_SDK_VERSION 是 0x0236 一个比较古老的版本,在下文有告诉大家有哪些更新
                UnsafeNativeMethods.WIC.CreateImagingFactory(UnsafeNativeMethods.WIC.WINCODEC_SDK_VERSION,
                    out pImagingFactory);
    
                // 使用 pImagingFactory 图片工厂创建出一个空的 Stream 返回指针给到 pIStream 变量
                // Use the WIC stream class to wrap the unmanaged pointer
                UnsafeNativeMethods.WIC.CreateStream(pImagingFactory, out pIStream);
    
                // 使用传进来的图片指针和长度,初始化图片工厂创建出来的 pIStream 对象
                UnsafeNativeMethods.WIC.InitializeStreamFromMemory(pIStream, pImgBuffer, (uint) cImgBufferLen);
    
                // Create an object that will decode the encoded image
                Guid vendor = Guid.Empty;
                // 拿到编解码器
                UnsafeNativeMethods.WIC.CreateDecoderFromStream(pImagingFactory, pIStream,
                    ref vendor, 0, out pDecoder);
    
                // Get the frame from the decoder. Most image formats have only a single frame, in the case
                // of animated gifs we are ok with only displaying the first frame of the animation.
                // 从图片解码里面获取图片的第一帧,如果是 Gif 图片也只是显示第一帧
                UnsafeNativeMethods.WIC.GetFrame(pDecoder, 0, out pDecodedFrame);
    
                // 获取格式转换器
                UnsafeNativeMethods.WIC.CreateFormatConverter(pImagingFactory, out pBitmapSourceFormatConverter);
    
                // 定义了 32 位的 BGRA 图片格式,转换为此格式方便创建窗口使用 GDI 渲染
                // Convert the image from whatever format it is in to 32bpp premultiplied alpha BGRA
                Guid pixelFormat = UnsafeNativeMethods.WIC.WICPixelFormat32bppPBGRA;
    
                // 初始化转换器
                UnsafeNativeMethods.WIC.InitializeFormatConverter(pBitmapSourceFormatConverter, pDecodedFrame,
                    ref pixelFormat, 0 /*DitherTypeNone*/, IntPtr.Zero,
                    0, UnsafeNativeMethods.WIC.WICPaletteType.WICPaletteTypeCustom);
                // Reorient the image
                // 获取图片的裁剪和旋转
                UnsafeNativeMethods.WIC.CreateBitmapFlipRotator(pImagingFactory, out pBitmapFlipRotator);
    
                // 初始化图片的裁剪和旋转特效,此时的 pBitmapFlipRotator 就是最终叠加了特效的图片
                UnsafeNativeMethods.WIC.InitializeBitmapFlipRotator(pBitmapFlipRotator, pBitmapSourceFormatConverter,
                    UnsafeNativeMethods.WIC.WICBitmapTransformOptions.WICBitmapTransformFlipVertical);
    
                // 获取图片的大小,用来在下面创建像素数组
                Int32 width, height;
                UnsafeNativeMethods.WIC.GetBitmapSize(pBitmapFlipRotator, out width, out height);
    
                // 因为一个像素由 BGRA 格式定义
                Int32 stride = width * 4;
    
                // 创建一个 GDI 对象,对象的大小通过上面的逻辑拿到
                // initialize the bitmap header
                MS.Win32.NativeMethods.BITMAPINFO bmInfo = new MS.Win32.NativeMethods.BITMAPINFO(width, height, 32 /*bpp*/);
                bmInfo.bmiHeader_biCompression = MS.Win32.NativeMethods.BI_RGB;
                bmInfo.bmiHeader_biSizeImage = (int) (stride * height);
    
                // 创建 GDI 图片对象的内存填充
                // Create a 32bpp DIB.  This DIB must have an alpha channel for UpdateLayeredWindow to succeed.
                IntPtr pBitmapBits = IntPtr.Zero;
                _hBitmap = UnsafeNativeMethods.CreateDIBSection(new HandleRef(), ref bmInfo, 0 /* DIB_RGB_COLORS*/,
                    ref pBitmapBits, null, 0);
    
                // 从 WIC 解码器里面拷贝像素内容到 GDI 图片里面
                // Copy the decoded image to the new buffer which backs the HBITMAP
                Int32Rect rect = new Int32Rect(0, 0, width, height);
                UnsafeNativeMethods.WIC.CopyPixels(pBitmapFlipRotator, ref rect, stride, stride * height, pBitmapBits);
    
                // 使用 GDI 图片 _hBitmap 去创建一个窗口
                _hwnd = CreateWindow(_hBitmap, width, height, topMost);
    
                bSuccess = true;
                // 忽略一些清理资源的代码
                return bSuccess;
            }

    上面代码中的 UnsafeNativeMethods.WIC 就是调用 WIC 层的逻辑,在 WPF 中的 WIC 层逻辑和其他 Win32 应用一样,通过 WindowsCodecs.dll 提供,只是在 UnsafeNativeMethods.WIC.CreateImagingFactory(UnsafeNativeMethods.WIC.WINCODEC_SDK_VERSION, out pImagingFactory); 可以看到 WPF 使用的版本是 0x236 比较古老

    通过对比 6.2.9200.21830-Windows_7.0 和 6.3.9600.17415-Windows_8.1 版本的 windowscodecs.dll 可以看到有做了如下的更改

    - #define WINCODEC_SDK_VERSION 0x0236
    + #define WINCODEC_SDK_VERSION1 0x0236
    + #define WINCODEC_SDK_VERSION2 0x0237
    - DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262, 0x9370, 0x4615, 0xa1, 0x3b, 0x9f, 0x55, 0x39, 0xda, 0x4c, 0xa);
    + DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262, 0x9370, 0x4615, 0xa1, 0x3b, 0x9f, 0x55, 0x39, 0xda, 0x4c, 0xa);
    + DEFINE_GUID(CLSID_WICImagingFactory1, 0xcacaf262, 0x9370, 0x4615, 0xa1, 0x3b, 0x9f, 0x55, 0x39, 0xda, 0x4c, 0xa);
    + DEFINE_GUID(CLSID_WICImagingFactory2, 0x317d06e8, 0x5f24, 0x433d, 0xbd, 0xf7, 0x79, 0xce, 0x68, 0xd8, 0xab, 0xc2);
    + #if(_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
    +    #define WINCODEC_SDK_VERSION WINCODEC_SDK_VERSION2
    +    #define CLSID_WICImagingFactory CLSID_WICImagingFactory2
    + #else
    +    #define WINCODEC_SDK_VERSION WINCODEC_SDK_VERSION1
    + #endif

    新版本的 WindowsCodecs.dll 更新请看 What's New in WIC - Win32 apps

    在调用到使用 GDI 图片创建窗口的逻辑就十分简单了,都是一些 Win32 的接口调用

            private IntPtr CreateWindow(NativeMethods.BitmapHandle hBitmap, int width, int height, bool topMost)
            {
                if (_defWndProc == null)
                {
                    _defWndProc = new MS.Win32.NativeMethods.WndProc(UnsafeNativeMethods.DefWindowProc);
                }
    
                // 基本的 Win32 窗口创建方法,没啥特别的
                MS.Win32.NativeMethods.WNDCLASSEX_D wndClass = new MS.Win32.NativeMethods.WNDCLASSEX_D();
                wndClass.cbSize = Marshal.SizeOf(typeof(MS.Win32.NativeMethods.WNDCLASSEX_D));
                wndClass.style = 3; /* CS_HREDRAW | CS_VREDRAW */
                wndClass.lpfnWndProc = null;
                wndClass.hInstance = _hInstance;
                wndClass.hCursor = IntPtr.Zero;
                wndClass.lpszClassName = CLASSNAME;
                wndClass.lpszMenuName = string.Empty;
                // 加上消息循环,不然会提示应用停止响应
                wndClass.lpfnWndProc = _defWndProc;
    
                // We chose to ignore re-registration errors in RegisterClassEx on the off chance that the user
                // wants to open multiple splash screens.
                _wndClass = MS.Win32.UnsafeNativeMethods.IntRegisterClassEx(wndClass);
                if (_wndClass == 0)
                {
                	// 下面代码不太合理,于是我就提了一个更改 https://github.com/dotnet/wpf/pull/3923
                    if (Marshal.GetLastWin32Error() != 0x582) /* class already registered */
                        throw new Win32Exception();
                }
    
                // 决定启动窗口显示到哪
                int screenWidth = MS.Win32.UnsafeNativeMethods.GetSystemMetrics(SM.CXSCREEN);
                int screenHeight = MS.Win32.UnsafeNativeMethods.GetSystemMetrics(SM.CYSCREEN);
                int x = (screenWidth - width) / 2;
                int y = (screenHeight - height) / 2;
    
                // 窗口的样式,核心的就是 WS_EX_LAYERED 和 WS_EX_TOOLWINDOW 样式
                HandleRef nullHandle = new HandleRef(null, IntPtr.Zero);
                int windowCreateFlags =
                    (int) NativeMethods.WS_EX_WINDOWEDGE |
                          NativeMethods.WS_EX_TOOLWINDOW |
                          NativeMethods.WS_EX_LAYERED |
                          // 是否显示到最前
                          (topMost ? NativeMethods.WS_EX_TOPMOST : 0);
    
                // 创建窗口
                // CreateWindowEx will either succeed or throw
                IntPtr hWnd =  MS.Win32.UnsafeNativeMethods.CreateWindowEx(
                    windowCreateFlags,
                    CLASSNAME, SR.Get(SRID.SplashScreenIsLoading),
                    MS.Win32.NativeMethods.WS_POPUP | MS.Win32.NativeMethods.WS_VISIBLE,
                    x, y, width, height,
                    nullHandle, nullHandle, new HandleRef(null, _hInstance), IntPtr.Zero);
    
                // 将图片在窗口上显示出来
                // Display the image on the window
                IntPtr hScreenDC = UnsafeNativeMethods.GetDC(new HandleRef());
                IntPtr memDC = UnsafeNativeMethods.CreateCompatibleDC(new HandleRef(null, hScreenDC));
                IntPtr hOldBitmap = UnsafeNativeMethods.SelectObject(new HandleRef(null, memDC), hBitmap.MakeHandleRef(null).Handle);
    
                NativeMethods.POINT newSize = new NativeMethods.POINT(width, height);
                NativeMethods.POINT newLocation = new NativeMethods.POINT(x, y);
                NativeMethods.POINT sourceLocation = new NativeMethods.POINT(0, 0);
                _blendFunc = new NativeMethods.BLENDFUNCTION();
                _blendFunc.BlendOp = NativeMethods.AC_SRC_OVER;
                _blendFunc.BlendFlags = 0;
                _blendFunc.SourceConstantAlpha = 255;
                _blendFunc.AlphaFormat = 1; /*AC_SRC_ALPHA*/
    
                bool result = UnsafeNativeMethods.UpdateLayeredWindow(hWnd, hScreenDC, newLocation, newSize,
                    memDC, sourceLocation, 0, ref _blendFunc, NativeMethods.ULW_ALPHA);
    
                UnsafeNativeMethods.SelectObject(new HandleRef(null, memDC), hOldBitmap);
                UnsafeNativeMethods.ReleaseDC(new HandleRef(), new HandleRef(null, memDC));
                UnsafeNativeMethods.ReleaseDC(new HandleRef(), new HandleRef(null, hScreenDC));
    
                if (result == false)
                {
                    UnsafeNativeMethods.HRESULT.Check(Marshal.GetHRForLastWin32Error());
                }
    
                return hWnd;
            }
    

    当然了,在 WPF 里面再快的启动图显示速度都不如 UWP 快,因此 UWP 是系统给的优化,通过 AppFrameHost 显示的,基本上点击应用立刻打开

    当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • WPF - 界面美化 MahApps.Metro UI

    千次阅读 2018-12-27 09:17:11
    WPF - 界面美化 MahApps.Metro UI欢迎使用MahApps.Metro我的接入效果接入方式 欢迎使用MahApps.Metro MahApps.Metro资料: 官网地址:https://mahapps.com/ 官网快速开始地址:...

    WPF - 界面美化 MahApps.Metro UI

    欢迎使用MahApps.Metro

    MahApps.Metro资料:
    官网地址:https://mahapps.com/
    官网快速开始地址:https://mahapps.com/guides/quick-start.html#explanation

    我的接入效果

    引入效果版本:2.0
    界面效果1:

    在这里插入图片描述

    界面效果2:
    在这里插入图片描述

    1. 操作简单 ,只需使用NuGet安装MahApps.Metro、调整xaml和app.xaml整合主题目录、给窗体.cs替换Windows为MetroWindow即可;

    接入方式

    不作过多描述,操作很简单,请往上翻,直接链接到官网看文档即可,几分钟就能实现。

    展开全文
  • 关于WPF界面框架合集

    万次阅读 2018-10-31 17:43:16
    #关于WPF界面框架MahApps.Metro学习笔记《一》 公司因为业务发展,需要使用到WPF这种听说是非常陈旧的东西,但对于一个新人来说,只要是没接触的知识,在我看来,都是一个学习的过程。因为目前阶段已经脱离了使用最...

    #关于WPF界面框架MahApps.Metro学习笔记《一》

    公司因为业务发展,需要使用到WPF这种听说是非常陈旧的东西,但对于一个新人来说,只要是没接触的知识,在我看来,都是一个学习的过程。因为目前阶段已经脱离了使用最原始的微软控件构建界面的过程,不是我的要求,而是客户要求,说你这个界面看着这么老(PS:那是老吗!那明明是经典!!!),这也是公司要往WPF转的一个原因吧。
    说起界面,我可是一个煞费苦心的进行了调研,能看懂的、不能看懂的下载了一大堆。WPF方面的框架和知识太少了,能用来二次继续开发的框架更少。
    我找到的不是很全,在这就算一个记事本的记录吧:

    ModernUI

    –是一个开源的WPF界面库,利用该界面库,我们可以创建很酷的应用程序。下面是ModernUI官方示例,你可以从官方网站直接下载源码运行,如果是.NET 4.0的话,记得要声明“NET4”预编译变量,否则无法编译通过。
    地址:https://github.com/firstfloorsoftware/mui
    使用方法:https://blog.csdn.net/chihun_love/article/details/53944373
    界面如下图所示:
    在这里插入图片描述

    MaterialDesignInXamlToolkit

    MaterialDesignInXamlToolkit是一个仿照goolge风格的WPFUI框架, 我只是看了看外观,觉得不是很符合本次项目,就没使用,
    地址:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit
    使用方法:https://ouch1978.github.io/2017/03/25/material-design-xaml-toolkit/
    界面如下图所示:
    在这里插入图片描述

    DevExpress WPF Controls

    DevExpress WPF Controls拥有超过85个优选的界面控件和库,帮助你创建强大而优美的商业解决方案,并且满足最终用户最高要求的性能标准。
    自从winform项目用过DEV之后,对这个框架没有什么好感,一个是太沉重,另外一个,界面风格也是比较陈旧的,所以在WPF上自动忽略了这个UI框架。
    这个好像没有开源,智能下载安装着用。
    使用方法:https://blog.csdn.net/ibigpig/article/details/49781705
    在这里插入图片描述

    加粗样式PanuonUI

    一个好看精致,不限制个人或商业使用的WPF控件库。本库是一个正在开发的项目,看介绍是一个正在开发UI框架,时长不超过一年,能看到还在更新着。因为我们项目追求稳定,所以这个也忽略了。
    地址:https://github.com/Ruris/PanuonUI
    使用方法:https://blog.csdn.net/qq_36663276/article/details/80209684

    在这里插入图片描述

    AYUI
    这是一个意外发现的感觉也象是乱入的WPF框架,作者一会是高中毕业,一会是微软项目经理,反正不管怎么说,我觉得是个大神,毕竟可以自己造轮子出来,还是我等渣渣难以点评的。这个框架好像通过RMB可以购买到源码,看效果图觉得还是可以用用的,但是没时间研究了,所以就记录一下。
    这个框架有官网,有论坛,但是看着访问量应该不是很高,一看就是没有做SEO ,搜索WPF UI框架,反正是好多野没搜到这个。
    官网和论坛一体地址:http://www.wpfui.com/
    界面如下图:
    在这里插入图片描述

    Ribbon UI

    目前微软发布的最新Ribbon 开发工具,上一篇已经做过介绍这里就不再多说了。支持WPF 3.5 SP1、WPF 4,全面兼容VS2010 和Blend4。 这是我搜到的对这个框架的介绍,时间是2010年。我的天!!!!这个框架可能是更老的框架,我都不知道这个框架现在是否还能不能用,你要是不信邪的话,可以自己试试。有一点可以保证,这是微软亲儿子。
    图片如下:
    下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=11877
    使用方法(十年园龄的前辈):https://www.cnblogs.com/gnielee/archive/2010/05/12/wpf4-ribbon-tab-toolbar.html
    在这里插入图片描述

    ***OSGi.Net ***

    规范化的OSGi.NET插件框架和可复用的插件仓库,通过插件仓库来解决应用系统的持续集成、远程管理、自动更新、敏捷发布,无缝实现开发/QA/运维间无缝协作.
    这个工厂式的开发在查资料的时候经常看见,但是一直没用过。不太清楚效果,有用过的可以一起交流下。
    官网地址:http://www.iopenworks.com/
    使用教程:http://www.cnblogs.com/baihmpgy/p/osgi_muinavtree_fx.html
    图片如下:
    在这里插入图片描述

    欢迎转载,演绎或用于商业目的,但是必须保留本文的署名(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。邮箱 :kongxiao2018@foxmail.com

    展开全文
  • 本文来告诉大家在 WPF 开发中,发现有某个按钮或某个控件,某个预期的界面,没有在窗口或者没有在界面里面看到或者找到可能的原因和调试的方法 不在视觉树 如果控件在界面看不到,首先需要通过视觉树了解控件是否...
  • 物联网WPF界面

    2019-04-15 17:19:58
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • DXPrinting库为DevExpress WPF控件提供了打印和导出...通过此对话框,最终用户可以打印或导出报表、指定其页面和打印机设置,或通过电子邮件发送报告。 您可以将控件数据导出为以下格式的文件:CSV、HTML、MHT、PDF
  • C# WPF聊天界面(3/3)

    2020-04-23 08:20:07
    C# WPF聊天界面(3/3) 阅读导航 本文背景 代码实现 本文参考 1.本文背景 系列文章最后一篇,一个完整的聊天界面。当然只看效果,具体的项目需要将左侧好友列表、中间会话列表、右侧联系人简况做成MVVM绑定的形式,...
  • WPF登录界面及程序主界面设计

    千次阅读 2019-04-18 17:07:16
    https://www.cnblogs.com/xieyong_198510/p/3435870.html
  • 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 新的WPF Breadcrumb控件使一个导航栏,类似于自Windows 7以来...
  • DevExpress WPF Subscription拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建...
  • 本教程将介绍执行哪些步骤才能在应用程序中添加Telerik UI for WPF控件。 本文主要向您展示如何在XAML中手动声明命名空间。 几乎所有Telerik控件都可以在“telerik”URI 命名空间架构中找到,您只能使用此命名空间...
  • DevExpress WPF Subscription拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。...DevExpress WPF v20.1日前全新发布,新版本加强Accordion控件和图表功能等,欢迎下载v
  • 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpress WPF Data Grid和TreeList的最新版本引入新的编辑...
  • 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress Image Gallery包含数千个图标,可在您下一个WPF...
  • DevExpress WPF拥有120+个控件和...DevExpress WPF v21.1 正式版日前已发布,DevExpress图像库现在可用于 .NET Core 和 .NET 5、升级MVVM功能等,欢迎点击下载最新版体验! DevExpress v21.1完整版下载 .NET Core &am
  • 使用WPF实现的简单的文件及文件夹的浏览界面,纯后台C#代码,没有使用XAML。 使用VS2015编译,测试通过。 界面比较简单,但是可行,欢迎大家继续补充。 水平有限,敬请批评。
  •  采用WPF进行开发,模仿鲁大师界面的效果,高亮效果,欢迎下载 二、功能介绍  本源码是一个用WPF模仿鲁大师界面源码,模仿了金山卫士,360,鲁大师的界面! 三、注意事项  1、开发环境为Visual Studio 2010,...
  • 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform、WPF、ASP.NET Core、Xamarin.Forms等,亦有C++桌面相关的Qt Quick和Qt Widgets等,只分享自己熟悉的、自己会的。 阅读导航:...
  • DXPrinting Library 提供了一种...DevExpress WPF v21.1高速下载 下表列出了内置的打印链接类型。 创建简单链接 简单的打印链接通常用于在报表中呈现非分层数据,在不需要将数据项分组的时候使用这些类型的链接
  • DevExpress WPF Subscription拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建...
  • 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 在日前发布的v19.2版本中,包含一个全新的Badge控件。使用其...
  • 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 WPF Gantt控件(v20.1)允许您根据需要将资源分配给各个任务...
  • WPF 启动初始界面

    2015-03-29 22:47:00
    不经意间发现了wpf的这个小玩意,感觉蛮有意思的。我在项目中添加了一张图片 如图: wpf-1.JPG(10.73 K) 2010-6-6 17:04:47 然后再这张图片的属性中设置它的生成操作为SplashScreen 如图: wpf-2.JPG...
  • 作为窗体程序开发,基本上有Winform与WPF两种界面,笔者推荐使用WPF。理由如下: Winform Vs WPF Winform是上一代的界面技术,而WPF是较新的界面技术,在特效方面比Winform强很多 Autodesk Revit团队推荐使用WPF ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,188
精华内容 2,475
关键字:

wpf欢迎页面