Support for custom chrome windows

I have my own custom control library project, and one of the controls inside this library is Zune software, such as a window. inside my WPF application, I use this custom window control instead of the default window. everything appears as it should have shown when I launch my application, but the problem is that during development inside visual studio 2012 it still shows the default window. what I would like to have is to have the same style of zune software during development. what are the ways and how can i achieve this?

Usually what I'm trying to achieve is something like https://fluent.codeplex.com/ , where instead of getting the window from the base class, all you have to do is define the window this way

<Fluent:Ribbon> <Fluent:RibbonTabItem Header="Home"> <Fluent:RibbonGroupBox Header="Clipboard"> <Fluent:SplitButton Text="Paste" Icon="Images\Paste.png" LargeIcon="Images\PasteLarge.png"> ... </Fluent:RibbonGroupBox> <Fluent:RibbonGroupBox x:Name="Font" .... </Fluent:RibbonTabItem> ... 

+4
source share
1 answer

Do you mean this?

Designview

This is my own code, but it probably looks like the http://archive.msdn.microsoft.com/WPFShell library if you are looking for a more official source.

The main window is displayed from an existing window or in this case NavigationWindow

 namespace Centivus.WPF { [TemplatePartAttribute(Name = "PART_SearchTextBox", Type = typeof(TextBox))] public class SearchableNavigationWindow : NavigationWindow { ... 

and his style using the template

 <!-- Custom NavigationWindow UI --> <Style x:Key="Win7NavigationWindow" TargetType="{x:Type local:SearchableNavigationWindow}"> <Setter Property="MinWidth" Value="400"/> <Setter Property="glass:GlassEffect.IsEnabled" Value="True" /> <Setter Property="glass:GlassEffect.Thickness"> <Setter.Value> <Thickness Top="35"/> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <DockPanel x:Name="mainDock" LastChildFill="True" > <!-- The border is used to compute the rendered height with margins. topBar contents will be displayed on the extended glass frame.--> ... 

The only clever part of this is using the attached property for applying glass, which I would suggest that you do something incredibly similar if you use custom chrome

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Windows.Interop; using System.Windows; using System.Windows.Media; using System.Windows.Controls; using System.Diagnostics; namespace Centivus.WPF.Glass { public class GlassEffect { public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", typeof(Boolean), typeof(GlassEffect), new FrameworkPropertyMetadata(OnIsEnabledChanged)); public static readonly DependencyProperty ThicknessProperty = DependencyProperty.RegisterAttached("Thickness", typeof(Thickness), typeof(GlassEffect)); public static readonly DependencyProperty GlassBackgroundProperty = DependencyProperty.RegisterAttached("GlassBackground", typeof(Brush), typeof(GlassEffect)); [DebuggerStepThrough] public static void SetGlassBackground(DependencyObject element, Brush value) { element.SetValue(GlassBackgroundProperty, value); } [DebuggerStepThrough] public static Brush GetGlassBackground(DependencyObject element) { return (Brush)element.GetValue(GlassBackgroundProperty); } [DebuggerStepThrough] public static void SetThickness(DependencyObject element, Thickness value) { element.SetValue(ThicknessProperty, value); } [DebuggerStepThrough] public static Thickness GetThickness(DependencyObject element) { return (Thickness)element.GetValue(ThicknessProperty); } [DebuggerStepThrough] public static void SetIsEnabled(DependencyObject element, Boolean value) { element.SetValue(IsEnabledProperty, value); } [DebuggerStepThrough] public static Boolean GetIsEnabled(DependencyObject element) { return (Boolean)element.GetValue(IsEnabledProperty); } [DebuggerStepThrough] public static void OnIsEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { if ((bool)args.NewValue == true) { try { Window wnd = (Window)obj; wnd.Activated += new EventHandler(wnd_Activated); wnd.Loaded += new RoutedEventHandler(wnd_Loaded); wnd.Deactivated += new EventHandler(wnd_Deactivated); } catch (Exception) { //Oh well, we tried } } else { try { Window wnd = (Window)obj; wnd.Activated -= new EventHandler(wnd_Activated); wnd.Loaded -= new RoutedEventHandler(wnd_Loaded); wnd.Deactivated -= new EventHandler(wnd_Deactivated); } catch (Exception) { } } } [DebuggerStepThrough] static void wnd_Deactivated(object sender, EventArgs e) { ApplyGlass((Window)sender); } [DebuggerStepThrough] static void wnd_Activated(object sender, EventArgs e) { ApplyGlass((Window)sender); } [DebuggerStepThrough] static void wnd_Loaded(object sender, RoutedEventArgs e) { ApplyGlass((Window)sender); } [DebuggerStepThrough] private static void ApplyGlass(Window window) { try { // Obtain the window handle for WPF application IntPtr mainWindowPtr = new WindowInteropHelper(window).Handle; HwndSource mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr); // Get System Dpi System.Drawing.Graphics desktop = System.Drawing.Graphics.FromHwnd(mainWindowPtr); float DesktopDpiX = desktop.DpiX; float DesktopDpiY = desktop.DpiY; // Set Margins GlassEffect.MARGINS margins = new GlassEffect.MARGINS(); Thickness thickness = GetThickness(window);//new Thickness(); // Extend glass frame into client area // Note that the default desktop Dpi is 96dpi. The margins are // adjusted for the system Dpi. margins.cxLeftWidth = Convert.ToInt32(thickness.Left * (DesktopDpiX / 96) + 0.5); margins.cxRightWidth = Convert.ToInt32(thickness.Right * (DesktopDpiX / 96) + 0.5); margins.cyTopHeight = Convert.ToInt32((thickness.Top * DesktopDpiX / 96) + 0.5); margins.cyBottomHeight = Convert.ToInt32(thickness.Bottom * (DesktopDpiX / 96) + 0.5); int hr = GlassEffect.DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins); // if (hr < 0) { //DwmExtendFrameIntoClientArea Failed if(window.IsActive) SetGlassBackground(window, SystemColors.GradientActiveCaptionBrush); else SetGlassBackground(window, SystemColors.GradientInactiveCaptionBrush); } else { mainWindowSrc.CompositionTarget.BackgroundColor = Color.FromArgb(0, 0, 0, 0); SetGlassBackground(window, Brushes.Transparent); } } // If not Vista, paint background white. catch (DllNotFoundException) { SetGlassBackground(window, SystemColors.ControlBrush); } } [StructLayout(LayoutKind.Sequential)] public struct MARGINS { public int cxLeftWidth; // width of left border that retains its size public int cxRightWidth; // width of right border that retains its size public int cyTopHeight; // height of top border that retains its size public int cyBottomHeight; // height of bottom border that retains its size }; [DllImport("DwmApi.dll")] public static extern int DwmExtendFrameIntoClientArea( IntPtr hwnd, ref MARGINS pMarInset); } } 

There's a bit more information also at http://alski.net/post/2012/01/13/WPF-Wizards-part-2-Glass.aspx

0
source

All Articles