WPF Использование изображений в шаблоне generic.xaml

Я пишу стиль для пользовательского элемента управления, полученного непосредственно из элемента управления. Visual Studio помещает стиль для "Пользовательского элемента управления (WPF)" в файл Themes\generic.xaml. Мой стиль содержит изображение, которое я не могу отобразить, кажется, есть что-то особенное в том, как установить источник для изображения из файла generic.xaml.

Мне удалось воспроизвести проблему с более простым сценарием. Создайте "библиотеку пользовательских элементов управления WPF", а затем добавьте стиль для кнопок, например, в themes\generic.xaml . Вот мой полный файл generic.xaml:

<ResourceDictionary
   ...
   <Style TargetType="{x:Type Button}">
     <Setter Property="Content">
        <Setter.Value>
            <Image Source="SmallHandle.png"></Image>
        </Setter.Value>
     </Setter>
   </Style>
</ResourceDictionary>

После этого я создал UserControl (в том же проекте), содержащий только кнопку (для проверки стиля), например:

<UserControl x:Class="BlendControls.UserControl1"
         ...
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">   
    <Button/>
</UserControl>

Я добавил SmallHandle.png в корневой каталог проекта, в каталог тем, я также добавил его на старую добрую страницу ресурсов, попытался изменить действие сборки на ресурс, встроенный ресурс, попытался скопировать изображение вручную в каталог сборки., но безрезультатно. Изображение никогда не отображается.

Это должно быть связано с файлом generic.xaml, потому что копирование всего стиля в тот же файл, в котором находится кнопка, работает нормально. То есть следующее работает как положено:

<UserControl x:Class="BlendControls.UserControl1"
         ...             
         d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
       <Style TargetType="{x:Type Button}">
           <Setter Property="Content">
               <Setter.Value>
                   <Image Source="SmallHandle.png"></Image>
               </Setter.Value>
           </Setter>
       </Style>
    </UserControl.Resources>
       <Button></Button>
</UserControl>

Итак, как мне установить источник изображений из generic.xaml? Или в качестве альтернативы, где я должен поместить стили / шаблоны для пользовательских элементов управления?

---- Решение ----

Как отметил Шеридан, я должен использовать нотацию URI "полного" пакета как:

pack://application,,,/MyAssembly;components/SmallHandle.png

Это выглядит странно для меня, так как изображение находится в той же сборке. Не уверен, похоже, что я ссылаюсь извне dll.

3 ответа

Решение

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

<Image Source="/AssemblyName;component/Subfolder/SmallHandle.png" />

Если ваши изображения находятся непосредственно в корне проекта (что не рекомендуется), вы можете получить к ним доступ следующим образом:

<Image Source="/AssemblyName;component/SmallHandle.png" />

Если ваши изображения находятся в папке в другом проекте, вы можете получить к ним доступ следующим образом:

<Image Source="/ReferencedAssembly;component/Subfolder/SmallHandle.png" />

См. Pack URI на странице WPF на MSDN для получения дополнительной информации.


ОБНОВЛЕНИЕ >>>

В.NET 4, выше Image.Source ценности будут работать. Тем не менее, Microsoft внесла некоторые ужасные изменения в.NET 4.5, которые сломали много разных вещей, поэтому в.NET 4.5 вам нужно будет использовать все pack путь как этот:

<Image Source="pack://application:,,,/AssemblyName;component/Images/image_to_use.png">

Если вы не чувствуете, что ваш файл generic.xaml поднят, вы можете сослаться на него из вашего App.cs.xaml следующим образом:

<App.Resources>
   <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="/MY.NAMESPACE;component/Themes/generic.xaml" />
   </ResourceDictionary.MergedDictionaries>
</App.Resources>

Ваш файл generic.xaml должен быть помечен как "Ресурс".

Также ваш файл изображения должен быть помечен как "Ресурс".

Наконец, обратитесь к вашему ImageSource следующим образом:

<Image Source="Themes/IMAGE.png" />

или попробуйте

<Image Source="../Themes/IMAGE.png" />

Лично я люблю помещать свои шаблоны стилей в их собственный файл.xaml и ссылаться на них как на MergedDictionaries.

Типизированный базовый стиль в разделе Темы \ Общий стиль автоматически применяется только к пользовательскому элементу управления.

Если вам нужно использовать типизированный стиль в вашем пользовательском элементе управления, вам нужно добавить generic.xaml в ресурсы пользовательского элемента управления.

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Themes/Generic.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Также измените URI источника изображения на

<Image Source="pack://application:,,,/WpfCustomControlLibrary1;component/SmallHandle.png" /> 
Другие вопросы по тегам