c# - 在 Windows 应用商店应用程序中更改 XML 的文本样式

标签 c# xml windows-store-apps

我正在创建一个应用程序,其中包含一个目录。 我创建了一个 XML 文件来从中提取数据。 在我的 XML 中,我想更改某些文本的样式,但是我无法从 XML 代码中进行更改。我试着把标签 <b> , <bold> , <strong>但他们没有工作

请在下面找到 XML 代码:

<book>
    <item type="Module">
      <title>My family and I</title>
    </item>
    <item type="Unit">
      <title>World Friends</title>
    </item>
    <item type="Unit">
      <title>Sport and activities</title>
    </item>
    <item type="Module">
      <title>
        <b>School days</b></title>
    </item>
    <item type="Unit">
      <title>My routine</title>
    </item>
    <item type="Unit">
      <title>School life</title>
    </item>
</book>

这是我的 XML。如您所见,我有两种类型:ModuleUnit .我想在类型模块中将文本加粗并在单元类型中缩进文本。

我还创建了一个类来调用标题。 我将向您展示以下代码:

这是我的类(class)

public class ContentTable
{
    string itemTitle;
    public string ItemTitle
    {
        get { return itemTitle; }
        set { itemTitle = value; }
    }
}

这是检索数据的代码。

string XMLPath = Path.Combine(
   Package.Current.InstalledLocation.Path, "Assets/tableOfContent.xml");
XDocument loadedData = XDocument.Load(XMLPath);

//retrieving data from xml using LINQ     
var data = from query in loadedData.Descendants("item")
    select new ContentTable
    {
        ItemTitle = (string)query.Element("title")
    };

//assigning source to GridView Control     
AllItemsView.ItemsSource = data;

这是我的 XAML

<ListBox x:Name="AllItemsView" Width="200" Margin="45,20,5,-604" Height="665" VerticalAlignment="Top" Foreground="Black" Background="White" Grid.RowSpan="2" SelectionChanged="AllItemsView_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Margin="10" >
                <TextBlock Text="{Binding ItemTitle}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

最佳答案

如果您编写 WPF 程序,解决此问题的一个简单方法是声明一个 Style对于 TextBlock你在其中使用 DataTrigger将特定格式应用于 TextBlock 的实例基于数据的属性。不幸的是,WinRT 中没有此功能(与许多其他非常有用的功能一样)。据我了解,常见的替代方法是实现 IValueConverter ,将一些输入值映射到适合您的格式的属性值。它不像触发器那样广泛有用,但对于简单的场景,它的作用大致相同。

请注意,无论您最终做什么,格式更改所依据的标准都必须从原始数据流向呈现的输出。有多种方法可以实现此目的,但以您的示例为例,在我看来最简单的方法就是向您的 ContentTable 添加一个属性。类:

public class ContentTable
{
    public string ItemTitle { get; set; }
    public string ItemType { get; set; }
}

到你原来的ItemTitle属性,我添加了 ItemType这将采取 type来自 XML 的属性值。

当然,添加了这个属性后,它需要和ItemTitle一起填充。 :

var data = from query in loadedData.Descendants("item")
           select new ContentTable
           {
               ItemTitle = query.Element("title").Value,
               ItemType = query.Attribute("type").Value
           };

在我们可以将这个新属性绑定(bind)到相关的 TextBlock 之前属性(例如 FontWeightMargin ),我们需要转换器来映射特定的 string type 中的值属性为 TextBlock 的适当属性值:

class ItemTypeToBoldConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        string text = value as string;

        if (text != null)
        {
            return text == "Module" ?
                Windows.UI.Text.FontWeights.Bold :
                Windows.UI.Text.FontWeights.Normal;
        }

        return Windows.UI.Xaml.DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

class ItemTypeToMarginConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        string text = value as string;

        if (text != null)
        {
            return text == "Unit" ?
                new Windows.UI.Xaml.Thickness(20, 0, 0, 0) :
                new Windows.UI.Xaml.Thickness();
        }

        return Windows.UI.Xaml.DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

在奠定了所有必要的基础后,剩下的就很容易了。 :)

您的转换器可以声明为资源(例如,它们可以被多个元素或什至不同的 DataTemplate 实例重复使用):

<Page.Resources>
  <local:ItemTypeToBoldConverter x:Key="itemTypeToBoldConverter1"/>
  <local:ItemTypeToMarginConverter x:Key="itemTypeToMarginConverter1"/>
</Page.Resources>

最后,您可以在模板本身中引用转换器:

<DataTemplate>
  <StackPanel Margin="10" >
    <TextBlock Text="{Binding ItemTitle}"
                FontWeight="{Binding ItemType, Converter={StaticResource itemTypeToBoldConverter1}}"
                Margin="{Binding ItemType, Converter={StaticResource itemTypeToMarginConverter1}}"/>
  </StackPanel>
</DataTemplate>

上面绑定(bind)了两个不同的属性,FontWeightMargin , 到相同的数据项属性,ItemType .但由于它们使用不同的转换器,因此它们各自的行为都适当。当 ItemType值为 Module ,字体粗细设置为粗体;否则,它被设置为正常重量。同样,当 ItemType值为 Unit ,左边距设置为非零值(在本例中,我选择了 20 );否则,将其设置为 0 厚度。


请注意,以上内容将您的 XML 数据直接转换为 XAML UI 元素属性值。在您的问题中,您提到了 HTML 标记,例如 <b> , <bold> , 和 <strong> .以上是最简单的方法,与您提供的确切代码示例和格式设置条件最匹配。但是您不能使用它来应用 HTML 格式。您受困于 XAML 中可用的格式设置和布局。现在,这实际上是一个非常丰富的格式化环境,但如果您想要一种基于 HTML 的方法,您可以改为这样做。

那里也有很多选择,但恕我直言,最好的方法是编写一个 XSL 样式表,使用 XsltTransform 将 XML 转换为适当的 HTML 文档。要转换的类(假设它在 WinRT 上可用……我没有检查)。然后你可以使用 WebView控件(或在 WPF 中,WebBrowser)显示 HTML。

关于c# - 在 Windows 应用商店应用程序中更改 XML 的文本样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29750011/

相关文章:

c# - 在 C# 中替换正则表达式字符串

c# - PdfSharpCore 图像渲染问题

c# - 如何按多个值对 XML 数据进行分组

java - XML 架构站点不存在..(解码 xml 时)

c# - Metro Apps : C#, 从互联网读取文本文件

windows-store-apps - 在 Win Store 应用程序中设置转换时,集合属性 '__implicit_items' 为空

c# - 在 C# 中读取 Excel 2007 文件 (.xlsx)

c# - 如何使用 SQL Server 数据库中的值填充列表?

Python 解析 XML

c# - 使用任务构造函数时无法使用结果启动任务