Приложение не может найти ресурс в Generic.xaml - PullRequest
2 голосов
/ 07 сентября 2011

Я работаю над приложением WPF, которое использует элементы управления Telerik RAD для WPF. Приложение будет использоваться на ПК с сенсорным экраном, поэтому мне нужно увеличить размеры таких элементов, как сборщики на элементе управления DateTimePicker, чтобы их можно было легко нажимать людьми с сосисками, такими как у меня.

Изначально я использовал Expression Blend для редактирования копии шаблона элемента управления. Это создало ControlTemplate в файле XAML UserControl, который я проектировал. У меня есть другой UserControl, над которым я сейчас работаю, который также будет использовать DateTimePicker, поэтому я хочу повторно использовать ControlTemplate.

Я переместил измененный шаблон в новый именованный стиль в Generic.XAML проекта (библиотека управления WPF). Вот краткий фрагмент 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.

То же самое происходит, если я меняю "DynamicResource" на "StaticResource" в XAML. Кроме того, я не внес никаких изменений в файл Assembly.Info для проекта.

Как мне это исправить?

Спасибо

Tony

1 Ответ

3 голосов
/ 07 сентября 2011

Насколько я помню, у вас не может быть именованных ресурсов, на которые вы хотите ссылаться в generic.xaml - которые вы должны поместить в app.xaml

Вы должны указать ключ типа для стилей или ключ компонента в ключе для шаблонов элементов управления. а в статическом конструкторе класса переопределяют метаданные, например:

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

Таким образом, решением вашей проблемы может быть перемещение стиля в app.xaml

В качестве альтернативы вы можете поместить его в отдельный xaml-файл ResourceDictionary и импортировать его в ResourceDictionary.MergedDictionaries

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...