Повторная загрузка: невозможно использовать XAML ResourceDictionary в библиотеке классов C# / WPF - PullRequest
0 голосов
/ 13 февраля 2020

Последний был закрыт, потому что это был якобы дублирующий вопрос.

Просто чтобы уточнить, прежде чем это снова закроется: мое приложение - это «Библиотека классов», а не «Приложение WPF» или что-то подобное. Это означает следующее:

  • У меня нет приложения. XML вы обычно получаете, когда создаете приложение WPF
  • Все темы, которые я видел по аналогичным вопросам используют приложения WPF. Я пытался их исправить без каких-либо успехов.

Так что это копия / вставка из моего последнего вопроса:

Для плагина Revit я построение диалогового окна WPF с представлением, logi c, а теперь немного стилей.

Очень быстро я пришел к выводу, что помещать все мои стили в действительно беспорядочно (это просто означает, что я прокручиваю через мой XAML половина моего времени). Поэтому я хотел отделить свой стиль от моего кода XAML (как вы бы сделали с HTML и CSS).

Итак, я узнал о том, как и как go настроить его. У меня есть мое окно с этим кодом ресурса:

<Window.Resources>
<local:LocationView x:Key="mainViewDataSource" />
<FontFamily x:Key="Ubuntu">pack://application:,,,/Kalec.Enveo;component/src/Resources/Fonts/#Ubuntu</FontFamily>
<FontFamily x:Key="FontAwesomeSolid">pack://application:,,,/Kalec.Enveo;component/src/Resources/Fonts/#Font Awesome 5 Free Solid</FontFamily>
<FontFamily x:Key="FontAwesomeRegular">pack://application:,,,/Kalec.Enveo;component/src/Resources/Fonts/#Font Awesome 5 Free Regular</FontFamily>

<ResourceDictionary x:Key="dictionary" Source="pack://application:,,,/Kalec.Enveo;component/src/WPF/Styles/Dictionary.xaml" />

И мои словари:

Dictionary.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary x:Key="MergedDictionaries">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Dictionaries/InputStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

и InputStyles.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="SearchInputStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Height" Value="30"/>
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Border CornerRadius="15" Background="White" BorderBrush="Transparent" x:Name="border">
                    <Grid>
                        <TextBox Text="{Binding Path=Text,
                                            RelativeSource={RelativeSource TemplatedParent}, 
                                            Mode=TwoWay,
                                            UpdateSourceTrigger=PropertyChanged}"
                             x:Name="textSource" 
                             Background="Transparent" 
                             Panel.ZIndex="2" />
                            <TextBox Text="{TemplateBinding Tag}" Background="{TemplateBinding Background}" Panel.ZIndex="1">
                                <TextBox.Style>
                                    <Style TargetType="{x:Type TextBox}">
                                        <Setter Property="Foreground" Value="Transparent"/>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Path=Text, Source={x:Reference textSource}}" Value="">
                                                <Setter Property="Foreground" Value="Gray"/>
                                                <Setter Property="HorizontalContentAlignment" Value="Left"/>
                                                <Setter Property="VerticalContentAlignment" Value="Center"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBox.Style>
                            </TextBox>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="Red"/>
                        <Setter Property="Foreground" Value="Red" />

                    </Trigger>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter Property="Foreground" Value="Blue" />
                        <Setter Property="BorderBrush" TargetName="border" Value="Blue"/>
                    </Trigger>
                    <DataTrigger Binding="{Binding Path=Text}" Value="">
                        <Setter Property="Text" Value="Vul een adres in"/>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Проблема в том, что я не могу использовать стиль в своем текстовом поле:

    <Window.Resources>
    <local:LocationView x:Key="mainViewDataSource" />
    <FontFamily x:Key="Ubuntu">pack://application:,,,/Kalec.Enveo;component/src/Resources/Fonts/#Ubuntu</FontFamily>
    <FontFamily x:Key="FontAwesomeSolid">pack://application:,,,/Kalec.Enveo;component/src/Resources/Fonts/#Font Awesome 5 Free Solid</FontFamily>
    <FontFamily x:Key="FontAwesomeRegular">pack://application:,,,/Kalec.Enveo;component/src/Resources/Fonts/#Font Awesome 5 Free Regular</FontFamily>

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary  Source="pack://application:,,,/Kalec.Enveo;component/src/WPF/Styles/Dictionaries/InputStyles.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

И, наконец, текстовое поле:

<StackPanel Margin="10,10,0,0" Orientation="Vertical">
                <StackPanel Panel.ZIndex="10" Orientation="Horizontal" 
                    Name="SearchParameters">
                    <TextBox Width="220" Style="{DynamicResource SearchInputStyle}"/>
                    <Button FontFamily="{StaticResource FontAwesomeSolid}" 
                        Content="&#xf019;" Foreground="#31B192" Grid.ColumnSpan="2" 
                        Style="{DynamicResource LocationImport}"
                        Margin="10, 0, 0, 0"/>
                </StackPanel>

                <Label Name="ErrorMessage" Visibility="Visible"></Label>
                <StackPanel Orientation="Vertical" Visibility="Collapsed" 
                        Height="400" Width="300"
                        Name="AddressList"></StackPanel>
            </StackPanel>

Я просто получаю сообщение об ошибке, которое не может быть решено. Я посмотрел на некоторые решения, и большинство из них говорят мне, чтобы включить ResourceDictionary в мой App.xaml, но у меня нет этого файла, потому что мой проект является библиотекой классов (это требование для плагина).

Могу ли я даже использовать словари ресурсов? Или есть какой-то другой способ разделения стиля или XAML в разных файлах?

1 Ответ

0 голосов
/ 14 февраля 2020

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

Например, если окно находится в папке src/WPF и Ресурсный словарь - src/WPF/Styles/Dictionaries/InputStyles.xaml.

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary  Source="Styles/Dictionaries/InputStyles.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

Здесь также есть ссылка на одинаковый пост об использовании словарей в библиотеке.

Если это не так Чтобы решить вашу проблему, вам нужно предоставить больше информации о том, как вы используете библиотеку.

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