1

私は WPF アプリケーションを開発しており、カスタム コントロールを作成しました。これを「CControl」と呼びます。アプリケーションのレイアウトを設計している xaml ドキュメント。私はスタイルをインポートします:

xmlns:my="clr-namespace:My.Controls"

そして、コントロールをうまく使うことができます。問題は、CControl でスタイルを拡張したいということです。リソース ディクショナリでは、次のように設定できます。

        <Style TargetType="{x:Type my:CControl}">
            <Setter Property="Margin" Value="5 0 5 3" />
        </Style>

これにより、コントロールにスタイルが適用されますが、CControl で定義されたスタイルはインポートされないため、次を使用します。

        <Style TargetType="{x:Type my:CControl}" BasedOn="{StaticResource {x:Type my:CControl}}">
            <Setter Property="Margin" Value="5 0 5 3" />
        </Style>

問題は、フレームワークが xaml をロードしようとすると、次の例外が発生することです。

System.Windows.Markup.XamlParseException occurred
  Message='Provide value on 'System.Windows.StaticResourceExtension' threw an exception.' Line number '18' and line position '54'.
Source=PresentationFramework
LineNumber=18
LinePosition=54
StackTrace:
   at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, Boolean skipJournaledProperties, Uri baseUri)
   at System.Windows.Markup.XamlReader.Load(XamlReader xamlReader, ParserContext parserContext)
   at System.Windows.Markup.XamlReader.Load(XamlReader reader)
   at FATPOT.Whiteboard.Report.Show() in C:\...\Report.cs
InnerException: 
   Message=Cannot find resource named 'My.Controls.CControl'. Resource names are case sensitive.
   Source=PresentationFramework
   StackTrace:
        at System.Windows.StaticResourceExtension.ProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference)
        at System.Windows.StaticResourceExtension.ProvideValue(IServiceProvider serviceProvider)
        at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
   InnerException: 

BasedOn を使用するさまざまな方法を試しましたが、何も機能しませんでした。どんな助けでも非常に役に立ちます。

ありがとう

ジョシュ

4

1 に答える 1

5

カスタム コントロールのスタイルを拡張するために 1 日を費やした後、ようやく機能するようになりました。名前空間を定義することでコントロールを使用できますが、コントロールのスタイルを拡張する場合は、コントロールの ResourceDictionary を含める必要があります。私は最終的に追加しました:

        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/My.Project;component/Resources/CControl.xaml" />
        </ResourceDictionary.MergedDictionaries>

WPF Applications Canvas / Xaml の ResourceDictionary に。

于 2012-07-20T20:52:48.020 に答える