我通过NuGet下载了一个样式库(Selen.Wpf)。 现在我想使用它的样式。坦率地说,这个小小的任务让我疯狂了。
第一种方法 - 使用MergedDictionarys:
理想情况下,我会按以下方式添加样式
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<BitmapImage x:Key="ImgHelp" UriSource="pack://application:,,,/Resources/Help_32x.png"/>
<!--Lots of our own stuff goes here too-->
</ResourceDictionary>
<ResourceDictionary Source="pack://application:,,,/Selen.Wpf.SystemStyles;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
不幸的是,这会在启动时抛出运行时激活(System.Windows.Markup.XamlParseException: "System.Windows.Media.Imaging.BitmapImage" IsFrozen must be set to false
)。这不是Selen.Wpf的错,但如果我将自己的资源声明从<Application.Resources>...</Application.Resources>
移到<ResourceDictionary.MergedDictionarys>...</ResourceDictionary.MergedDictionarys>
关于这个问题的关于SO的其他几个问题没有答案,可以采用合理的解决方法。我不知道如何调试这个,我继续......
第二种方法 - 使用解决方法:
如果我以正确的方式得到XamlParseExpcetion,那么我只想做黑客背后的丑陋代码。
我添加了以下功能:
private void LoadSelen()
{
ResourceDictionary selenDict = new ResourceDictionary()
{
Source = new Uri("pack://application:,,,/Selen.Wpf.SystemStyles;component/Styles.xaml")
};
App.Current.Resources.MergedDictionaries.Add(selenDict);
}
并在InitComponent和Run
之间调用它[STAThread]
public static void Main()
{
application.InitializeComponent();
application.LoadSelen();
application.Run();
}
但是这又导致了XamlParseExcpetion,但这次是在DataPanel.xaml中 - 嵌入到我的MainWindow中的面板:
System.Windows.Markup.XamlParseException
HResult=0x80131501
Message = Specifying a value for "System.Windows.Markup.StaticResourceHolder" lead to an excpetion.
Source = PresentationFramework
Stacktrace:
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
Inner Excpetion 1:
FileLoadException: The File or Assembly "System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" or a dependency of it was not found. The found manifestdefinition of the assembly does not match the assembly reference (Excpetion of HRESULT: 0x80131040)
抱歉造型不佳,不知道怎么做得更好。翻译!
DataPanel.xaml发生此Excpetion的地方:
<UserControl x:Class="GUI.DataPanel"
x:Name="UserControlPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<DockPanel LastChildFill="True" Background="Transparent">
<Border DockPanel.Dock="Top" BorderBrush="DarkGray" BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="{Binding ElementName=UserControlPanel, Path=HeaderText}" Grid.Column="0" VerticalAlignment="Center"/>
<ItemsControl ItemsSource="{Binding ElementName=UserControlPanel, Path=Items}" Grid.Column="1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" FlowDirection="RightToLeft"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Border>
<TabControl x:Name="TabControl" ItemContainerStyle="{DynamicResource CollapseSingleTabItem}"/>
</DockPanel>
</UserControl>
如何使用Selen.Wpf中的样式。在这一点上,我几乎不关心答案是多么丑陋。只要它Compiles&amp;开始(从未想过我会在C ++世界之外说这个)我很高兴。
答案 0 :(得分:3)
看起来System.Windows.Interactivity
的引用无法解决。
FileLoadException:文件或程序集“System.Windows.Interactivity,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”或找不到它的依赖项。找到的程序集清单定义与程序集引用不匹配(HRESULT的Excpetion:0x80131040)
看起来Selen.Wpf
nuget包需要这个依赖,但是没有在包描述中指定它。 (您可以看到添加了Selen.Wpf.DemoApplication.csproj中的引用)
要解决此问题,您可以自行添加对System.Windows.Interactivity
的引用(并使用您的第一个解决方案)。