返回首页


{A2的}介绍
系列中的第四条,它是长期因!在过去的几个月,我正忙着{A3的}创建几个更多的控制,我很高兴地说,{A3项目终于达到1.0。如果你正在读这篇文章的第一系列,{A3的}在CodePlex上的开源项目,包含库用户提供丰富的用户体验的控制。到现在,我已经覆盖了三个控件WPFSpark - SprocketControl,ToggleSwitch,和FluidWrapPanel的。
我添加了四个控制A3} - SparkWindowFluidPivotPanel,FluidProgressBar,FluidStatusBar。我会被描述他们在细节,一个接一个,在这篇文章中和即将召开的文章。
在WPFSpark系列以前的文章,在这里可以访问: {A8的}{A10的}
在这篇文章中,我详细描述了这个库中的第四次的控制 - SparkWindow的控制。它源于System.Windows.Window,并提供丰富的用户体验。
{S}灵感
我偶尔会在工作中创建的小工具(使用WPF)我同胞的团队成员(以及自己),以提高生产力。在大多数这些工具,我保证窗口无边框,覆盖整个桌面区域,不包括任务栏。此外,窗口不会有一个自己的独立和独特的标题栏。标题酒吧与客户共享空间。这是因为我想用户的使用应用程序时全神贯注。这导致的SparkWindow的成因让我跨越多个应用程序重用我的代码。
几个月前,当发布Windows 8的开发人员预览了,我很高兴地发现,微软是继地铁应用了类似的做法。
我也学会了从书中{A11}很多由帕Podila。这是一个真正伟大的人谁不想深入钻研自定义控件开发资源。SparkWindow揭秘WindowMode
起初,我创造了一个全屏窗口的模板。后来我加入了能力,有固定的大小非全屏窗口。
WindowMode定义,是否SparkWindow可以存在作为一个全屏幕窗口(我作为一个窗格称为)作为一个非全屏的固定大小的窗口。它还定义系统按钮将可用在标题栏区域的右侧。在WindowMode枚举定义五种模式,其中SparkWindow可以:窗格 - 全屏窗口最小化和关闭按钮。 PaneCanClose - 全屏窗口,最小化和关闭按钮。CanClose - 非全屏,固定大小的窗口,只有关闭按钮。CanMinimize - 非全屏,固定大小的窗口,最小化和关闭按钮。CanMaximize - 非全屏,固定大小的窗口最小化,最大化和关闭按钮。
的默认WindowMode是WindowMode.Pane的。关于
一个更系统的按钮,可以添加设置IsAboutEnabled属性。关于按钮显示问号(?)的象征。我将谈论更多的后来。
WPFSpark演示应用程序使用作为其主窗口设置CanMinimize WindowFrameMode财产一个SparkWindow。
{S2的}SparkWindow
SparkWindow"是一个自定义控件派生从Systems.Windows.Window的。默认情况下,SparkWindow是一个无外观控制。无外观控制的控制提供了一个默认的模板,并允许用户更换自己的模板,而不会干扰控制模板的模板。有一个必须遵循的几个基本步骤,以创建一个无外观控制。这里是我使SparkWindow无外观:添加SparkWindow类
首先,我增加了一个C#类称为SparkWindow项目。这将包含控制逻辑。我将稍后添加逻辑。新增主题\ generic.xaml中的ResourceDictionary
接下来,我添加了一个文件夹名为主题的项目内,我称为generic.xaml中添加了一个新的ResourceDictionary。在这个资源字典,我的SparkWindow的默认样式和各种系统按钮 - 关于",最小化,最大化,和关闭。{C}
在风格上,我已经设置为False的AllowsTransparency在为了提供更好的性能。对于更多细节上的影响AllowsTransparency属性窗口的性能,看看这个{A12}由杰里米Alles.The MaxWidth和maxheight的属性绑定到SystemParameters.MaximizedPrimaryScreenWidthKey和SystemParameters.MaximizedPrimaryScreenHeightKey,分别让他们在最大化状态时,他们不重叠的任务栏。
如果你注意到,在设置的关键:资源,而不是提供一个简单的字符串(X键),我已经使用了ComponentResourceKey提供的资源,独特的键名。这有助于避免名称冲突。一个ComponentResourceKey两个属性TypeInTargetAssembly类型的System.Type和ResourceId(System.String类型)。
该SparkWindow被包围两个边界 - OuterBorder和的InnerBorder的。窗口内容在于内InnerBorder。这些边界的颜色,圆角半径和厚度可以使用的属性设置的SparkWindow(见SparkWindow属性见下表)。
每当的SparkWindow的Title属性设置,它的动画标题。这是实现通过听到了Binding.TargetUpdated RoutedEvent的。

<TextBlock  Name="PART_TitleText"

    FontFamily="{TemplateBinding FontFamily}"

    FontWeight="{TemplateBinding FontWeight}"

    FontSize="{TemplateBinding FontSize}"

    Foreground="{TemplateBinding Foreground}"

    FontStyle="{TemplateBinding FontStyle}"

    VerticalAlignment="Top"

    Margin="{Binding Path=TitleMargin, RelativeSource={RelativeSource 

             FindAncestor,AncestorType={x:Type wpfspark:SparkWindow}}}"

    Effect="{Binding Path=TitleEffect, RelativeSource={RelativeSource 

             FindAncestor,AncestorType={x:Type wpfspark:SparkWindow}}}"

    Text="{Binding Path=Title, RelativeSource={RelativeSource 

             FindAncestor,AncestorType={x:Type wpfspark:SparkWindow}}, 

             NotifyOnTargetUpdated=True}">

        <TextBlock.Triggers>

            <EventTrigger RoutedEvent="Binding.TargetUpdated">

                <BeginStoryboard>

                    <Storyboard>

                        <ThicknessAnimation Duration="0:0:0.3"

                                            Storyboard.TargetProperty="Margin"

                                            From="200,-30,0,0"

                                            To="0,-30,0,0">

                            <ThicknessAnimation.EasingFunction>

                                <ExponentialEase EasingMode="EaseOut"

                                                 Exponent="2"></ExponentialEase>

                            </ThicknessAnimation.EasingFunction>

                        </ThicknessAnimation>

                    </Storyboard>

                </BeginStoryboard>

            </EventTrigger>

        </TextBlock.Triggers>

</TextBlock>
重写元数据
接下来,告诉WPF默认样式,要挑选从上述资源字典,我不得不重写元数据DefaultStyleKeyProperty在为SparkWindow类的静态构造函数。{体C3}设置ThemeInfo属性
为了确保默认样式为SparkWindow挑选含组装(WPFSpark.dll)本身,我修改的ThemeInfo在AssemblyInfo.cs中定义的属性。{的C4}
第一个参数告诉位于特定主题的资源字典和第二个参数告诉位于通用资源字典。这两个参数是类型ResourceDictionaryLocation。设置第二个参数来ResourceDictionaryLocation.SourceAssembly告诉WPF来寻找内WPFSpark.dll的通用资源字典。定义模板部件
为SparkWindow的控制逻辑(界定在SparkWindow.cs)需要访问一些默认样式中定义的元素。因此,按照"公约",这些控件描述性的名称与quot开始; PART_quot;在默认的模板。然后添加TemplatePartAttribute的SparkWindow类。{C5的}
,然后覆盖的OnApplyTemplate()方法来查找所需的控制使用GetTemplateChild()方法。
这里的控制逻辑在SparkWindow.cs定义:{5233}SparkWindow属性依赖PropertyTypeDescriptionDefault值InnerBorderBrush刷获取或设置为的SparkWindow的InnerBorder的刷。Brushes.WhiteInnerBorderCornerRadiusCornerRadius获取或设置的SparkWindow InnerBorder CornerRadius。0,0,0,0InnerBorderThickness厚度获取或设置的的SparkWindow的InnerBorder的厚度。0,0,0,0IsAboutEnabled布尔获取或设置是否应在标题栏显示"关于"按钮。假OuterBorderBrush刷获取或设置为的SparkWindow的OuterBorder的刷。Brushes.BlackOuterBorderCornerRadiusCornerRadius获取或设置的SparkWindow InnerBorder CornerRadius。0,0,0,0OuterBorderThickness厚度获取或设置的的SparkWindow的OuterBorder的厚度。0,0,0,0TitleMargin余量获取或设置为标题的SparkWindow保证金。0,0,0,0 TitleEffect效果获取或设置为名称的SparkWindow(DropShadowEffect,BlurEffect等)的各种影响。空WindowFrameModeWPFSpark.WindowMode获取或设置的SparkWindow WindowMode。WPFSpark.WindowMode.Pane在您的应用程序使用SparkWindow
为了使用SparkWindow在您的应用程序,你必须遵循以下步骤:添加参考WPFSpark.dll您的应用程序项目。右键单击您的项目,并选择加入GT;窗口。给它一个名字。
{A13号}在XAML和代码隐藏新增的窗口,改变基类SparkWindow。{C7-}{C8的}如果您有关于按钮启用,那么你可以通过覆盖OnAbout方法处理它的Click。同样,你可以重写OnMinimize,OnMaximize,OnClosing的方法来处理的最小化,最大化和关闭操作。
protected override void OnAbout(object sender, RoutedEventArgs e)

{

    base.OnAbout(sender, e);



    // Add your handler here

}



protected override void OnMinimize(object sender, RoutedEventArgs e)

{

    base.OnMinimize(sender, e);



    // Add your handler here

}



protected override void OnMaximize(object sender, RoutedEventArgs e)

{

    base.OnMaximize(sender, e);



    // Add your handler here

}



protected override void OnClosing(System.ComponentModel.CancelEventArgs e)

{

    base.OnClosing(e);



    // Add your handler here

}
为SparkWindow提供自己的风格/模板
这是可能覆盖系统SparkWindow按钮(,或SparkWindow本身)的样式或模板。如果您提供了一个新的模板按钮,你还需要提供模板,在其中,你会被提到一个新SparkWindow系统按钮,新的样式。当你重写的模板SparkWindow,你必须确保按钮具有相同的名称定义在的SparkWindow的原始模板(即PART_About,PART_Minimize,PART_Maximize,PART_Close),,否则SparkWindow将无法连接这些按钮的Click事件各自的功能。下面是一个例子,在那里我有重写的按钮模板,以显示其内容的字体Wingdings和Wingdings 2字形:{C10的}
您可以使用上述任何SparkWindow的风格。端点
在为Sp​​arkWindow的默认样式,在ResizeMode设置为NORESIZE,作为SparkWindow不支持调整目前。我打算把这个功能在未来WPFSpark版本。历史2011年12月21日,:WPFSpark V1.0发布。| Ratish菲利普:BradyEvans

回答

评论会员:Ratish菲利普 时间:2012/02/07

欢呼声中,
菲利普ratish
博客:http://wpfspark.wordpress.com/
评论会员:游客 时间:2012/02/07
Kanasz罗伯特:imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif的优秀系列文章,您已经得到了我的5
Ratish菲利普:谢谢你!
我很高兴你喜欢它。
欢呼声中,
菲利普ratish
博客:
http://wpfspark.wordpress.com/
评论会员:游客 时间:2012/02/07
尼克Polyak:绝对可以找到太多。!5