整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

24.WPF 样式基础

24.WPF 样式基础


样式是组织和重用以上的重要工具。不是使用重复的标记填充XAML, 通过Styles创建一系列封装所有这些细节的样式。然后通过Style属性应用封装好的样式。这点类似于CSS样式。

WPF样式也支持触发器(trigger),当属性发生变化时,可通过触发器改变控件的样式,并且可使用模板重新定义控件的内置外观。

正文


给所有某一类标签相同样式

<Window.Resources>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Margin" Value="10"></Setter>
        <Setter Property="FontSize" Value="20"></Setter>
    </Style>
</Window.Resources>
<StackPanel>
    <Label Content="Label1" Background="#54B458"></Label>
    <Label Content="Label2" Background="#00BED6"></Label>
    <Label Content="Label3" Background="#5479F5"></Label>
    <Label Content="Label4" Background="#FF9400"></Label>
    <Label Content="Label5" Background="#FF4DA0"></Label>
</StackPanel>

指定xKey名

<Window.Resources>
    <Style TargetType="{x:Type Label}" x:Key="LabelStyle">
        <Setter Property="Margin" Value="10"></Setter>
        <Setter Property="FontSize" Value="20"></Setter>
    </Style>
</Window.Resources>
<StackPanel>
    <Label Content="Label1" Background="#54B458" Style="{StaticResource LabelStyle}"></Label>
    <Label Content="Label1" Background="AliceBlue"></Label>
</StackPanel>

样式名称(Key):如果不指定Key名称,则默认会全局引用,学过HTML的都知道,这有点类似于HTML中CSS的标签选择器,而你指定Key后,就类似于CSS的id选择器

Setters集合是Style类中最重要的属性,但并非唯一属性。Style类中共有5个重要属性。

<Window.Resources>
    <Style x:Key="BackStyle">
        <Setter Property="Control.Margin" Value="10"></Setter>
        <Setter Property="Control.Foreground" Value="Red"></Setter>
        <Setter Property="Control.Background">
            <Setter.Value>
                <ImageBrush ImageSource="/user.png" TileMode="Tile" Viewport="0 0 32 32" ViewportUnits="Absolute"></ImageBrush>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<StackPanel>
    <Label Content="Label6" Style="{StaticResource BackStyle}"></Label>
</StackPanel>

关联事件处理程序

属性设置器是所有样式中最常见的要素,但也可以创建为事件关联特定事件处理程序的EventSetter对象的集合。

<Window.Resources>
    <Style x:Key="lblStyle">
        <Setter Property="Control.Margin" Value="5"></Setter>
        <Setter Property="Control.Padding" Value="5"></Setter>
        <Setter Property="Control.Foreground" Value="Blue"></Setter>
        <EventSetter Event="Control.MouseEnter" Handler="FrameworkElement_MouseEnter"></EventSetter>
        <EventSetter Event="Control.MouseLeave" Handler="FrameworkElement_MouseLeave"></EventSetter>
    </Style>
</Window.Resources>
<StackPanel>
    <Label Content="TextBlock1" Style="{StaticResource lblStyle}"></Label>
    <Label Content="TextBlock2" Style="{StaticResource lblStyle}"></Label>
    <Label Content="TextBlock3" Style="{StaticResource lblStyle}"></Label>
    <Label Content="TextBlock4" Style="{StaticResource lblStyle}"></Label>
    <Label Content="TextBlock5" Style="{StaticResource lblStyle}"></Label>
</StackPanel>
private void FrameworkElement_MouseEnter(object sender, MouseEventArgs e)
{
    ((Label)sender).Background=new SolidColorBrush(Colors.Gold);
}

private void FrameworkElement_MouseLeave(object sender, MouseEventArgs e)
{
    ((Label)sender).Background=new SolidColorBrush(Colors.White);
}

继承样式

<Window.Resources>
    <Style x:Key="FontStyle">
        <Setter Property="Control.FontSize" Value="30"></Setter>
    </Style>
    <Style x:Key="lblStyle" BasedOn="{StaticResource FontStyle}">
        <Setter Property="Control.Margin" Value="5"></Setter>
        <Setter Property="Control.Padding" Value="5"></Setter>
        <Setter Property="Control.Foreground" Value="Blue"></Setter>
        <EventSetter Event="Control.MouseEnter" Handler="FrameworkElement_MouseEnter"></EventSetter>
        <EventSetter Event="Control.MouseLeave" Handler="FrameworkElement_MouseLeave"></EventSetter>
    </Style>
</Window.Resources>

使用类型标记扩展来隐式地设置键名

PF和WinForm技术有什么区别?哪个更加有前景?

2019-03-19

苍狼王~

码龄3年


1、

结果来说,属于两套界面渲染方式。一个是对传统windows界面元素的封装,通过gdi绘制。另一个是全新的dx渲染绘制的界面,也脱离了对传统windows控件的依赖,没有历史包袱,理论上可以展现更炫酷的界面。对初级开发人员来说,没太大区别,类似的基本设计器是他们设计界面的主要手段,一样给事件编写代码。对初级以上开发人员来说,wpf需要学习xaml,有全新的ui描述语言,特别是可以通过模板的嵌套实现复杂的元素,通过style实现类似css的功能,通过比winform完善的多的数据绑定机制实现业务逻辑可以专心对数据而不是界面进行开发。前途来说,两者必定还会长期共存。深入理解winform对理解windows一些内部机制有好处。好好学习wpf可以更方便过度到其他xaml相关技术,这是微软目前广泛使用的技术,比如接下来的windows通用应用。

作者:知乎用户

链接:https://www.zhihu.com/question/36859063/answer/69371365

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2、

Winform本质上就是在MFC上增加一层.Net API, 从06年开始就只有几个人在维护,基本上不增加任何新feature, 只是做bug fix. 所以,如果你要开发windows上的程序,最好不要使用Winform, 懂了这个技能也没啥用。Win8开始,微软用了一套新的Framework,但是跟WPF很相像,都是XAML,后面的设计思想也是基本一样的(毕竟是同一组人设计的)所以,如果你要学Windows上界面开发,WPF算是一个选择吧另外,从实现上讲,WinForm用的是Windows以前那一套每个控件都是一个窗口的设计,而WPF本身只有一个窗口,所有控件都在这个窗口里的Visual Tree上,另外,它还可以有效利用你的GPU.

作者:cabbage

链接:https://www.zhihu.com/question/36859063/answer/77876774

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3、

对于初学者来说,最直观的印象是:winform的控件更多,但是wpf的界面可以更炫酷,更重要的是wpf对于屏幕的自适应比winform优秀得多。太多开发桌面程序的人由winform转到wpf最重要的原因是winform的控件自适应做得很差,而不同客户公司里有不同比例的显示器。winform还有一些其他方面让你不爽,比如label标签背景不能设置为透明,以及窗口编辑视图不能缩放,让你感觉到很掣肘。而wpf的则给了你全面的自由,特别是学到以后的修改模板以及特效。至于数据绑定,mvvc 设计模式初学者通常感受不到它的好处的。至于说到的性能差异,通常可以忽略不计。而且wpf完全兼容winform的语法,所以越快转越好!

作者:知乎用户

链接:https://www.zhihu.com/question/36859063/answer/69381456

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4、

你想上班 那么针对公司需求学如果只是自己写着玩 那么区分一下1.你的程序运行在 自己机器a.一个工具而已 要的是cooooooool 那么WPFb.一个工具而已 要的是useful easy 那么winform2.运行在客户机器a.客户要求coooooool 那么wpfb.客户要求 userful 那么winform不要谈到性能 就可以忽略。 XP机器 依旧很多。记住WPF 需要大量内存 以及CPU的代价来实现普通功能。记住WPF 是新的东西 需要重新上手学习记住 winform是 老的东西 win32 的那一套老生常谈都可用在这里如果谈前景 理论上说起来是WPF 更有前景 但是目前实际来看 WPF发展并不如预期 相反winform也并不如预期的没落。加上 巨硬 经常会自己打脸。

作者:Nico Chen

链接:https://www.zhihu.com/question/36859063/answer/128784499

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

5、做项目WinForm更好。虽然WPF更先进,但是好比XP比Win8更普及一样。WinForm具有更好的客户端性能。功能上也差不多,都能做出来。还有UWP,当然这个更冷门。

比较有前景的是 .net Core。

6、

1、改界面winform:写的程序如果需要改界面牵扯很大。代码的编辑可能会导致更多的错漏出现而不自知。大工程改界面更甚。wpf:如果采用mvvm(model、view、viewmodel)来写,任你界面改翻天,后台代码不受任何印象。2、复杂的控件winform:写各种各样的后台代码wpf:用依赖属性、附加属性、触发器即可定制复杂的控件。比如显示股票k线价格的控件3、动画winform:写后台代码wpf:用animation的各种属性即可4、句柄winform:一个控件一个句柄(记得是这样,如果我记错了请指正)wpf:整个窗口同一个句柄5、控件自适应winform:麻烦wpf:利用wpf的panel,就能让控件自动自适应。

作者:知乎用户

链接:https://www.zhihu.com/question/36859063/answer/380193324

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

7、

作者:知乎用户

链接:https://www.zhihu.com/question/36859063/answer/524667474

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

winForm 使用同一套编程语言代码完成界面的设计,以及后台的交互逻辑。你在winForm代码中可以了解和干预图形界面的渲染时机和细节。winForm使用传统的GDI渲染图形界面,较为中规中矩,但难以实现得更绚丽。winForm很成熟,有十几年的技术积淀,但微软已经停止对其增加新的特性,仅在某些安全漏洞上做一些补丁。WPF的设计理念是图形和逻辑完全分离,因此图形界面的设计是通过专门的XAML代码设计的,后台逻辑则可以使用C#或VB编写。你无法在WPF/XAML代码中了解和干预图形界面的渲染时机和细节。WPF使用DX渲染图形界面,更接近图形驱动程序,效果可以非常绚丽,性能也比较好。WPF出现的比较晚,但也有好几年的技术沉淀了。由于现阶段微软更推崇升级版的UWP,WPF本身也像winForm一样好久没有新的特性了。winForm适合没有专门的图形设计师,且不需要在图形界面有太多要求的团队,入手简单。WPF适合有专门的图形设计师,图形界面有较高要求的团队,相对复杂。就技术本身来说,WPF的技术更符合时代潮流,更有前景。但个人来说,了解winForm有助于理解图形界面生成处理的细节,winForm在某种程度上类似于MFC,但又不至于太底层而难懂。

8、

你如果是职业码农,请问你学wpf做什么呢?开发桌面exe吗?就算搞专业桌面应用的企业也都是跨平台方案,有几个用wpf呢?你如果是业余码农,为什么不用winform呢?winform简单而且开发速度快,嫌丑的话再用donetbar之类的插件美化一下即可,最重要的是部署,xp win7基本都有net2.0的环境,直接就能跑。你能体会到写完wpf,最后部署到xp却发现客户端上安装net4.0装不上的感觉吗?补充下:现在xp电脑基本上不用考虑,但是依然不推荐wpf。速成推荐winform,深入学习推荐qt或者electron 。qt 既有常规拖控件的widgets,又有类似于前端界面的qml和webengine,程序还能跑在安卓/ios上,强烈推荐。

作者:烫烫屯

链接:https://www.zhihu.com/question/36859063/answer/80781661

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

9、

我正面回答一下题主的问题吧:其实两个前景都不大好。WPF比Winform略好一点的方面是,现在微软的新界面开发方式,都是用XAML,所以Siverlight,WPF,Windows Phone/Metro,学了一样,就一通百通了,但是实质上,都看不到有什么太光明的前景,至少在国内是这样的。

作者:赵科进

链接:https://www.zhihu.com/question/36859063/answer/69389566

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

10、

学会XAML,5分钟看懂DIV+CSS。

11、

当然是各有各的好喽。

WinFrom比较老是不追求界面,要求一般性能的首选。Wpf是新一代的Ui开发框架,适合界面要求高的,性能也没有那么不堪,适合快速开发。所以假如想做好的话这两者甚至是MFC都要熟悉的。这三者即可相互替代,也可相互融合。手机码字

12、

作者:秋枫

链接:https://www.zhihu.com/question/36859063/answer/332638303

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

wpf的底层是DirectX,意味着你的显示效果不仅可以更炫更酷,同时显卡(集显独显均可)提供的加速也不会拖累你的运行速度。winform的底层是GDI/GDI+,除非你明确使用DX的接口,不然永远都是CPU在画图,效果没那么炫,而且无法显卡加速。wpf的界面设计和逻辑设计可以分离,界面设计师可以利用blend自主设计好看的界面,而不是最终让程序员来实现那个复杂的动画或者设计。winform设计师最多拖一拖,而这往往不够用。wpf对于数据逻辑、业务逻辑、显示逻辑进行了解耦和,可以让不同部门协同工作更舒服一些,winform多少有一些搅在一起

天有个想法想验证一下,但是感觉项目组web前台,后台这样开发,再联调效率有点低。

因此,想回归到原始的windows窗口程序,简单直接。

一直都很怀念当年的delphi,开发速度,尤其是开发界面速度不要太快!

delphi没落了后,开始用VS,Visual studio,不是现在前端开发用的vs code。

下载了第三方的demo后,发现vs2022中,无法将一个按钮等控件拖动到窗体上,这不扯吗,找原因没找到。

vs2022卸载了,装vs2015,又发现安装不是,老是找不到包,以前可不这样,一路next就安装下去了。难不成。。。

又回到vs2022,通过网络安装,安装上来,再打开,居然可以了。。。以前按钮,控件都是灰的,无法拖动上去。

都是界面控件可视化设计操作,怎么有点不一样呢,没有以前丝滑了。

一看,程序文件是XAML文件,打开一看,能看明白,是xml格式的控件描述。

直接用winforms多好,简单(不粗暴)。

既然第一次遇到,那就彻底搞明白。

什么是 WPF

WPF(Windows Presentation Foundation)是由微软开发的桌面应用程序框架,用于创建现代化、高度交互和具有视觉吸引力的用户界面。它是 .NET Framework 的一部分,提供了一种基于 XAML(Extensible Application Markup Language)语言的声明性编程模型,可以很容易地创建动态、灵活的用户界面,并且可以与其他 .NET 技术无缝集成。WPF 还具有强大的数据绑定和可重用性,使开发人员可以更快地构建和维护应用程序。WPF 也支持硬件加速和高分辨率显示,为用户带来更好的体验。

WPF 和 Winform 的区别

WPF(Windows Presentation Foundation)和 WinForms(Windows Forms)都是用于创建 Windows 桌面应用程序的框架,但它们有一些重要的区别:

  1. 编程模型:WPF 是基于 XAML 的声明性编程模型,它可以很容易地创建动态、灵活的用户界面,支持动画和高级视觉效果。而 WinForms 则是基于传统的命令式编程模型,需要在代码中手动设置每个控件的属性和事件处理程序。
  2. 数据绑定:WPF 有一个强大的数据绑定系统,可以将 UI 元素和数据源相互绑定,使应用程序更容易管理和更新数据。WinForms 也支持数据绑定,但不如 WPF 灵活。
  3. 可重用性:WPF 支持样式和模板,使 UI 元素可以轻松地重用和自定义,这大大简化了应用程序的开发和维护。WinForms 则需要手动创建每个 UI 元素,不太容易重用。
  4. 矢量图形和分辨率:WPF 使用矢量图形,可在高分辨率屏幕上呈现清晰的图像,而 WinForms 使用像素图形,可能在高分辨率屏幕上显示模糊或失真。

什么是XAML

Extensible Application Markup Language (Extensible Application Markup Language, XAML) 是一种声明性语言。 具体来讲,XAML 可初始化对象和设置对象的属性,使用一种可显示多个对象间分层关系的语言结构,还使用了一种支持类型扩展的支持类型约定。

使用 WPF 时首先遇到的事情之一是 XAML。XAML 代表可扩展应用程序标记语言,一种基于 XML 的简单的声明性语言,是微软用于描述 GUI 的 XML 变种。在之前的 GUI 框架如 WinForms 中,GUI 是用相同语言创建,例如 C# 或 VB.NET ,并且通常由设计者来维护。但是,通过 XAML,微软使用了另一种方式。非常类似HTML,你现在能轻松编写你的GUI。

什么是UWP

通用 Windows 平台 (UWP),可以生成适用于任何 Windows 设备(电脑、Xbox One、HoloLens 等等)的应用,然后将这些应用发布到 Store。