Стиль TextBox вызывает исключение при загрузке элемента управления в другой сборке - PullRequest
2 голосов
/ 23 октября 2019

Я создал сборку для многоразовых элементов управления (среди прочего). В этой сборке есть файл Themes / Generic.xaml, который используется для пользовательских стилей элементов управления. Я хотел бы реализовать разные стили для разных элементов управления в отдельных файлах, поэтому я подумал, что было бы неплохо использовать объединенный словарь.

My Generic / Themes.xaml выглядит следующим образом:

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

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="../Resources/MyTextBoxStyle.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Файл MyTextBoxStyle.xaml выглядит следующим образом:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:general="clr-namespace:com.testsoft.General">

    <Style TargetType="{x:Type general:MyTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="Foreground" Value="Black" />
        <Style.Triggers>
            <Trigger Property="IsReadOnly" Value="True">
                <Setter Property="Foreground" Value="Gray" />
            </Trigger>
        </Style.Triggers>
    </Style>
</ResourceDictionary>

Я добавил статический конструктор, поэтому стиль будет применяться:

static MyTextBox()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(typeof(MyTextBox)));
}

При использовании этого пользовательскогоTextBox в другой сборке, приложение аварийно завершает работу со следующим исключением:

IOException: Die Ressource "resources/mytextboxstyle.xaml" kann nicht gefunden werden. (ресурс не найден)

Однако, если я не использую подход MergedDictionary и добавлю всестиль XAML прямо в файл Generic / Themes.xaml, все работает нормально.

Я попытался изменить действие по построению файла MyTextBoxStyle.xaml на Resource, Embedded Resource, но это не помогло. Как я могу использовать MergedDictionaries и при этом иметь возможность использовать стилизованный элемент управления в других сборках?

Ответы [ 4 ]

1 голос
/ 23 октября 2019

Я делаю то же самое, что и ты. Создайте FrameworkLibrary и используйте его на каждом customerSolution. Если я определяю DefaultStyleKey, я использую процедуру без комментариев. Я не знаю, получишь ли ты лучшую производительность на статическом конструкторе. В вашем CustomerApplication (Testbase) вам нужно только связать свой Themes.xaml внутри App.xaml.

библиотеки управления (WpfControlLibrary1)

using System.Windows;
using System.Windows.Controls;

namespace WpfControlLibrary1
{
    public class MyTextBox : TextBox
    {
        static MyTextBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(typeof(MyTextBox)));
        }

        //public MyTextBox()
        //{
        //    DefaultStyleKey = typeof(MyTextBox);
        //}
    }
}

Testapplication (Testbase)

App.xaml

<Application x:Class="Testbase.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Testbase"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
                 <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/generic/Themes.xaml" />
             </ResourceDictionary.MergedDictionaries>
         </ResourceDictionary>
    </Application.Resources>
</Application>

enter image description here

0 голосов
/ 23 октября 2019

Я решил проблему, настроив URL следующим образом:

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

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/ControlFramework.Wpf;component/Resources/MyPathTextBox.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Теперь все работает как положено (стиль применяется и исключение не выдается).

0 голосов
/ 23 октября 2019

Используйте абсолютный путь к ресурсу, идентифицированному сборкой (замените WpfCustomControlLibrary1 именем сборки вашей библиотеки пользовательских элементов управления).

<ResourceDictionary Source="pack://application:,,,/WpfCustomControlLibrary1;component/Resources/MyTextBoxStyle.xaml" />
0 голосов
/ 23 октября 2019

Это в вашей новой сборке? xmlns:general="clr-namespace:com.testsoft.General" Если это пространство имен не существует, возможно, удалите его из xaml.

Также, если это ресурс, вам, возможно, придется получить к нему доступ через что-то вроде <ResourceDictionary Source="pack://,,,Resources/MyTextBoxStyle.xaml" />

Я не могупомните точный метод, поэтому вышеприведенное является массовым обобщением.

Также включили ли вы WPFLibrary в качестве ресурса в проект testbase? потому что если нет, то есть ваша проблема, она не включает mytextbox в ваш проект wpf как dll и поэтому не может загрузить ресурс из проекта.

...