次のような翻訳マークアップ拡張機能があります。
TextBlock Text="{l:Translate 'My string'}"
そして、すべてのプロジェクト xaml 内のテキスト タグを自動的に置き換える必要があります (xaml の翻訳に他のツールを使用できるため)。
このケースを実装するために、正規表現またはxmlリーダー/書き込みを使用してすべてのノードまたは属性を見つける方法はありますか?
次のような翻訳マークアップ拡張機能があります。
TextBlock Text="{l:Translate 'My string'}"
そして、すべてのプロジェクト xaml 内のテキスト タグを自動的に置き換える必要があります (xaml の翻訳に他のツールを使用できるため)。
このケースを実装するために、正規表現またはxmlリーダー/書き込みを使用してすべてのノードまたは属性を見つける方法はありますか?
基本的にXAML
、標準を満たしていXML
ますが、それを使用するには、外部ライブラリが必要です。例: Microsoft XAML Toolkit CTP
(ダウンロード)。アイテムのリストを表示する簡単な例:
// Previously adding the library
using Microsoft.Xaml.Tools.XamlDom;
XamlDomObject rootObject = XamlDomServices.Load("MainWindow.xaml");
foreach (XamlDomObject domObject in rootObject.DescendantsAndSelf())
{
MessageBox.Show(domObject.Type.ToString());
}
Background
ドキュメント内のすべてに設定しControl
ます。
XamlDomObject rootObject = XamlDomServices.Load("MainWindow.xaml");
foreach (XamlDomObject objectNode in
from control in rootObject.DescendantsAndSelf(typeof(Control))
where !control.HasMember("Background")
select control)
{
objectNode.SetMemberValue("Background", "Red");
}
XamlDomServices.Save(rootObject, "NewFile.xaml");
Text
プロパティの値を置き換えるには、例を使用します。
private void Window_ContentRendered(object sender, EventArgs e)
{
XamlDomObject rootObject = XamlDomServices.Load("MainWindow.xaml");
foreach (XamlDomObject objectNode in
from control in rootObject.DescendantsAndSelf(typeof(TextBlock))
where control.HasMember("Text")
select control)
{
objectNode.SetMemberValue("Text", "MyInsertedText");
}
XamlDomServices.Save(rootObject, "NewFile.xaml");
}
ファイルInput
:
<Window x:Class="XAMLdom.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" ContentRendered="Window_ContentRendered">
<Grid>
<TextBlock Text="SomeText" Width="100" Height="30" />
</Grid>
</Window>
ファイルOutput
:
<?xml version="1.0" encoding="utf-8"?>
<Window xml:base="file:///C:/Documents and Settings/Kanc/мои документы/visual studio 2010/Projects/XAMLdom/XAMLdom/bin/Debug/MainWindow.xaml" x:Class="XAMLdom.MainWindow" Title="MainWindow" Height="350" Width="525" ContentRendered="Window_ContentRendered" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<TextBlock Text="MyInsertedText" Width="100" Height="30" />
</Grid>
</Window>
正規表現を使用しましたが、これは最善の方法ではありませんが、そのままにしておくことができます。