WPF:Visual Studio 2008 Designerの修正文書
-
22-09-2019 - |
質問
これは よく知られているバグ そのビジュアルスタジオは、あなたが構築しようとするときにエラーを示します FixedDocument
xamlで。たとえば、次のスニペット
<DocumentViewer>
<FixedDocument>
<PageContent>
<FixedPage Width="21.0cm" Height="29.7cm">
<TextBlock>Hello World!</TextBlock>
</FixedPage>
</PageContent>
</FixedDocument>
</DocumentViewer>
コンパイルされて完全に正常に実行されますが、Visual Studioはエラーリストにエラーを示しています(Property 'Pages' does not support values of type 'PageContent'.
)これは非常に迷惑です。
そのエラーメッセージを取得せずに、Visual StudioのXAMLファイルでドキュメントを作成できるソリューションを探しています。回答として以下で共有したい回避策を見つけましたが、より良い(よりエレガントな)ソリューションがあるかどうかは興味があります。
解決
私はこれがすでに答えられていたことを知っていますが、この答えはドキュメントビューを追加する必要がないため、より良いと思います。
キー名でリソースを参照し、XAMLを使用して固定文書に入れる方法がある場合は、お知らせください。私はそれをする方法を見つけることができないようですが、おそらくそれが可能です。
使用する:
var doc = System.Windows.Application.LoadComponent(new Uri("/FixedDocumentExample.xaml", UriKind.Relative)) as FixedDocument;
doc.AddPages();
拡張方法:
using System.Collections;
using System.Windows.Documents;
public static class FixedDocumentExtended {
public static void AddPages(this FixedDocument fixedDocument) {
var enumerator = fixedDocument.Resources.GetEnumerator();
while (enumerator.MoveNext()) {
var pageContent = ((DictionaryEntry)enumerator.Current).Value as PageContent;
if (pageContent != null) {
fixedDocument.Pages.Add(pageContent);
}
}
}
}
xaml:
<FixedDocument
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FixedDocument.Resources>
<PageContent x:Key="page1">
<FixedPage Width="793.76" Height="1122.56">
<TextBlock Margin="50" Text="Page 1"/>
</FixedPage>
</PageContent>
<PageContent x:Key="page2">
<FixedPage Width="793.76" Height="1122.56">
<TextBlock Margin="50" Text="Page 2"/>
</FixedPage>
</PageContent>
</FixedDocument.Resources>
</FixedDocument>
他のヒント
回避策として、DocumentViewerとページをグリッドに入れました。
<Grid>
<FixedPage Width="21.0cm" Height="29.7cm" x:Name="uiPage1">
<TextBlock>Hello World!</TextBlock>
</FixedPage>
<DocumentViewer>
<FixedDocument x:Name="uiReport">
</FixedDocument>
</DocumentViewer>
</Grid>
次に、ページをdocumentViewerに添付します Loaded
窓のイベント:
VB例:
DirectCast(Me.uiPage1.Parent, Grid).Children.Remove(Me.uiPage1)
Dim content As New PageContent()
DirectCast(content, IAddChild).AddChild(Me.uiPage1)
Me.uiReport.Pages.Add(content)
C#例:
((Grid)uiPage1.Parent).Children.Remove(uiPage1);
var content = new PageContent();
((IAddChild)content).AddChild(uiPage1);
uiReport.Pages.Add(content);
よりクリーンな回避策:
[ContentProperty("Pages")]
public class XamlFixedDocument : FixedDocument
{
private ObservableCollection<PageContent> _pages;
public XamlFixedDocument()
{
this.Pages = new ObservableCollection<PageContent>();
}
public new ObservableCollection<PageContent> Pages
{
get => _pages;
set
{
_pages = value;
foreach (var page in _pages)
{
base.Pages.Add(page);
}
_pages.CollectionChanged += (o, e) =>
{
if (e.NewItems != null)
{
foreach (PageContent page in e.NewItems)
{
base.Pages.Add(page);
}
}
};
}
}
}
のこのサブクラス FixedDocument
偽物a Pages
プロパティと追加されたすべてのページをリアルにリダイレクトします Pages
基本クラスのプロパティ。
使用法:
<doc:XamlFixedDocument xmlns:doc="clr-namespace:Hillinworks.WPF.Document">
<PageContent>
<FixedPage Background="White">
<TextBlock Text="hello, world" />
</FixedPage>
</PageContent>
</doc:XamlFixedDocument>
変化する Hillinworks.WPF.Document
どこに名前空間に XamlFixedDocument
クラスがあります。
これにより、ドキュメントの設計時間プレビューも可能になります。