我正在开发一个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的不同方法,但没有得到任何效果。任何帮助都是非常有用的。
感谢
Josh
在尝试了一天来扩展自定义控件的样式后,我终于能够让它工作了。您可以通过定义命名空间来使用控件,但如果您想扩展控件的样式,则需要为控件包含ResourceDictionary。我最后添加了:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/My.Project;component/Resources/CControl.xaml" />
</ResourceDictionary.MergedDictionaries>
到我的WPF应用程序画布/Xaml中的ResourceDictionary。