【WPF.NET开发】WPF中的双向功能

本文内容

  1. FlowDirection
  2. FlowDocument
  3. Span 元素
  4. 非文本元素的 FlowDirection
  5. 数字替换

与其他任何开发平台不同,WPF 具有许多支持双向内容快速开发的功能,例如,同一文档中混合了从左到右和从右到左的数据。 同时,WPF 也为需要双向功能的用户(如阿拉伯语和希伯来语用户)带来了绝佳的体验。

以下各节结合一些示例阐释了如何获得双向内容的最佳显示效果,并对许多双向功能进行了说明。 大多数示例使用的是 XAML,但你可以轻松地将这些概念应用于 C# 或 Microsoft Visual Basic 代码。

1、FlowDirection

FlowDirection 是在 WPF 应用程序中定义内容流方向的基本属性。 此属性可设置为以下两个枚举值之一:LeftToRight 或 RightToLeft。 此属性可用于从 FrameworkElement 继承的所有 WPF 元素。

以下示例将设置 TextBox 元素的流方向。

从左向右的流方向

<TextBlock Background="DarkBlue" Foreground="LightBlue" 
   FontSize="20" FlowDirection="LeftToRight">
        This is a left-to-right TextBlock
</TextBlock>

从右向左的流方向

<TextBlock Background="LightBlue" Foreground="DarkBlue"
   FontSize="20" FlowDirection="RightToLeft">
        This is a right-to-left TextBlock
</TextBlock>

下图显示了前面代码的呈现方式。

left-right-right-left.png?view=netframeworkdesktop-4.8

用户界面 (UI) 树内的元素将从其容器继承 FlowDirection。 在下面的示例中,TextBlock 位于 Grid 中,而后者位于 Window 中。 为 Window 设置 FlowDirection 意味着还将为 Grid 和 TextBlock 设置该属性。

以下示例演示如何设置 FlowDirection

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="FlowDirectionApp.Window1"
    Title="BidiFeatures" Height="200" Width="700" 
    FlowDirection="RightToLeft">
     
    <Grid>
      <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <TextBlock Grid.Column="0" >
          This is a right-to-left TextBlock
      </TextBlock>

      <TextBlock Grid.Column="1" FlowDirection="LeftToRight">
          This is a left-to-right TextBlock
      </TextBlock>
    </Grid>
</Window>

顶级 Window 包含 RightToLeftFlowDirection,因此其中包含的所有元素也都继承同一 FlowDirection。 对于要替代指定的 FlowDirection 的元素,必须添加显式方向更改,如上一示例中的第二个 TextBlock,该控件更改为 LeftToRight。 如果未定义 FlowDirection,将应用默认的 LeftToRight

下图显示了上一个示例的输出:

explicit-direction-change.png?view=netframeworkdesktop-4.8

2、FlowDocument

HTML、Win32 和 Java 等许多开发平台都对双向内容开发提供特殊支持。 标记语言(如 HTML)为内容编写器提供了在任意所需方向显示文本时必需的标记,如 HTML 4.0 标记、采用“rtl”或“ltr”作为值的“dir”等。 此标记类似于 FlowDirection 属性,但 FlowDirection 属性使用了一种更高级的方法来布局文本内容,并可用于除文本以外的内容。

在 UI 中,它是一种可以托管文本、表、图像和其他元素的组合的元素。 以下各节中的示例均使用此元素。

可通过多种方式将文本添加到 FlowDocument。 其中一种简单方法就是使用 Paragraph,它是用于对文本等内容进行分组的块级元素。 为了将文本添加到内联级元素,这些示例使用了 Span 和 Run。 Span 是用于对其他内联元素进行分组的内联级流内容元素,而 Run 是用于包含一系列无格式文本的内联级流内容元素。 一个 Span 可以包含多个 Run 元素。

第一个文档示例包含的文档具有很多个网络共享名,例如 \\server1\folder\file.ext。 无论此网络链接是包含在阿拉伯语文档还是英语文档中,建议始终以相同的方式显示它。 下图演示了如何使用 Span 元素,并显示了阿拉伯语 RightToLeft 文档中的链接:

flow-direction-span-element.png?view=netframeworkdesktop-4.8

由于文本是 RightToLeft,因此所有特殊字符(如“\”)都按从右到左的顺序分隔文本。 这样会导致链接显示顺序不正确,因此,若要解决此问题,必须嵌入文本以保留按 LeftToRight 显示的单独的 Run。 除了为每种语言提供单独的 Run 之外,还可使用一种更好的方法来解决此问题,即,将不常用的英语文本嵌入到较大的阿拉伯语 Span 中。

下图通过使用 Span 元素中嵌入的 Run 元素说明了这一点:

embedded-span-element.png?view=netframeworkdesktop-4.8

以下示例演示如何在文档中使用 Run 和 Span 元素。

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    FlowDirection="RightToLeft">

  <FlowDocument>
    <Paragraph>
      <Span FlowDirection="RightToLeft" >
        ستجد الملف هنا:
        <Run FlowDirection="LeftToRight">
           \\server1\filename\filename1.txt</Run>
        ثم باقى النص!
      </Span>
    </Paragraph>
  </FlowDocument>
</Page>

3、Span 元素

Span 元素用作具有不同流方向的文本之间的边界分隔符。 甚至具有相同流方向的 Span 元素也被视为具有不同的双向范围,这意味着 Span 元素按容器的 FlowDirection 进行排序,只有 Span 元素内的内容才遵循 Span 的 FlowDirection

下图显示了几个 TextBlock 元素的流方向。

flow-direction-text-blocks.png?view=netframeworkdesktop-4.8

以下示例演示如何使用 Span 和 Run 元素生成上图中显示的结果。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <StackPanel >

    <TextBlock FontSize="20" FlowDirection="RightToLeft">
      <Run FlowDirection="LeftToRight">العالم</Run>
      <Run FlowDirection="LeftToRight" Foreground="Red" >فى سلام</Run>
    </TextBlock>

    <TextBlock FontSize="20" FlowDirection="LeftToRight">
      <Run FlowDirection="RightToLeft">العالم</Run>
      <Run FlowDirection="RightToLeft" Foreground="Red" >فى سلام</Run>
    </TextBlock>

    <TextBlock FontSize="20" Foreground="Blue">العالم فى سلام</TextBlock>

    <Separator/>

    <TextBlock FontSize="20" FlowDirection="RightToLeft">
      <Span Foreground="Red" FlowDirection="LeftToRight">Hello</Span>
      <Span FlowDirection="LeftToRight">World</Span>
    </TextBlock>

    <TextBlock FontSize="20" FlowDirection="LeftToRight">
      <Span Foreground="Red" FlowDirection="RightToLeft">Hello</Span>
      <Span FlowDirection="RightToLeft">World</Span>
    </TextBlock>

    <TextBlock FontSize="20" Foreground="Blue">Hello World</TextBlock>

  </StackPanel>

</Page>

在此示例的 TextBlock 元素中,Span 元素根据其父级的 FlowDirection 进行布局,但每个 Span 元素中的文本根据其自己的 FlowDirection 流动。 这适用于拉丁语和阿拉伯语,也适用于任何其他语言。

添加 xml:lang

下图显示了另一个示例,该示例使用数字和算术表达式,如 "200.0+21.4=221.4"。 请注意,仅设置了 FlowDirection

numbers-flow-right-left.png?view=netframeworkdesktop-4.8

此应用程序的用户将对输出感到失望,即使 FlowDirection 正确,但数字的形状不是阿拉伯语数字应有的形状。

XAML 元素可以包括 XML 属性 (xml:lang),该属性用于定义每个元素的语言。 XAML 还支持 XML 语言原则,即,应用于树中父元素的 xml:lang 值将用于子元素。 在上面的示例中,由于未对 Run 元素或其任意顶级元素设置语言,因此使用了默认的 xml:lang(对于 XAML 为 en-US)。 Windows Presentation Foundation (WPF) 的内部数字整理算法选择对应语言(在本示例中为英语)中的数字。 若要正确呈现阿拉伯语数字,需要设置 xml:lang

下图演示添加了 xml:lang 的示例。

arabic-numbers-flow-right-left.png?view=netframeworkdesktop-4.8

以下示例将向应用程序添加 xml:lang

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    FlowDirection="RightToLeft">
      <FlowDocument>
         <Paragraph>
            <Span FlowDirection="RightToLeft" Language="ar-SA">
              العملية الحسابية: "200.0+21.4=221.4"
            </Span>
         </Paragraph>
      </FlowDocument>
</Page>

请注意,根据目标区域的不同,许多语言具有不同的 xml:lang 值,例如,"ar-SA" 和 "ar-EG" 表示阿拉伯语的两个变体。 上述示例说明你需要同时定义 xml:lang 和 FlowDirection 值。

4、非文本元素的 FlowDirection

FlowDirection 不仅定义文本在文本元素中的流动方式,还定义几乎所有其他 UI 元素的流方向。 下图显示了一个 ToolBar,该控件使用水平 LinearGradientBrush 以从左到右渐变绘制其背景。

toolbar-left-right-gradient.png?view=netframeworkdesktop-4.8

将 FlowDirection 设置为 RightToLeft 后,不仅 ToolBar 按钮是从右到左排列的,甚至 LinearGradientBrush 也将其偏移量重新调整为从右到左流动。

下图显示了 LinearGradientBrush 的重新排列。

toolbar-right-left-gradient.png?view=netframeworkdesktop-4.8

以下示例绘制了一个 RightToLeftToolBar。 若要从左到右绘制,请删除 ToolBar 的 FlowDirection 属性。

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  
  <ToolBar FlowDirection="RightToLeft" Height="50" DockPanel.Dock="Top">
    <ToolBar.Background>
      <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,1">
        <LinearGradientBrush.GradientStops>
          <GradientStop Color="DarkRed" Offset="0" />
          <GradientStop Color="DarkBlue" Offset="0.3" />
          <GradientStop Color="LightBlue" Offset="0.6" />
          <GradientStop Color="White" Offset="1" />
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </ToolBar.Background>

    <Button FontSize="12" Foreground="White">Button1</Button>
    <Rectangle Width="20"/>
    <Button FontSize="12" Foreground="White">Button2</Button>
    <Rectangle Width="20"/>
    <Button FontSize="12" Foreground="White">Button3</Button>
    <Rectangle Width="20"/>
    <Button FontSize="12" Foreground="White">Button4</Button>
    <Rectangle Width="20"/>
  </ToolBar>
</Page>

FlowDirection 异常

在少数情况下,FlowDirection 会不按预期方式运行。 本部分介绍其中两种异常。

Image

Image 表示用于显示图像的控件。 在 XAML 中,该控件可与 Source 属性一起使用,后者用于定义要显示的 Image 的统一资源标识符 (URI)。

与其他 UI 元素不同,Image 不会从容器继承 FlowDirection。 但是,如果将 FlowDirection 显式设置为 RightToLeft,则会以水平翻转方式显示 Image。 这可作为一种便捷功能提供给双向内容的开发人员,因为在某些情况下,水平翻转图像会达到所需的效果。

下图显示翻转后的 Image

flipped-image-example.png?view=netframeworkdesktop-4.8

以下示例演示 Image 未能从包含它的 StackPanel 中继承 FlowDirection

 备注

C:\ 驱动器上必须具有名为 ms_logo.jpg 的文件才能运行此示例。

<StackPanel 
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
  FlowDirection="RightToLeft">

  <Image Source="file://c:/ms_logo.jpg" 
         Width="147" Height="50"/>
  <Separator Height="10"/>
  <Image Source="file://c:/ms_logo.jpg" 
         Width="147" Height="50" FlowDirection="LeftToRight" />
  <Separator Height="10"/>
  <Image Source="file://c:/ms_logo.jpg" 
         Width="147" Height="50" FlowDirection="RightToLeft"/>
</StackPanel>

 备注

下载文件中包含的内容是 ms_logo.jpg 文件。 该代码假定 .jpg 文件不在项目中,而是位于 C:\ 驱动器中的某个位置。 必须将 .jpg 从项目文件复制到 C:\ 驱动器或更改代码才能在项目内查找该文件。 为此,请将 Source="file://c:/ms_logo.jpg" 更改为 Source="ms_logo.jpg"

路径

除 Image 外,另一个值得关注的元素是 Path。 Path 是可用于绘制一系列连接的直线和曲线的对象。 就其 FlowDirection 而言,它的行为方式类似于 Image,例如它的 RightToLeftFlowDirection 是其 LeftToRight 的水平镜像。 但是,与 Image 不同的是,Path 从容器中继承其 FlowDirection,因此用户无需显式指定它。

下面的示例使用 3 条线绘制简单的箭头。 第一个箭头从 StackPanel 继承 RightToLeft 流方向,以便从右侧的根测量其起点和终点。 第二个箭头具有显式的 RightToLeftFlowDirection,也从右侧开始。 但第三个箭头的起始根位于左侧。 

<StackPanel 
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
  FlowDirection="RightToLeft">

  <Path Stroke="Blue" StrokeThickness="4">
    <Path.Data>
      <GeometryGroup >
        <LineGeometry StartPoint="300,10" EndPoint="350,30" />
        <LineGeometry StartPoint="10,30" EndPoint="352,30" />
        <LineGeometry StartPoint="300,50" EndPoint="350,30" />
      </GeometryGroup>
    </Path.Data>
  </Path>

  <Path Stroke="Red" StrokeThickness="4" FlowDirection="RightToLeft">
    <Path.Data>
      <GeometryGroup >
        <LineGeometry StartPoint="300,10" EndPoint="350,30" />
        <LineGeometry StartPoint="10,30" EndPoint="352,30" />
        <LineGeometry StartPoint="300,50" EndPoint="350,30" />
      </GeometryGroup>
    </Path.Data>
  </Path>
 
  <Path Stroke="Green" StrokeThickness="4" FlowDirection="LeftToRight">
    <Path.Data>
      <GeometryGroup >
        <LineGeometry StartPoint="300,10" EndPoint="350,30" />
        <LineGeometry StartPoint="10,30" EndPoint="352,30" />
        <LineGeometry StartPoint="300,50" EndPoint="350,30" />
      </GeometryGroup>
    </Path.Data>
  </Path>
</StackPanel>

下图显示了上一个示例的输出,其中使用 Path 元素绘制了箭头:

arrows-drawn-path-element.png?view=netframeworkdesktop-4.8

Image 和 Path 这两个示例展示了 WPF 如何使用 FlowDirection。 除了在容器内按特定方向布局 UI 元素外,FlowDirection 还可与 InkPresenter(在图面上呈现墨迹)、LinearGradientBrushRadialGradientBrush 等元素一起使用。 每当模拟从左到右行为的内容需要从右到左行为(反之亦然)时,Windows Presentation Foundation (WPF) 就会提供该功能。

5、数字替换

一直以来,Windows 始终通过以下方式支持数字替换:允许对相同数字使用不同区域性形状的表示形式,但同时使这些数字的内部存储形式在不同区域设置之间保持统一;例如,数字虽然以其常见的十六进制值(如 0x40、0x41)存储,但却根据所选的语言进行显示。

这使应用程序无需将数值从一种语言转换为另一种语言,就可对它们进行处理;例如,用户可以在本地化的阿拉伯语 Windows 中打开 Microsoft Excel 电子表格,并会看到阿拉伯语形状的数字,但在欧洲版 Windows 中打开它时,会看到相同数字的欧洲表示形式。 这对其他符号(如逗号分隔符和百分比符号)来说也是必需的,因为在同一文档中它们通常随数字一起出现。

Windows Presentation Foundation (WPF) 沿承了这一传统,并为此功能提供了进一步支持,以允许用户更好地控制何时以及如何使用替换。 虽然此功能适用于任何语言,但它对双向内容尤其有用;由于应用程序可能会在各种区域性下运行,因此针对特定语言来设置数字形状通常是应用程序开发人员所面临的难题。

控制 Windows Presentation Foundation (WPF) 中的数字替换方式的核心属性是 Substitution 依赖属性。 NumberSubstitution 类指定如何显示文本中的数字。 它有三个定义其行为的公共属性。 下面概括了其中的每个属性:

CultureSource:

此属性指定如何确定数字的区域性。 它使用三个 NumberCultureSource 枚举值之一。

CultureOverride

仅当 CultureSource 属性设置为 Override 时才使用 CultureOverride 属性,否则将忽略。 该属性指定数字区域性。 默认值 null 被解释为 en-US。

Substitution

此属性指定要执行的数字替换类型。 它使用以下 NumberSubstitutionMethod 枚举值之一:

  • AsCulture:替换方法根据数字区域性的 NumberFormatInfo.DigitSubstitution 属性决定。 这是默认情况。

  • Context:如果数字区域性为阿拉伯语或波斯语区域性,则指定数字取决于上下文。

  • European:数字始终呈现为欧洲数字。

  • NativeNational:使用数字区域性的民族数字(由区域性的 NumberFormat 指定)呈现数字。

  • Traditional:使用数字区域性的传统数字呈现数字。 对于大多数区域性,这与 NativeNational 相同。 但是,NativeNational 对某些阿拉伯语区域性会产生拉丁数字,而此值对所有阿拉伯语区域性产生阿拉伯数字。

这些值对双向内容开发人员意味着什么? 在大多数情况下,开发人员可能只需要定义 FlowDirection 和每个文本 UI 元素的语言,例如 Language="ar-SA" 和 NumberSubstitution 逻辑负责根据正确的 UI 显示数字。 以下示例演示如何在阿拉伯语版 Windows 中运行的 Windows Presentation Foundation (WPF) 应用程序中使用阿拉伯语和英语数字。

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
  <StackPanel>
   <TextBlock Background="LightGreen" FontSize="32" 
      Language="ar-SA" FlowDirection="RightToLeft">1+2=3</TextBlock>
   <TextBox Background="LightGreen" FontSize="32" 
      Language="ar-SA" FlowDirection="RightToLeft">1+2=3</TextBox>
   <TextBlock Background="LightBlue" FontSize="32">1+2=3</TextBlock>
   <TextBox Background="LightBlue" FontSize="32">1+2=3</TextBox>
 </StackPanel>
</Page>

下图演示了在阿拉伯语版的 Windows 中运行并显示阿拉伯语和英语数字时上一示例的输出:

arabic-english-numbers.png?view=netframeworkdesktop-4.8

在此示例中,FlowDirection 很重要,因为将 FlowDirection 改为设置成 LeftToRight 时会产生欧洲数字。 以下各节介绍如何在整个文档内统一显示数字。 如果未在阿拉伯语版 Windows 上运行此示例,所有数字都将显示为欧洲数字。

定义替换规则

在实际的应用程序中,可能需要以编程方式设置语言。 例如,希望将 xml:lang 属性设置为系统 UI 所用的相同属性,或根据应用程序具体状态更改语言。

如果希望根据应用程序状态进行更改,请利用 Windows Presentation Foundation (WPF) 提供的其他功能。

首先,设置应用程序组件的 NumberSubstitution.CultureSource="Text"。 使用此设置可确保对于将“User”用作默认值的文本元素(如 TextBlock),设置不会来自 UI。

例如:

<TextBlock
   Name="text1" NumberSubstitution.CultureSource="Text">
   1234+5679=6913
</TextBlock>

例如,在对应的 C# 代码中,将 Language 属性设置为 "ar-SA"

text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage("ar-SA");

如果需要将 Language 属性设置为当前用户的 UI 语言,请使用下面的代码。

text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);

CultureInfo.CurrentCulture 表示当前线程在运行时所用的当前区域性。

最后的 XAML 示例应与下面的示例类似。

<Page x:Class="WindowsApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Code Sample" Height="300" Width="300"
>
    <StackPanel>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft">عربى: 1+2=3
      </TextBlock>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft" 
         NumberSubstitution.Substitution="European">عربى: 1+2=3 
      </TextBlock>
    </StackPanel>
</Page>

最后的 C# 示例应与下面的示例类似。

namespace BidiTest
{
    public partial class Window1 : Window
    {

        public Window1()
        {
            InitializeComponent();

            string currentLanguage =
                System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag;

            text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(currentLanguage);

            if (currentLanguage.ToLower().StartsWith("ar"))
            {
                text1.FlowDirection = FlowDirection.RightToLeft;
            }
            else
            {
                text1.FlowDirection = FlowDirection.LeftToRight;
            }
        }
    }
}

下图显示了任一编程语言的窗口外观,该窗口显示阿拉伯语数字:

displays-arabic-numbers.png?view=netframeworkdesktop-4.8

使用 Substitution 属性

Windows Presentation Foundation (WPF) 中的数字替换方式同时取决于文本元素的语言及其 FlowDirection。 如果 FlowDirection 为从左到右,则会呈现欧洲数字。 但是,如果数字的前面为阿拉伯语文本或者具有设置为“ar”的语言,且 FlowDirection 为 RightToLeft,则会改为呈现阿拉伯语数字。

但在某些情况下,建议创建统一的应用程序,例如适用于所有用户的欧洲数字。 或者在具有特定 Style 的 Table 单元格中呈现阿拉伯语数字。 执行此操作的一种简单方法是使用 Substitution 属性。

在下面的示例中,第一个 TextBlock 未设置 Substitution 属性,因此算法将按预期方式显示阿拉伯语数字。 但是,在第二个 TextBlock 中,替换设置为欧洲,替代了默认的阿拉伯语数字替换,此时将显示欧洲数字。

<Page x:Class="WindowsApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Code Sample" Height="300" Width="300"
>
    <StackPanel>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft">عربى: 1+2=3
      </TextBlock>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft" 
         NumberSubstitution.Substitution="European">عربى: 1+2=3 
      </TextBlock>
    </StackPanel>
</Page>

 在 GitHub 上与我们协作

可以在 GitHub 上找到此内容的源,还可以在其中创建和查看问题和拉取请求。

  • 50
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作为初学入门选择方向的好教材 许多技术人员在面对.NET Framework 3.0/3.5大量的新知识、新技术的时候感到彷徨,对自己现有的技术知识是否过时会产生疑问,对新技术会产生抵触的情绪,其实,只要能学习到真正代表业界趋势的技术,花不太多的时间掌握新技术,乐趣就会随之产生。编写本书的一个目的就是要让读者认识到.NET 3.5相关的新知识都是基于现有技术的,体会、掌握并应用这些新技术并不是难事。 本书全面讲解了.NET Framework 3.5开发各方面的技术要点,共分19章。本书没有对各个功能的工作原理进行深入的揭示,而是采用“知识进述”+“代码示例”的方式,让读者可以快速体验并掌握.NETFramework 3.5的开发方法。 本书适合从事各利.NET程序开发的人员阅读。通过不同层次的例子,相信可以让读者理解、掌握,NET程序开发,特别是关于WPF、wcF和WF这3种重要框架的应用所要掌握的知识。 第1章 .NETFramework3.5简介 1 文名: .NETFramework3.5开发技术详解 作者: 王毅.图书分类: 计算机与网络 资源格式: PDF 版本: 2009 出版社: 人民邮电出版社.书号: 9787115190918.发行时间: 2009年 地区: 大陆 语言: 简体文 简介: 1.1 .NETFramework3.5在.NET技术体系的位置 1 1.2 .NET3.5各部分的功能 2 1.3 .NET3.5的组件 3 1.3.1 WindowsPresentaionFoundation(WPF) 3 1.3.2 WindowsCommunicationFoundation(WCF) 5 1.3.3 WorkflowFoundation(WF) 6 1.4 搭建.NET3.5的开发环境 6 1.4.1 在WindowsXP/2003/Vista上搭建开发环境 6 1.4.2 相关工具 9 第2章 .NET3.5的新功能 12 2.1 .NET3.5概要 12 2.2 新的.NET基础类型 12 2.3 C#语言的强化 14 2.3.1 C#基本语法增强 14 2.3.2 LINQ(集成语言查询) 16 第3章 WindowsPresentationFoundation基础知识 34 3.1 WindowsPresentationFoundation(WPF)的概念 34 3.2 XAML的概念 35 3.2.1 命名空间 36 3.2.2 代码后置文件 37 3.2.3 调用.NET类库的类来定义对象 37 3.2.4 属性 38 3.3 WPF的结构和相关的类库 39 3.4 WPF应用程序的类型 44 3.4.1 传统类型的视窗程序 44 3.5 创建第一个WPF程序 49 第4章 WPF程序的布局 59 4.1 布局的基础知识 59 4.2 StackPanel容器 61 4.3 DockPanel容器 65 4.4 Grid容器 67 4.4.1 表格的高度和宽度 69 4.4.2 ColumnSpan和RowSpan 70 4.4.3 Grid的SharedSizeGroup 71 4.5 Canvas容器 72 4.6 文档布局 74 4.6.1 WrapPanel 74 4.6.2 TextBlock 75 4.6.3 FlowDocument 78 4.7 其他容器 83 4.8 视图控制 84 4.9 自定义布局 87 第5章 WPF的控件 91 5.1 控件模型 91 5.2 WPF的控件树 92 5.3 路由事件 95 5.4 从属属性(DependencyProperty) 97 5.5 处理交互行为 102 5.6 基本控件的使用 106 5.6.1 Button控件 106 5.6.2 TextBox类控件 109 5.6.3 列表控件 113 5.6.4 Menu控件 118 5.6.5 包容式控件 121 5.6.6 Label和TextBlock 126 5.6.7 其他控件 127 第6章 资源和数据绑定 134 6.1 在WPF定义资源 134 6.1.1 WPF的嵌入式资源 134 6.1.2 定义逻辑资源 135 6.2 使用资源 139 6.3 数据绑定基础 142 6.4 集合的绑定 151 6.5 DataProvider 157 6.6 高级数据绑定操作 165 6.7 使用CollectionViewSource进行排序和过滤 167 第7章 让WPF程序支持样式和主题 169 7.1 样式基础 169 7.1.1 WPF样式的定义 169 7.1.2 样式的作用 170 7.1.3 样式的作用范围 171 7.2 内联样式 172 7.3 命名样式 172 7.4 样式触发器 174 7.5 控件模板 180 7.6 主题 182 第8章 WPF的绘图功能 189 8.1 2D图形基础 189 8.2 2D几何图形 190 8.3 画刷和画笔 197 8.3.1 画刷 197 8.3.2 画笔 204 8.4 2D图形变换(Transform) 205 8.4.1 平移变换 205 8.4.2 缩放变换 206 8.4.3 旋转变换 206 8.4.4 斜移变换 207 8.4.5 矩阵变换 207 8.4.6 变换组(TransformGroup) 210 8.5 2D图形特效 210 8.6 3D图形基础 213 8.6.1 计算机图形学基础 213 8.6.2 WPF的3D类型 215 8.7 3D变换 218 8.8 WPF的动画支持 221 8.8.1 Animation对象 222 8.8.2 第一个动画 223 第9章 WPF的多媒体 230 9.1 对视频和音频的支持 230 9.1.1 视频支持 230 9.1.2 音频支持 235 9.2 语音功能 238 第10章 WPF高级技术 241 10.1 WPF自定义控件 241 10.1.1 编写控件的基础知识 241 10.1.2 开始编写控件 244 10.1.3 编写CustomControl控件 249 10.2 WPF的互操作性 252 10.2.1 在WPF使用Winform控件 252 10.2.2 在WInform程序使用WPF控件 254 10.3 WPF的异步模型 254 10.4 WPF对自动化程序的支持 256 10.4.1 Automation树 256 10.4.2 控件的访问方式 257 第11章 WindowsCommunicationFoundation(WCF)基础 261 11.1 面向服务编程模型(框架) 261 11.1.1 什么是SOA 261 11.1.2 为什么要使用SOA 263 11.2 WCF是什么 264 11.3 WCF的结构 265 11.4 WCF基础 267 第12章 WCF的契约 268 12.1 服务契约和操作契约 268 12.2 数据契约(DataContract) 269 12.3 错误契约(FaultContract) 272 12.4 创建WCF服务 273 12.5 编写WCF客户端 277 12.6 配置WCF程序 279 12.6.1 服务端配置 279 12.6.2 客户端配置 283 12.6.3 配置工具 284 第13章 WCF的消息交换 285 13.1 与通信有关的概念 285 13.1.1 Address(地址) 285 13.1.2 Bindings(通信绑定) 286 13.1.3 Contracts(契约) 288 13.1.4 EndPoint 292 13.2 远程对象的传递 293 13.3 大对象的传递 299 13.4 错误处理 303 13.5 会话管理 308 13.6 双向通信 311 13.7 WCF的消息编码 318 13.8 基于队列的消息交换 319 13.9 点对点网络(Peer-To-PeerNetwork) 322 第14章 并发管理 327 14.1 服务器实例行为管理 327 14.2 并发管理 330 14.3 同步上下文 332 14.4 回调的同步设置和异步调用 334 第15章 WCF的事务支持 341 15.1 事务概要 341 15.2 WCF的事务 343 15.3 创建支持事务的服务 345 第16章 WCF的安全解决方案 353 16.1 认证和授权 353 16.1.1 认证 354 16.1.2 授权 355 16.2 安全传输 360 16.2.1 传输的安全性 360 16.2.2 消息安全 363 16.3 安全策略 364 第17章 WCF的扩展性 368 17.1 服务行为的扩展 368 17.1.1 自定义分发器特性 369 17.2 自定义通道 374 17.3 自定义元数据 378 17.3.1 元数据的基本知识 378 17.3.2 扩展元数据系统 379 17.4 自定义序列化 380 第18章 WCF的运行环境 383 18.1 在IIS上启用WCF服务 383 18.2 在.NET程序运行WCF服务 386 18.3 在Windows服务程序运行WCF服务 387 第19章 工作流(WorkFlow) 392 19.1 工作流(WF)简介 392 19.1.1 工作流的概念 392 19.1.2 WindowsWorkFlowFoundation 393 19.2 Activity(活动) 396 19.3 WF运行时 401 19.4 基于状态机的工作流 405 19.5 工作流的持久化 406 19.6 工作流的XAML表示 407
### 回答1: WPF使用了MVVM(Model-View-ViewModel)架构,这一架构有几个关键技术。 首先是数据绑定技术,它使得ViewModel和View之间实现了强耦合性,有效地将数据的传递和显示解耦。WPF的数据绑定包括基于属性的绑定、多路绑定、命令绑定等技术,让开发者可以更加方便地控制UI。 其次是依赖属性技术,它使得我们可以将视图的属性与ViewModel的属性绑定在一起,并且可以对绑定的属性进行更加细致的控制,例如可以限制输入的类型、范围等等,从而保证了数据的有效性和安全性。 另外,WPF还通过ICommand接口和Command Binding机制来实现命令的绑定和控制,使得开发者可以在ViewModel定义命令并将其绑定到界面上的按钮等控件上,实现了更加灵活有力的用户界面控制。 最后,WPF还支持依赖注入技术,让开发者可以更加方便地组织代码和管理对象之间的依赖关系,进一步提高了代码的可复用性和可维护性。 总之,WPF使用了数据绑定、依赖属性、命令绑定和依赖注入等关键技术,实现了MVVM架构的优秀表现,并在WPF开发取得了巨大的成功。 ### 回答2: WPF是一种基于XAML的框架,其包括了许多关键技术,其一个非常重要的技术是MVVM(Model-View-ViewModel)。MVVM是一种基于模型-视图-ViewModel的设计模式,使开发人员可以更轻松地分离和管理应用程序的各个部分。 在WPF,MVVM使用了以下关键技术: 1. 数据绑定:数据绑定是MVVM模式的核心特性,它使ViewModel能够与View彻底分离。ViewModel的数据可以直接绑定到View的控件上,View可以随时响应ViewModel的变化,实现数据的双向绑定。 2. Commands(命令):命令是一种可绑定的对象,可以在ViewModel触发其它操作。它使ViewModel能够控制用户界面,实现解耦合的设计。在WPF,可以使用 ICommand 接口实现命令。 3. INotifyPropertyChanged接口:在MVVM模式,ViewModel需要实现INotifyPropertyChanged接口,表示ViewModel的属性发生了变化。它也是实现数据绑定的必要条件。 4. ViewModel:ViewModel是一个逻辑单元,掌握用户操作的输入和数据的输出。与传统的MVCController不同,ViewModel表示数据模型,并在此基础上封装了业务逻辑。 这些关键技术共同构成了WPFMVVM模式的基础,很大程度上提升了应用程序的开发效率和可维护性,使得应用程序更易于扩展和重构,也使代码更加清晰明了。 ### 回答3: WPF(Windows Presentation Foundation)是微软的一种UI框架,它主要基于XAML(Extensible Application Markup Language)和.NET Framework开发,可以用于创建基于Windows的桌面应用程序。MVVM(Model-View-ViewModel)是一种软件设计模式,它可以有效地分离应用程序的视图(View)、用户交互行为(ViewModel)和数据(Model),从而提高代码的可维护性和可测试性。 在WPF,MVVM是一种常见的设计模式,它包括以下关键技术: 1. 数据绑定(Data Binding):WPF的数据绑定机制使得ViewModel可以直接与View进行交互,而无需编写大量的代码来处理用户界面和数据。 2. 命令(Commands):在MVVM,ViewModel可以通过命令来处理用户交互行为,这些命令可以直接在XAML绑定到控件上,从而使ViewModel能够响应用户的操作。 3. 依赖注入(Dependency Injection):依赖注入是一个常见的设计模式,它可以有效地解耦应用程序的组件,从而使代码更加灵活和可维护。在MVVM,依赖注入是一种常见的技术,它可以帮助我们实现ViewModel的测试和重用。 4. 组合(Composition):MVVM的组合模式是一种常见的设计模式,它可以帮助我们将多个小的ViewModel组合成一个大的ViewModel,从而提高代码的可读性和可维护性。 综上所述,WPFMVVM的关键技术包括数据绑定、命令、依赖注入和组合等。这些技术可以帮助我们实现灵活、可维护和可测试的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉特思米(gitusme)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值