5

短いバージョン 他のウィンドウ/ユーザー/カスタム コントロールに埋め込まれた UserControls の静的リソース ルックアップをどのように処理しますか? Blend 4 が設計時に適切にレンダリングできるように、Visual Studio が既に行っていることを行います。

長いバージョン 質問が示唆するように、いくつかの埋め込みユーザー コントロールを持つウィンドウがあり、それぞれのウィンドウと埋め込みユーザー コントロールはすべて静的リソース マークアップ拡張機能を使用して、app.xaml ファイルのマージされたディクショナリにあるリソースへの参照を解決します。 .

Blend は、個別に開いたときに、VS Designer Surface で作成したサンプル ユーザー コントロールの読み込みとレンダリングに問題はありません。私がほぼどこでも使用している無数の静的リソース マークアップ拡張機能を問題なく解決できます。

'MainWindow.xml' (ウィンドウ コントロール) を開こうとするたびに、Blend 4 で4 - Cannot Create Instance Of Typeエラーが発生していることに気付きました。VS デバッガー インスタンスを Blend にアタッチしてこれらの例外をさらに掘り下げると、私が参照したすべての静的リソースが、それを見つけることができないと不平を言っていることに気付きました。

比較として、私が作成したカスタム コントロールを見てみると、静的リソースはまったく使用されておらず、代わりにローカル リソースでした。このカスタム コントロールを UserControl に埋め込むと、かなりうまく機能することに気付きました。その理由は明らかだと思います!

SOの誰かが、この問題を回避する方法を知っていますか? 「デザインタイム ディクショナリの追加」全体を試してみました <- これは部分的に機能しますが、埋め込まれたユーザー コントロールはまだまったく作成されません。

リサーチ

  1. MVVM Light + Blend デザイナー ビュー エラー: 'Locator' という名前のリソースが見つかりません
  2. ブレンド嘔吐なしのリソースを使用したテーマ設定

更新: 考えられる解決策:

  1. ここに示されている同様のアプローチを採用してください: GianlucaCucco Answer
  2. すべての静的リソース ルックアップを UserControls のローカル リソースに変換しますか?
  3. 代わりに、すべての静的リソース ルックアップを動的リソースに変換します。

これらのソリューションはどちらもきれいではありません。= (

4

3 に答える 3

1

Converters.xamlBlend が不満を言っていたファイルにいくつかのリソースがあります。私の回避策は、設計時にその xaml ファイルを強制的に読み込むことです。

using System;
using System.ComponentModel;
using System.IO;
using System.Windows;
using System.Windows.Markup;

public static class DesignTimeSupport
{
    public static void LoadCommonConvertersForBlend(this ResourceDictionary resourceDictionary)
    {
        if (resourceDictionary == null || !DesignerProperties.IsInDesignTool) return;

        var convertersXamlUri = new Uri("Assets/Converters.xaml", UriKind.Relative);
        var streamInfo = Application.GetResourceStream(convertersXamlUri);
        using (var reader = new StreamReader(streamInfo.Stream))
        {
            var converters = (ResourceDictionary)XamlReader.Load(reader.ReadToEnd());
            resourceDictionary.MergedDictionaries.Add(converters);
        }
    }
}

ViewBaseは、コンストラクターでこのメソッドを呼び出します。

public class ViewBase : Page
{
    public ViewBase()
    {
        Resources.LoadCommonConvertersForBlend();
    }
}

から継承しないクラスはViewBase、独自の呼び出しを行います。

于 2012-06-07T15:54:59.170 に答える
1

この答えを試してみてください-同様の問題のように聞こえます。まだ使用する機会がないので、あなたに合うかどうか知りたいです. 確かに、他のソリューションよりも面倒ではありません。

于 2012-06-07T15:43:38.387 に答える
0

奇妙に思えるかもしれませんが (論理的な理由がわかりません)、エラー メッセージには、見つからなかったリソースが "maindictionary.xaml" として示されていましたが、ファイルとすべての参照は "MainDictionary.xaml" でした。

ソリューション エクスプローラーでリソースのプロパティを開き、FileName を manidictionary.xaml に変更してから、MainDictionary.xaml に戻すと、表示されていた 5 つのエラー メッセージが表示されなくなりました。

この答えが、難解な問題に苦しんでいる可能性のある他の誰かの手に渡って、役立つことを願っています.

于 2015-04-19T02:52:00.243 に答える