如何将userControl的ResourceDictionary合并到app.xaml中?

时间:2017-03-07 13:12:44

标签: wpf xaml user-controls

我创建了UserControl并编写了ResourcesDictionary。有一些样式。

我想将ResourceDictionary合并到App.xaml中。

但主要项目是A,并且有App.xaml。

UserControl在B项目中,所以他们住在另一个地方。

如何合并ResourceDictonary?

这是我的代码的一部分,但它不起作用。

首先尝试使用App.xaml

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="myUserControl.xaml"/>
        </ResourceDictionary.MergedDictionaries> ......

第二次尝试

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/B;component/SubFolderName/myUserControl.xaml" />
        </ResourceDictionary.MergedDictionaries> ......

第三次尝试

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/B;component/SubFolderName/myUserControl.xaml" />
        </ResourceDictionary.MergedDictionaries> ......

他们都没有工作.....

+ myUserControl.xaml

<UserControl x:Class="........."
         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" 
         xmlns:local="clr-namespace:B"
         DataContext="{Binding RelativeSource={RelativeSource Self}}"
         mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="100">
<UserControl.Resources>
    <ResourceDictionary>

        <Style x:Key="TitleTest" TargetType="TextBlock" BasedOn="{StaticResource MetroTextBlock}">
            <Setter Property="Margin" Value="15"/>
            <Setter Property="VerticalAlignment" Value="Top"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="FontSize" Value="20"/>
        </Style>

        <Style x:Key="PanelTestStyle" TargetType="StackPanel">
            <Setter Property="ClipToBounds" Value="True"/>
            <Setter Property="Height" Value="55"/>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Margin" Value="15"/>
        </Style>
        <Style x:Key="TestStyle2" TargetType="TextBlock" BasedOn="{StaticResource MetroTextBlock}">
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="HorizontalAlignment" Value="Right"/>
            <Setter Property="FontSize" Value="40"/>
        </Style>           
    </ResourceDictionary>
</UserControl.Resources>

<Grid>
    <TextBlock Text="{Binding StatusTitle}" Style="{DynamicResource TitleTest}"/>
    <StackPanel Style="{StaticResource PanelTestStyle}">
        <TextBlock x:Name="testText" Style="{DynamicResource TestStyle2}" Text="{Binding StatusNumber}"/>
        <TextBlock x:Name="testText2" Style="{DynamicResource TestStyle2}" Text="TEST" />
    </StackPanel>
</Grid>

另外,我想让Setter Value在cs代码中更改FontSize,所以我需要设置DynamicResource(TextBlocks)。

2 个答案:

答案 0 :(得分:0)

您必须参考项目&#39; B&#39;在您的项目&#39; A&#39;,然后您的示例&#39; Second Try&#39;应该工作

答案 1 :(得分:0)

您必须将ResourceDictionary放在一个单独的xaml文件中;不在App.xaml中。此文件必须如下所示:

 <ResourceDictionary>
     <Style x:Key="TitleTest" TargetType="TextBlock" BasedOn="{StaticResource MetroTextBlock}">
         <Setter Property="Margin" Value="15"/>
         <Setter Property="VerticalAlignment" Value="Top"/>
         <Setter Property="HorizontalAlignment" Value="Left"/>
         <Setter Property="FontSize" Value="20"/>
     </Style>
...

如果要在同一个dll中使用此ResourceDictionary,可以使用第一次尝试的代码访问它。如果你想在另一个dll中使用它,你可以使用第二次尝试的代码访问它。