アプリケーションは正常に動作しますが、デザイナー ビューで自分のデザインを確認できませんでした。
「ロケーター」という名前のリソースが見つかりませんと表示されます。明らかに、コードは何も変更していません。データ バインディング ダイアログを使用してデータ バインディングを行っただけです...
誰かが同じ問題に直面していますか?
アプリケーションは正常に動作しますが、デザイナー ビューで自分のデザインを確認できませんでした。
「ロケーター」という名前のリソースが見つかりませんと表示されます。明らかに、コードは何も変更していません。データ バインディング ダイアログを使用してデータ バインディングを行っただけです...
誰かが同じ問題に直面していますか?
これが発生する可能性がある既知の事象が 2 つあります。
アプリケーションをビルドする前に Blend に変更すると、DLL はまだ利用できず、このエラーが表示されることがあります。アプリケーションをビルドすると、問題が解決します。
Expression Blend にはバグがあり、ユーザー コントロールを別のユーザー コントロール (または WPF のウィンドウ) に配置し、内部のユーザー コントロールがグローバル リソースを使用している場合、グローバル リソースが見つかりません。その場合、エラーも発生します。
残念ながら、これは Blend のバグであるため、2 番目の点に対する回避策はありません。すぐに解決されることを願っていますが、Blend 4 にはまだ残っているようです。
あなたができることは
外側のユーザー コントロールで作業するときは、エラーを無視します。内部ユーザー コントロールを操作すると、デザイン時のデータが正常に表示されるはずです (あまり満足のいくものではありません)。
d:DataContext を使用して、一時的に Blend で設計時のデータ コンテキストを設定します。
うまくいけば、これが役に立ちます。
ローラン
Blend 4 では修正されていないように見えるため、この問題に対して合理的に受け入れられる回避策を考え出しました。
Blend 内でデザイン モードになっている場合は、XAML UserControl のコンストラクターで、必要なリソースを追加するだけです。これはロケーターだけでも、必要に応じてスタイルとコンバーターでもかまいません。
public partial class OrdersControl : UserControl
{
public OrdersControl()
{
// MUST do this BEFORE InitializeComponent()
if (DesignerProperties.GetIsInDesignMode(this))
{
if (AppDomain.CurrentDomain.BaseDirectory.Contains("Blend 4"))
{
// load styles resources
ResourceDictionary rd = new ResourceDictionary();
rd.Source = new Uri(System.IO.Path.Combine(Environment.CurrentDirectory, "Resources/Styles.xaml"), UriKind.Absolute);
Resources.MergedDictionaries.Add(rd);
// load any other resources this control needs such as Converters
Resources.Add("booleanNOTConverter", new BooleanNOTConverter());
}
}
// initialize component
this.InitializeComponent();
}
いくつかの特殊なケースがあるかもしれませんが、大きな赤いエラー シンボルが表示される前の単純なケースでは問題なく動作します。この問題をより適切に解決する方法についての提案を見たいと思っていますが、これにより、少なくとも、そうでなければエラーとして表示されるユーザー コントロールをアニメーション化することができます。
リソースの作成を次のように抽出することもできますApp.xaml.cs
。
internal static void CreateStaticResourcesForDesigner(Control element)
{
if (AppDomain.CurrentDomain.BaseDirectory.Contains("Blend 4"))
{
// load styles resources
ResourceDictionary rd = new ResourceDictionary();
rd.Source = new Uri(System.IO.Path.Combine(Environment.CurrentDirectory, "Resources/Styles.xaml"), UriKind.Absolute);
element.Resources.MergedDictionaries.Add(rd);
// load any other resources this control needs
element.Resources.Add("booleanNOTConverter", new BooleanNOTConverter());
}
}
次に、コントロールで InitializeComponent() の前にこれを行います。
// create local resources
if (DesignerProperties.GetIsInDesignMode(this))
{
App.CreateStaticResourcesForDesigner(this);
}
注: ある時点でこれが機能しなくなり、Styles.xaml へのパスをハードコードすることになりました。これは、自分がどのディレクトリにいるかを把握しようとしてイライラしたためです。
rd.Source = new Uri(@"R:\TFS-PROJECTS\ProjectWPF\Resources\Styles.xaml", UriKind.Absolute);
5分間の作業で正しい道を見つけることができると確信していますが、私のように頭がおかしい場合は、これを試してください!
MyUserControl.xaml では、次の代わりに:
DataContext="{Binding Main, Source={StaticResource Locator}
使用する:
d:DataContext="{Binding Main, Source={StaticResource Locator}
ここで、「d」は以前に次のように定義されていました。
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
ここで説明されている理由と回避策 http://blogs.msdn.com/b/unnir/archive/2009/03/31/blend-wpf-and-resource-references.aspx
投稿の (b) 部分を見てください。
これを App.xaml.cs の最初に追加するだけです
ここに私のコードがあります
[STATThread()]
static void main(){
App.Current.Resources.Add("Locator", new yournamespace.ViewModel.ViewModelLocator());
}
public App(){
main();
}
ユーザー制御リソースでも同様の問題がありました。
これをユーザーコントロールの xaml コードに追加しました。
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/GinaControls;component/Resources/GinaControlsColors.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
GinaControls
はコントロール クラスが宣言されている名前空間であり、プロジェクト フォルダーとxaml/Resources/GinaControlsColors.xaml
リソース ファイル名です。
お役に立てれば。
Blend が、ビューを含む単一のプロジェクトだけでなく、ソリューション全体を開いていることを確認してください。Visual Studio で右クリックし、[Expression Blend で開く] を選択していました。驚いたことに、Blend はソリューション ファイルを見つけることができなかったため、1 つのプロジェクトしか開いていませんでした。
これに気付いたとき、Blend を直接起動し、ソリューション ファイルを指定すると、Blend はビューで ViewModelLocator を見つけることができました。