将合并的XAML ResourceDictionaries移动到Generic.xaml会导致错误

时间:2017-06-01 22:24:30

标签: wpf xaml

我创建了两个自定义控件,都继承自System.Windows.Controls.Button。一个叫XLButton,另一个叫XLBox。它们在两个单独的.xaml文件中的两个单独的ResourceDictionary对象中具有相同的XAML样式/模板,以及相同的代码隐藏文件,除了" XLButton"出现在XLButton文件中" XLBox"显示在XLBox文件中,反之亦然

我创建了一个带有两行Grid的简单测试窗口。我将ResourceDictionary文件合并到该测试窗口的Window.Resources中,并创建每个自定义控件的实例,一个在顶行,一个在底部。这很好用。这是测试窗口的XAML:

<Window x:Class="ScratchPadWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ExLuminaControls"
        mc:Ignorable="d"
        Title="ScratchPadWindow" Height="118" Width="145">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Styles/XLBox.xaml" />
                <ResourceDictionary Source="/Styles/XLButton.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <local:XLBox Content="Hi!"/>
        <local:XLButton Grid.Row="1" Content="Yeah!"/>
    </Grid>
</Window>

这很好用。但是,当我注释掉ResourceDictionary.MergedDictionaries部分并将其原始格式复制到Themes\Generic.xaml时,它看起来像这样:

<ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ExLuminaControls"
        mc:Ignorable="d">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Styles/XLButton.xaml" />
        <ResourceDictionary Source="/Styles/XLBox.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

我得到了一个&#34;无法找到资源&style; xlbutton.xaml&#39;错误,与此行相关联:

<local:XLBox Content="Hi!"/>

这对我没有意义,但更令人困惑的是,如果我点击&#34;禁用项目代码&#34; 问题就会消失。在设计师

我正在使用Blend 2017社区。

任何人都可以帮我理解这个吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

它的路径问题,在通用时,像这样使用它

<ResourceDictionary Source="/AssemblyName;Component/Styles/XLButton.xaml" />

或者必须跟上“../../"

  1. 主题和通用小写
  2. 装配信息
  3. app.xaml,如果没有效果

    [assembly:ThemeInfo( ResourceDictionaryLocation.None,//主题特定资源字典所在的位置 //(如果在页面中找不到资源,则使用, //或应用程序资源字典) ResourceDictionaryLocation.SourceAssembly //通用资源字典所在的位置 //(如果在页面中找不到资源,则使用, // app或任何主题特定的资源词典) )]

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
    
            <ResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Generic.xaml" />
            ...
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    

  4. 定义和风格

    #region --------------------CONSTRUCTORS--------------------
    
        static WaitSpin()
        {
            FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(WaitSpin),
                new FrameworkPropertyMetadata(typeof(WaitSpin)));
        }
    
        /// <summary>
        /// LoadingAnimation constructor.
        /// </summary>
        public WaitSpin()
        {
            this.DefaultStyleKey = typeof(WaitSpin);
        }
    
        #endregion
    
    
    <Style x:Key="{x:Type local:WaitSpin}" TargetType="{x:Type local:WaitSpin}">