将样式库加载到WPF中

时间:2017-06-10 21:37:48

标签: c# wpf xaml

长问题:

我通过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 ++世界之外说这个)我很高兴。

1 个答案:

答案 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的引用(并使用您的第一个解决方案)。