4

私は独自のカスタムコントロールライブラリプロジェクトを持っており、このライブラリ内のコントロールの1つはウィンドウのようなZuneソフトウェアです。WPFアプリケーション内では、デフォルトのウィンドウの代わりにこのカスタムウィンドウコントロールを使用しています。アプリケーションを実行するとすべてが表示されるはずですが、問題は、デザイン時にVisualStudio2012内でデフォルトのウィンドウが表示されることです。私ができるようにしたいのは、設計時に同じzuneソフトウェアスタイルを使用することです。これを達成する方法と方法は何ですか?

一般的に私が達成しようとしているのはhttps://fluent.codeplex.com/のようなもので、基本クラスからウィンドウを派生させる代わりに、この方法でウィンドウを定義するだけです。

<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

1 に答える 1

0

こんな感じですか?

デザインビュー

これは私自身のカスタム コードですが、より公式なソースを探している場合は、おそらくhttp://archive.msdn.microsoft.com/WPFShellライブラリに似ています。

メイン ウィンドウは、既存のウィンドウ (この場合はNavigationWindow ) から派生します。

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

テンプレートを介してスタイル設定されます

<!-- 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.-->
...

これに対する唯一の巧妙な部分は、ガラスを適用するために添付プロパティを使用することです。これは、カスタム クロムを使用している場合、信じられないほど似たようなことをしていると思います。

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);
    }
}

http://alski.net/post/2012/01/13/WPF-Wizards-part-2-Glass.aspxにももう少し情報があります

于 2013-02-13T23:38:17.067 に答える