无法使用单独的文件解析资源

时间:2015-05-09 00:27:41

标签: c# wpf xaml

我觉得这是一种常识而且微不足道,但我不明白我从一开始就在做什么。我也没有任何其他资源可以帮助我。有时我想知道我是否正确地搜索了这个问题。

我有一些自定义样式&我已经制作了模板,但现在文件相当大,难以使用。我想将每个样式或模板放在自己的XAML文件中(类似于标题/实现文件),以便朋友可以处理一个,然后我们将它添加到项目中。 (例如Dictionary1.xaml ...)。我开始了一个空白的项目来保持简单。

Dictionary1.XAML

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<ResourceDictionary x:Key="SomeKey">
    <Color x:Key="detailMark">Black</Color>
    <SolidColorBrush x:Key="detailMarkBrush" Color="{StaticResource ResourceKey=detailMark}" />
    <Style x:Key="flatTextBox" TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Rectangle  Stroke="{StaticResource ResourceKey=detailMarkBrush}" StrokeThickness="1"/>
                        <TextBox Margin="1" Text="{TemplateBinding Text}" BorderThickness="0"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

的App.xaml

<Application x:Class="WpfApplication1.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:WpfApplication1"
         StartupUri="MainWindow.xaml">
    <Application.Resources>
        <local:MainWindow x:Key="SomeKey"/>
    </Application.Resources>

</Application>

和MainWindow.XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" 
        Height="350" Width="525">


    <Grid>
        <TextBox Style="{DynamicResource flatTextBox}"> <!-- doesn't autocomplete/work -->

        </TextBox>

    </Grid>
</Window>

修改

<TextBox Style="{Binding Mode=OneWay, Source={StaticResource SomeKey}}">
        <!-- Throws System.Windows.Markup.XamlParseException  -->

    </TextBox>

1 个答案:

答案 0 :(得分:3)

正如Alex所述,正确的方法是使用Merged Dictionaries 因此,您应该正确构建项目,否则最终会陷入混乱。

保持“空白项目”,它应该如下所示:

  • YourProject
    • App.xaml (。cs)
    • MainWindow.xaml (。cs)
    • SomeOtherWindow.xaml (。cs)
    • 资源文件夹
      • Dictionary1.xaml
      • Dictionary2.xaml
      • ...

然后你必须决定:

  1. 您希望资源在应用程序范围内可用吗?
  2. 或者您希望某些窗口/用户控件之间的资源有所不同吗?
  3. 如果您想要#1,则必须合并 App.xaml 文件中的词典:

    <Application x:Class=...
                 ...>
        <Application.Resources>        
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Resources/Dictionary1.xaml"/>
                    <ResourceDictionary Source="Resources/Dictionary2.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>
    

    如果你想要#2,你必须合并特定窗口/用户控制文件中的字典:

    <Window x:Class=...
            ...>
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Resources/Dictionary1.xaml"/>
                    <ResourceDictionary>
                        <!-- Window specific resources -->
                    </ResourceDictionary>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>
    
        <!-- Content -->
    </Window>