应用程序无法在Generic.xaml中找到资源

时间:2011-09-07 13:12:29

标签: wpf resources

我正在开发一个使用Telerik RAD控件进行WPF的WPF应用程序。该应用程序将在具有触摸屏的PC上使用,因此我需要在DateTimePicker控件上使拾取器之类的东西更大,以便像我自己的香肠手指一样容易按下它们。

我最初使用Expression Blend来编辑控件模板的副本。这在我正在设计的UserControl的XAML文件中创建了一个ControlTemplate。我现在正在使用另一个UserControl,它也将使用DateTimePicker,所以我想重用ControlTemplate。

我所做的是将修改后的模板移动到项目(WPF控件库)Generic.XAML中的新命名样式。这是Generic.xaml的简短片段:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:CarSystem.CustomControls"
                    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
                    xmlns:Telerik_Windows_Controls_Chromes="clr-namespace:Telerik.Windows.Controls.Chromes;assembly=Telerik.Windows.Controls">

    <Style x:Key="RadDateTimePickerControlTemplate1" TargetType="{x:Type telerik:RadDateTimePicker}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type telerik:RadDateTimePicker}">
                                  . . .
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

这是我参考样式的XAML片段:

<UserControl x:Class="CarSystem.CustomControls.ReportCriteria"
             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:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
             xmlns:cs="clr-namespace:CarSystem.CustomControls" 
             mc:Ignorable="d" 
             Height="648" 
             Width="1117">

    <Grid Background="{DynamicResource ContentBackground}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <GroupBox BorderBrush="Black" FontSize="20" FontWeight="Bold" Grid.Row="0" Header="Report Criteria: " Margin="5">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="320" />
                    <ColumnDefinition Width="200" />
                    <ColumnDefinition Width="450" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="110" />
                </Grid.ColumnDefinitions>

                <GroupBox BorderBrush="Black" FontSize="20" FontWeight="Bold" Grid.Column="0" Header="Date Range:" Margin="5">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*" />
                            <ColumnDefinition Width="2*" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock FontSize="18" 
                                   FontWeight="Bold" 
                                   Grid.Column="0" 
                                   Grid.Row="0" 
                                   HorizontalAlignment="Right" 
                                   Text="Start Date:  " />
                        <telerik:RadDateTimePicker FontSize="18" 
                                                   FontWeight="Bold" 
                                                   Grid.Column="1" 
                                                   Grid.Row="0" 
                                                   Name="StartDatePicker" 
                                                   Style="{DynamicResource RadDateTimePickerControlTemplate1}" />
                        <TextBlock FontSize="18" 
                                   FontWeight="Bold" 
                                   Grid.Column="0" 
                                   Grid.Row="1" 
                                   HorizontalAlignment="Right" 
                                   Text="End Date:  " />
                        <telerik:RadDateTimePicker FontSize="18" 
                                                   FontWeight="Bold" 
                                                   Grid.Column="1" 
                                                   Grid.Row="1" 
                                                   Name="EndDatePicker" 
                                                   Style="{DynamicResource RadDateTimePickerControlTemplate1}" />
                    </Grid>
                </GroupBox>
                        . . .

        </GroupBox>
    </Grid>
</UserControl>

当我在Expression Blend工作时,一切看起来都很好。我看到控件下拉按钮宽度的变化。回到Visual Studio,一切都编译得很好,但更改没有显示 - 我只看到控件的默认样式,并且对样式的引用在它们下面有一条蓝色波浪线。将鼠标悬停在波浪线上时,将显示以下消息:

     The resource "RadDateTimePickerControlTemplate1" cannot be resolved.

如果我在XAML中将“DynamicResource”更改为“StaticResource”,则会发生同样的事情。另外,我没有对项目的Assembly.Info文件进行任何更改。

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:3)

据我所知,你不能在generic.xaml中引用你想要引用的命名资源 - 你必须放入app.xaml

您必须在控件模板的键中为style或ComponentResourceKey指定键的类型 并在类静态构造函数中覆盖元数据,如:

  public class FlatStylebutton : Button
  {
    static FlatStylebutton()
    {
      DefaultStyleKeyProperty.OverrideMetadata(typeof(FlatStylebutton), new FrameworkPropertyMetadata(typeof(FlatStylebutton)));
    }
  }

因此,您的问题的解决方案可能是将样式移至app.xaml

或者,您可以将其放在单独的ResourceDictionary xaml文件中,并将其导入ResourceDictionary.MergedDictionaries