【问题标题】:Can most things be done in code that can be done in XAML?大多数事情可以在 XAML 中完成的代码中完成吗?
【发布时间】:2012-08-05 07:38:02
【问题描述】:

例如,我想做一些与您在下面看到的类似的事情,但在代码后面。我看到大量使用 XAML 的示例,但在 C# 中没有做同样的事情。所以我的猜测是否定的。谢谢。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <TextBlock TextWrapping="Wrap" Width="455">
        <Span FontSize="20">2</Span>
        <Span BaselineAlignment="TextTop" FontSize="14">1/2</Span>

        <Span FontSize="20"> + </Span>

        <Span FontSize="20">3</Span>
        <Span BaselineAlignment="TextTop" FontSize="14">3/4</Span>

        <Span FontSize="20"> = </Span>

        <Span FontSize="20">6</Span>
        <Span BaselineAlignment="TextTop" FontSize="14">1/4</Span>
    </TextBlock>
</StackPanel>

【问题讨论】:

  • 为什么你不想这么简单?
  • 我是 WPF 新手,还不了解如何将上面的代码与变量一起使用。假设 6 1/4 部分是在 C# 端计算的。
  • AFAIK,在 XAML 中完成的任何事情都可以在 C# 代码中完成。它可能并不理想,甚至可能很难弄清楚如何,但它应该是可能的。至少,我还没有看到任何不可能的东西。 还没有。
  • @ChrisSinclair:确实,XAML 代码映射到 CLR 构造,因此您可以在 XAML 中执行的任何操作都可以在代码中执行。显然,这意味着相反的情况并非如此(代码中的所有内容,您不一定可以在 XAML 中执行)。
  • Petzolds book 'Applicstion = Code + Markup' 只在书的最后一节介绍了 Xaml。在此之前,一切都在代码中完成。

标签: c# wpf xaml


【解决方案1】:

是的,这个 XAML 输出也可以通过 C# 代码完成

伪代码

创建一个StackPanel 对象

创建一个TextBlock 对象。将其 TextWrapping 属性设置为 Wrap 并将 Width 设置为 455。

创建Span 的多个对象。根据需要设置 FontSize 和其他属性(文本、BaseAllighnemt)。

span 对象添加到Textblock.Inlines 属性

将文本块添加到堆栈面板

就是这样

【讨论】:

    【解决方案2】:

    实际上,几乎所有可以在 Xaml 中完成的事情也可以在 C# 中完成,因为 Xaml 在构建时会转换为 C#(查找 *.g.cs 文件)。大多数情况下,您可以只使用您在 Xaml 中指定的相同类,并添加一些 Xaml 自动为您处理的附加内容。在这种情况下,您可以这样做:

    var textblock = new TextBlock();
    textblock.Inlines.Add(new Run("2") {FontSize = 20});
    textblock.Inlines.Add(new Run("1/2") {FontSize = 14, BaselineAlignment = BaselineAlignment.TextTop});
    

    【讨论】:

    • 谢谢 ceykooo。我将研究使用绑定来做与上面相同的事情,因为它确实似乎是要走的路。但与此同时,您的回复确实回答了我的直接问题。
    • 太好了,一旦你习惯了绑定,它们肯定会更容易处理。一般原则是您应该始终避免代码隐藏,除非在 Xaml 中实现您想要的功能需要更多的工作。此外,在 Xaml 中执行操作允许更多的代码可重用性(即附加行为、转换器、样式),并且通常更难在声明性代码中出错。
    • “Xaml 在构建时转换为 C#”不是真的,这些生成的文件只是补充,例如为 XAML 中的元素提供命名字段。 XAML 本身只有在曾经转换为 BAML 时才会被转换。 “任何可以在 Xaml 中完成的事情也可以在 C# 中完成”也不正确,存在一些限制。
    • 感谢您消除我的误解。关于 C# 与 XAML 相比的局限性,您有什么资源可以指导我吗?
    【解决方案3】:

    解析 XAML 代码并创建与标记对应的对象,因此您始终可以通过直接创建对象来执行相同操作。

    因此,您只需创建 Span 对象并设置正确的属性,然后将它们作为子对象添加到 TextBlock 对象。

    【讨论】:

      【解决方案4】:

      相信我,对于您发布的 XAML,XAML 更具可读性和紧凑性。要在代码中执行此操作,您必须实例化WindowStackPanel,将StackPanel 添加到Window,为Window 提供其标题、高度和宽度属性等,等等。您已经查看了大约六行代码来做到这一点,当您开始实例化TextBlock 并设置Span 时,它变得更加丑陋。

      您完全可以在没有 XAML 的情况下使用 WPF,尽管我不确定您为什么会想要这样做。可以在here 中找到一个 WPF 程序示例。事实上,你的问题的反面是正确的。您可以在 XAML 中执行的所有操作,都可以在 C# 中执行,但并非您可以在 C# 中执行的所有操作,您都可以在 XAML 中执行。这是因为 XAML 映射直接执行通用运行时语言类、属性、事件等,但每个类和一段 XAML 代码之间并不存在映射。

      长话短说,XAML 比纯代码更易于维护和编辑,并且需要更简单的工具(XML 编辑器)才能使用,因此比使用纯代码更可取。

      【讨论】:

      • 您的描述确实使它听起来更容易,但是作为 WPF 的新手,我还不明白如何将上面的代码与变量一起使用。假设 6 1/4 部分,如果该值是在 C# 端计算的。
      • @JimDel:我开始使用 Java 的 Swing 编写 UI,所以它们通常看起来很像您正在尝试创建的内容,但相信我,维护基于 XAML 和 XML 的 UI 要容易得多.学习过 XAML 后,我建议看一下“WPF Unleashed”一书,因为一旦我得到了它,我就真的不需要其他资源了。代码和 XAML 之间的链接是通过绑定完成的,而且也很容易找到这方面的教程。
      • 谢谢 Jakub,我去看看那本书。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2011-01-04
      • 2015-11-13
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多