浏览
分类: WPF

[WPF]强制更新界面

[WPF]强制更新界面

var frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Render,
    new DispatcherOperationCallback(o =>
    {
        frame.Continue = false;
        return null;
    }), null);
Dispatcher.PushFrame(frame);

[WPF]换肤功能的实现

[WPF]换肤功能的实现

在WPF中有一个静态资源DynamicResource,我们可以用这个实现简单换肤功能。

首先,我们在想要改变皮肤样式的控件上用DynamicResource设置样式,例如:

<Image Style="{DynamicResource MainWindowLogo}"/>

然后,我们在不同的皮肤上定义不同的MainWindowLogo样式。
最后,当我们需要换肤时切换皮肤样式文件即可,切换代码如下: ···  阅读全文

[WPF]使用WinForm控件后无边框窗口实现

[WPF]使用WinForm控件后无边框窗口实现

有时需要在WPF程序中需要嵌入WinForm的控件,这时如果用WindowStyle="None"AllowsTransparency="True"Background="Transparent"设置无边框窗口就会发现不显示任何东西。这时就需要调用系统API来实现无边框窗口。

设置窗口无边框

设置无边框需要用SetWindowLong,代码如下:

private const int GWL_STYLE = -16;
private const int WS_CAPTION = 0X00C0000;

[DllImport("user32", EntryPoint = "SetWindowLong")]
private static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

/// <summary>
/// 设置窗口无边框
/// </summary>
/// <param name="window">要设置的窗口</param>
/// <param name="isNoBorder">是否为无边框窗口</param>
public static void SetWindowNoBorder(this Window window, bool isNoBorder)
{
    if (window == null) return;

    // 获取窗体句柄 
    var hwnd = new WindowInteropHelper(window).Handle;

    // 获得窗体的 样式 
    var oldstyle = GetWindowLong(hwnd, GWL_STYLE);

    if (isNoBorder)
        SetWindowLong(hwnd, GWL_STYLE, oldstyle & ~WS_CAPTION);
    else
        SetWindowLong(hwnd, GWL_STYLE, oldstyle | WS_CAPTION);
}

设置窗口背景透明

设置背景透明需要用SetLayeredWindowAttributes,代码如下: ···  阅读全文

[WPF]无边框可伸缩带阴影窗口

[WPF]无边框可伸缩带阴影窗口

用WPF做界面很多时候都需要无边框窗口,这时候可以用WindowStyle="None"AllowsTransparency="True"来实现无边框。然而这样设置后的视觉效果却不是很好,这时就需要用到WindowChrome。下面详细介绍一下WindowChrome

WindowChrome

MSDN中,有这样的描述:

若要自定义窗口,同时保留其标准功能,可以使用WindowChrome类。 WindowChrome类窗口框架的功能分离开来视觉对象,并允许您控制的客户端和应用程序窗口的非工作区之间的边界。  ···  阅读全文