• 《Programming WPF》翻译 第7章 4.转换


    支持高分辨率显示是WPF中的重要样式。这是被部分地支持——强调了可伸缩的向量图,而不是图像。但是,正如使用GDI+GDI32显示的,如果可伸缩性没有完全集成到图像化构架中,独立的分辨率实际上是非常难于达到连续性的。

    WPF对伸缩的支持是建立在一个基础的级别。任何用户界面中的元素都可以应用一个转换,使得伸缩和旋转任何事物都很容易。

    所有的用户界面元素都有一个transform类型的RenderTransform属性。这是一个抽象的基类。从这个基类中派生的类实现了各种仿射性的转换:旋转、缩放、变形以及修剪。所有的这些都是便利的类,所有支持的转换都可以被MartrixTransform表示。这包括了一个3X3矩阵,允许使用任何仿射性的转换。

    一个仿射性的转换是,样式排列在一条直线上的位置,在转换仍然在一条直线上之前,在转换之后。注意到,3-D视图转换没有保持这些直线。

    示例7-44显示了RenderTransform属性的使用。

    示例7-44

    <StackPanel Orientation="Horizontal">
        
    <TextBlock>
            
    <TextBlock.RenderTransform>
                
    <TransformGroup 
    >
                    
    <ScaleTransform ScaleX="2" ScaleY="2" />
                    
    <RotateTransform Angle="10" />
                
    </TransformGroup>
            
    </TextBlock.RenderTransform>
            Hello,
        
    </TextBlock>
        
    <TextBlock>world</TextBlock>
    </StackPanel>

    注意到TransformGroup在这里用来联合两种转换效果。(注意到这里旋转角度被详细指明了度数。)结果如图7-53所示。

    7-53


    在标记中,你不会正常的用完整的词写出转换,如示例
    7-44所示,因为你可以使用字符串简写的语法,如代码7-45所示。

    示例7-45

    <StackPanel Orientation="Horizontal">
        
    <TextBlock RenderTransform="scale 2,2 rotate 10">Hello,</TextBlock>
        
    <TextBlock>world</TextBlock>
    </StackPanel>

    RenderTransform属性允许你详细指定转换的序列,这将被转换为适合的Transform对象。

    RenderTransform改变元素的外观而在外观上没有任何效果。注意到图7-53中“Hello”这个TextBlock——在“world”这个块的下面——是如何运行的。这些元素都在一个水平的StackPanel中,因此你通常可以希望第二个元素完全的位于第一个元素的右边,而不是交叠在一起。然而,RenderTransform对于外观逻辑是有效可见的,因此StackPanel排列元素好像转换并不在适当的位置。

    实际上,你可以经常想通过外观系统将转换考虑在内。在这种情形中,你不应该使用RenderTransform属性。代替的,你应该使用LayoutTransform属性,正如示例7-46所示。

    示例7-46

    <StackPanel Orientation="Horizontal" Margin="10"
        <TextBlock LayoutTransform
    ="scale 2,2 rotate 10">Hello,</TextBlock>
        
    <TextBlock>world</TextBlock>
    </StackPanel>

    LayoutTransform属性在某种程度上应用了转换——这对于外观系统是可见的。正如图7-54所示,这意味着StackPanel现在为变形的文字分配了充分的空间,以及这两个元素不再是交叠的了。

    7-54


    你可以应用任何数量的转换在可视化树的任意地方。图
    7-55显示了一个用户界面——主要区域可以被旋转和轻微地放大,但是部分内容已经被减少和以相反的方向旋转。显然地,这个特殊的示例不是十分有用,但是它确实显示了变换可以被添加到任意的位置。进一步而言,外观继续正确的工作,主要的用户界面使用Grid来排列,以及被旋转的内部内容在一个嵌入的Grid中。如果主要的窗体重新调整了大小,这两个grid都会正确地重新排列它们的内容,不会被装换的出现而混乱。

    7-55


    这种对转换的彻底支持是重要的,不是以为它支持如图
    7-55古怪的外观,而是因为你可以依赖于转换进行一致性和可靠性的工作。

  • 相关阅读:
    input()和print()函数同时输入输出多个数据--python3
    2018-海信-算法工程师-面试问题
    2018-CVTE中央研究院-自然语言处理算法工程师-电话面问题
    windows服务demo
    C#获取刚插入的数据的id
    .net微软企业库的事务回滚
    C# NPOI的数据批量导入数据库
    C# 使用复选框实现循环添加多条信息入库!
    C# DataSet与DataTable的区别和用法
    C#如何编写短信接口,以及接口的调用,包括C#.net访问web,并处理返回值的简例。
  • 原文地址:https://www.cnblogs.com/Jax/p/1137024.html
Copyright © 2020-2023  润新知