控件的Sytle属性可以赋予附带Setter的Style元素。Setter元素定义Property和Value属性,并给指定的属性设置一个值。

直接通过Button控件设置Style,设置Background,FontSize,FontWeight属性。把Style设置TargetType为Button,以便直接访问Button的属性。

        <Button Width="150" Height="50" Content="Click Me!">
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="Background" Value="Yellow"/>
                    <Setter Property="FontSize" Value="14"/>
                    <Setter Property="FontWeight" Value="Bold"/>
                </Style>
            </Button.Style>
        </Button>

如果没有设置样式的TargtType,就可以通过Button.Background,Button.FontSize访问属性。如果需要设置不同元素类型的属性时,这就很重要。
        <Button Width="150" Height="50" Content="Click Me!">
            <Button.Style>
                <Style>
                    <Setter Property="Button.Background" Value="Yellow"/>
                    <Setter Property="Button.FontSize" Value="14"/>
                    <Setter Property="Button.FontWeight" Value="Bold"/>
                </Style>
            </Button.Style>
        </Button>

样式可以放在资源中,以实现共享的目的。

第一种样式赋予了Button类型的所有元素。把一个样式赋予某一类型的所有元素,使用Style的TargetType属性,并指定x:Type

第二种样式使用一个键,x:Key    单一元素组件可以引用此样式

    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontSize" Value="18"/>
        </Style>
        <Style x:Key="BtnSytle">
            <Setter Property="Button.Background" Value="Red"/>
            <Setter Property="Button.FontSize" Value="18"/>
        </Style>
    </Window.Resources>
两种样式的使用,第一个按钮没有指定样式属性,而是使用的Button类型定义的样式,第二个按钮指定了Style并使用StaticResource指定了样式资源的键值BtnStyle
        <StackPanel Orientation="Vertical">
            <Button Width="150" Height="50" Content="Click Me!"/>
            <Button Width="150" Height="50" Content="Click Me!" Style="{StaticResource BtnSytle}"/>
        </StackPanel>

样式通常存储在资源中。

基类FrameworkElement定义ResourceDictionary类型的Resources属性。所有派生自FrameworkElement所有类(任意WPF元素)都可以定义Resources资源。

上面示例资源用Window元素定义,它就会应用于Window的所有子元素,同理可以单独设置Grid,StackPanel等元素的资源,它就会应用于当前元素的所有子元素。

如果需要将一个样式应用于多个窗口,就可以用应用程序定义样式。在App.xaml中可定义应用程序的全局资源。

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup">
    <Application.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontSize" Value="18"/>
        </Style>
        <Style x:Key="BtnSytle">
            <Setter Property="Button.Background" Value="Red"/>
            <Setter Property="Button.FontSize" Value="18"/>
        </Style>
    </Application.Resources>
</Application>

从代码中访问资源

基类FrameworkElement实现FindResource()方法,所以每个WPF元素对象调用FindResource()方法,按照层次结构搜索资源。

        <StackPanel Orientation="Vertical">
            <StackPanel.Resources>
                <Style x:Key="BtnStyle">
                    <Setter Property="Button.Background" Value="Red"/>
                    <Setter Property="Button.FontSize" Value="18"/>
                </Style>
            </StackPanel.Resources>
            <Button Width="150" Height="50" Content="Click Me!" Click="Button_Click" Focusable="False"/>
        </StackPanel>
        private void Button_Click(object sender, RoutedEventArgs e)
            Control ctrl = sender as Control;
            ctrl.Style = ctrl.FindResource("BtnStyle") as Style;

StaticResource标记扩展,是在加载期间搜索资源。如果在运行程序过程中改变了资源,就应该使用DynamicResource标记扩展

如果相同的资源可用于不同的应用程序,把资源放在一个资源字典中比较有效。使用资源字典可以在多个应用程序之间共享文件。也可以吧资源字典放在一个程序集中,供应用程序共享。

创建资源字典:右击项目-添加-资源字典

创建Dictionary1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontSize" Value="18"/>
        </Style>
        <Style x:Key="BtnSytle">
            <Setter Property="Button.Background" Value="Red"/>
            <Setter Property="Button.FontSize" Value="18"/>
        </Style>
</ResourceDictionary>

对应目标项目,需要把此资源字典添加到App.xaml中引用。使用方式就跟在App声明全局资源一样。
<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

通过ResourceDirectionary的MergedDictionayies属性,可以添加多个资源字典文件。 样式Style的使用控件的Sytle属性可以赋予附带Setter的Style元素。Setter元素定义Property和Value属性,并给指定的属性设置一个值。直接通过Button控件设置Style,设置Background,FontSize,FontWeight属性。把Style设置TargetType为Button,以便直接访问Button的属性。
ModernUI(http://mui.codeplex.com/)是一个开源的WPF界面库,利用该界面库,我们可以创建很酷的应用程序。下面是ModernUI官方示例,你可以从官方网站直接下载源码运行,如果是.NET 4.0的话,记得要声明“NET4”预编译变量,否则无法编译通过。 这个界面框架是基于ModernUI来实现的,在该文我将分享所有的源码,并详细描述如何基于ModernUI来构造一个非常通用的、插件化的WPF开发框架。下载源码的同志,希望点击一下推荐。 本文将按照以下四点来介绍: (1)ModernUI简介; (2)构建通用界面框架的思路; (3)基于ModernUI和OSGi.NET的插件化界面框架实现原理及源码分析; (4)其它更有趣的东西~~。 要编写这样的WPF界面,我们需要在一个Window上声明菜单和Tab页面,下图是定义菜单的声明。 此外,每一个Tab风格页面,你也需要手动的为菜单创建这样的界面元素。 直接用这样的方式来使用ModernUI,显然不太适合团队协作性的并行开发,因为在一个团队的协作中,不同的人需要完成不同的功能,实现不同页面,每个人都需要来更改主界面。 我非常希望模块化的开发方法,因为这可以尽可能的复用现有资产,使程序员可以聚焦在自己关注的业务逻辑上,不需要关心UI的使用。下面,我将来描述基于ModernUI实现的一个通用界面框架,这个界面框架允许程序员在自己的业务模块中配置需要显示的界面元素。 通用界面框架实现思路: 我希望能够实现这样的通用界面框架: (1)程序员可以直接实现需要展现业务逻辑的界面,不需要关注如何使用ModernUI; (2)程序员可以通过简单的配置就可以将自己实现的业务逻辑页面显示在主界面中; (3)这个界面框架可以完全复用。 当我看到ModernUI这个界面库时,我希望将应用程序做成模块化,每一个模块能够: (1)通过以下配置能够直接显示二级菜单。 (2)通过以下配置能够直接显示三级菜单。 这样做的好处是,开发插件的时候可以不需要关心界面框架插件;团队在协作开发应用的时候,可以独立开发并不需要修改主界面;团队成员的插件可以随时集成到这个主界面;当主界面无法满足我们的布局时或者用户需求无法满足时,可以直接替换主界面框架而不需要修改任何插件代码。
为了使WPF程序在不同版本的操作系统上保持一致的显示效果,我们需要重写WPF控件样式。这篇博客将展示如何创建一个Metro Style的WPF窗体。 首先先看一下最终窗体的效果图, 通过截图我们可以看出来这个窗体由两部分组成,顶部为最小化和关闭按钮,其他区域为窗体的显示区域。请看下面的具体实现代码, MetroWindow样式: %26lt;ResourceDictionary x
原来这个项目,一直想做成CS模式的,BS模式对于炉石这样的游戏来说比较困难。 暴雪到现在也只出了 Windows 和 iPad版本的炉石,最大的问题还是在于如何在小屏幕下,实现最佳的客户体验。 Windows和iPad的屏幕不会太小,所以操作起来不会出现很大的问题,但是如果是手机的话,对于操作的客户体验是一个巨大的挑战。 iOs系统还可以限制iPad上运行,不能在iPhone上运行。Andr...
MetroAnimatedTabControl:动画选项卡(自动排序) &lt;Controls:MetroAnimatedTabControl&gt; &lt;Controls:MetroTabItem Header=&quot;1&quot; &gt; &lt;Button Content=&quot;linzhibin&quot;/&gt; &lt;/TabItem
MetroWindow是一个专门处理Win32窗口边框的C++库,这个库的目的只有一个,就是提供一个具有流行视觉的Win32窗口。 为使用者处理了自定义边框可能遇到的各种问题,保持和原生窗口一样的键盘、鼠标事件处理行为。 提供了最佳的绘制性能,针对Windows XP和高版本的Windows做了不同的处理。 只是用了Win32 API,不依赖MFC等其他库。 支持模态、非模态对话框,支持...
CSDN-Ada助手: 非常感谢博主的辛勤创作,这篇《SpringBoot集成ActiveMQ》的博客内容十分精彩,对我们这些初学者来说非常有帮助。博客写得非常清晰明了,让我们可以快速理解并应用SpringBoot中ActiveMQ的集成。希望博主能够继续不辞辛劳地分享更多的知识,让更多的人能够从中受益。再次感谢博主! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 SpringBoot集成ActiveMQ qq_41469312: 是的,这个我查了好久才发现是 SimpleJmsListenerContainerFactory 的问题 SpringBoot集成ActiveMQ Alvin-V: 这个声明队列和主题除了通过@Bean的方式,有没有像RabbitMq一样通过@RabbitListener()注解方式声明出来? IDEA提示https://start.spring.io连接不上 Java_md: 我怎么是这个阿里云这个连接不上,spring.io的可以 SpringBoot集成ActiveMQ SimpleJmsListenerContainerFactory 改为 DefaultJmsListenerContainerFactory 应该可以解决 mq重启项目自动重新连接的问题