WPF整理-XAML构建后台类对象

简介: 原文:WPF整理-XAML构建后台类对象1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的。其实不然! "Actually, XAML has nothing to do with UI. It's merely a declarative way of constructing objects and setting their properties.” XAML和UI一点关系也没有,它仅仅是一种以声明方式来构建对象,设置对象属性的一种方式而已,和code behind file作用差不多。
原文: WPF整理-XAML构建后台类对象

1.XAML

接触WPF的第一眼就是XAML---XAML是用来描绘界面的。其实不然!

"Actually, XAML has nothing to do with UI. It's merely a declarative way of constructing objects and setting their properties.”

XAML和UI一点关系也没有,它仅仅是一种以声明方式来构建对象,设置对象属性的一种方式而已,和code behind file作用差不多。XAML这种声明方式构建对象的好处是,程序员只管声明自己要什么,至于如何构建则不需要考虑。

XAML对WPF来讲,也不是必须的。我们可以轻松实现一个WPF工程,没有任何XAML。  

XML也不是WPF才有,举个反例如在WF中XAML被用来构建工作流。

2.XAML和编译

"A XAML file is compiled by a XAML compiler that produces a binary version of the XAML, known as BAML. This BAML is stored as a resource inside the assembly and is parsed at runtime in the InitializeComponent call to create the actual objects. The result is bundled with the code behind file (the typical Window class is declared as partial, meaning there may be more source files describing the same class) to produce the final code for that class."

XAML文件首先由XAML编译器编译成二进制的BAML,并以资源的形式存储在程序集中,在运行时由InitializeComponent方法结合后台代码来构建最终的对象。

3.通过XAML来构建后台类对象-Single Object

譬如我们定义一个后台类。如下:

    class Book
    {
        public string Name { get; set; }
        public string Author { get; set; }
        public decimal Price { get; set; }
        public int YearPublished { get; set; }

    }

我们如何在XAML中访问这个类呢?

1.添加一个XAML映射,code snip如下:

<Window x:Class="CreatingCustomTypeInXaml.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:local="clr-namespace:CreatingCustomTypeInXaml"

如果不在同一个程序集需要加上";assembly=程序集名称"。

2.这样使用

    <Grid>
        <Button  HorizontalAlignment="Left" Margin="129,82,0,0" VerticalAlignment="Top" Width="258" Height="107">
            <local:Book Name="WPF tutorial" Author="DebugLZQ" YearPublished="2013" Price="29.99"/>
        </Button> 
    </Grid>

当然,为了使上面的代码正常工作,我们需要为Book类重写一个合适的ToString。

    class Book
    {
        public string Name { get; set; }
        public string Author { get; set; }
        public decimal Price { get; set; }
        public int YearPublished { get; set; }

        public override string ToString()
     {
      return string.Format("{0} by {1}\npublished {2}",Name,Author,YearPublished);
        }
    }

 

程序运行如下:

 

----

又如,可以在MVVM中可以在View中为Window的DataContent赋值ViewModel(虽不是最好的办法):

<Window x:Class="AsynchronousBindingDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:AsynchronousBindingDemo"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    <Grid>
        <TextBlock Text="{Binding Text1, IsAsync=True}" FontSize="60" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

参考DebugLZQ后续博文:

MVVM: Improve MVVM Application Performance Using Framework Features
View and ViewModel Mapping using MEFedMVVM

4.通过XAML来构建后台类对象-Collection Object

上面我们是在XAML中构建简单的Single Object,如果我们需要构建一个数组,该如何做呢?

如,我们有如下一个类:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

现在我们需要用xaml构建这个类的数组。
我们在C#中新增一个类:

    public class PersonList : List<Person>
    {
        
    }

上面这个类的目的是用来包装泛型List<Person>,因为泛型对象是无法再xaml中构建的。

其实,我们一般不用List,而是用ObservableCollection。请参考DebugLZQ后续博文:WPF整理-Binding to a Collection
如下使用:

xmlns:local="clr-namespace:CreatingCustomTypeInXaml"
        <ListBox  DisplayMemberPath="Age">
            <ListBox.ItemsSource>
                <local:PersonList>
                    <local:Person Name="DebugLZQ1" Age="26"/>
                    <local:Person Name="DebugLZQ2" Age="26"/>
                </local:PersonList>
            </ListBox.ItemsSource>
        </ListBox> 

通常,我们会把XAML构建的对象放到Resource中。如下:

    <Window.Resources>
        <local:PersonList x:Key="personList">
            <local:Person Name="DebugLZQ1" Age="26"/>
            <local:Person Name="DebugLZQ2" Age="26"/>
        </local:PersonList>
    </Window.Resources>
<ListBox ItemsSource="{StaticResource personList}" DisplayMemberPath="Name"/>

当然,List<int>、List<string>。。。。相同。

运行如下:

附:MainWindow.xaml,MainWindow.xaml.cs

<Window x:Class="CreatingCustomTypeInXaml.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:CreatingCustomTypeInXaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:PersonList x:Key="personList">
            <local:Person Name="DebugLZQ1" Age="26"/>
            <local:Person Name="DebugLZQ2" Age="26"/>
        </local:PersonList>
    </Window.Resources>
    <StackPanel>
        <Grid>
            <Button  HorizontalAlignment="Left" Margin="129,82,0,0" VerticalAlignment="Top" Width="258" Height="107">
                <local:Book Name="WPF tutorial" Author="DebugLZQ" YearPublished="2013" Price="29.99"/>
            </Button>
        </Grid>
        <ListBox ItemsSource="{StaticResource personList}" DisplayMemberPath="Name"/>
        <ListBox  DisplayMemberPath="Age">
            <ListBox.ItemsSource>
                <local:PersonList>
                    <local:Person Name="DebugLZQ1" Age="26"/>
                    <local:Person Name="DebugLZQ2" Age="26"/>
                </local:PersonList>
            </ListBox.ItemsSource>
        </ListBox> 
    </StackPanel>
</Window>
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace CreatingCustomTypeInXaml
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
    public class PersonList : List<Person>
    {
        
    }

}
View Code

 

5.通过XAML构建---Static对象

MainWindowTextSettings.cs如下:

using System.Windows.Media;

namespace StaticCliassInXamlDemo
{
    public class MainWindowTextSettings
    {
        public static double FontSize = 64;

        public static string StringValue = "Customer customized value";

        public static Brush ForeGround = new SolidColorBrush(Colors.Red);
    }
}

MainWindow.xaml如下:

<Window x:Class="StaticCliassInXamlDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:oem="clr-namespace:StaticCliassInXamlDemo"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock Text="{x:Static oem:MainWindowTextSettings.StringValue}"
                    FontSize="{x:Static oem:MainWindowTextSettings.FontSize}"
                    Foreground="{x:Static oem:MainWindowTextSettings.ForeGround}"
                   TextTrimming="CharacterEllipsis"/>
    </Grid>
</Window>

效果如下:

 

希望对你有帮助~

目录
相关文章
|
6月前
|
XML 开发框架 .NET
|
开发框架 .NET C#
2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
57 0
|
3月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
100 0
|
3月前
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
82 0
|
3月前
|
容器 C# 开发者
XAML语言大揭秘:WPF标记的魅力所在,让你轻松实现界面与逻辑分离,告别复杂代码!
【8月更文挑战第31天】XAML提供了一种直观且易于维护的界面设计方式,使得开发者可以专注于逻辑和业务代码的编写,而无需关心界面细节。通过数据绑定、布局管理和动画效果等特性,XAML可以实现丰富的界面交互和视觉效果。在实际开发过程中,开发者应根据具体需求选择合适的技术方案,以确保应用程序能够满足用户的需求。希望本文的内容能够帮助您在WPF应用程序开发中更好地利用XAML语言。
44 0
|
3月前
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
183 0
|
3月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
166 0
|
3月前
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(8) -- 使用Converter类实现内容的转义处理
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(8) -- 使用Converter类实现内容的转义处理
|
IDE C# 开发工具
2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
58 0
|
C#
WPF技术之Xaml Window
WPF Window 是一个 WPF 窗口类,它具有许多属性枚举可以控制窗口的外观和行为。
126 0
WPF技术之Xaml Window