Nano Hash - криптовалюты, майнинг, программирование

Загрузка ресурсов из ResouceDictionary по ключу с x: Shared = True

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

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                xmlns:converters="clr-namespace:DbEditor.Converters"
                x:ClassModifier="internal"
                x:Class="DbEditor.Components.ScalarHandlers"
                >
<Grid x:Key="stringEditor" x:Shared="False">
    <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"  IsEnabled="{Binding IsReadOnly}"></TextBox>
</Grid>

<Grid x:Key="intEditor" x:Shared="False">
    <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" PreviewTextInput="IntTextBox_PreviewTextInput" IsEnabled="{Binding IsReadOnly}"></TextBox>
</Grid>
...
</ResourceDictionary>

Я нахожу один из шаблонов по ключу так:

var scalarDictionary = new ResourceDictionary();
scalarDictionary.Source = new Uri("/DbEditor;component/Components/Scalar.xaml", UriKind.RelativeOrAbsolute);
var pair = scalarDictionary.OfType<DictionaryEntry>().FirstOrDefault(x => (string)x.Key == key);
return pair.Value as FrameworkElement;

Но добавленный один раз к какому-то элементу управления, элемент нельзя использовать в другом месте. Раньше эти шаблоны хранились в ресурсах App.xaml и имели атрибут x: Shared = "False", который позволял использовать их много раз. Теперь добавление атрибута x: Shared приводит к ошибке времени выполнения.

"Shared attribute in namespace 'http://schemas.microsoft.com/winfx/2006/xaml' can be used only in compiled resource dictionaries."

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

Есть ли способ загрузить элементы управления из ResourceDictionary во время выполнения по ключу и использовать их более одного раза?


  • Вы можете попробовать использовать метод Clone элемента управления (унаследованный от Freezable). 12.11.2014
  • Используйте этот код. Вы можете найти ключи ресурсов. Вот код: ResourceDictionary res = Application.LoadComponent (новый Uri (/WpfApplication5;component/Dictionary.xaml, UriKind.RelativeOrAbsolute)) как ResourceDictionary; 12.11.2014
  • @MikeStrobel, я не нашел ни одного элемента управления, реализующего Freezable, который может использоваться как контейнер для элементов управления: msdn.microsoft.com/ru-ru/library/ 13.11.2014
  • @MLE загрузка словаря таким образом приводит к той же ошибке - общий атрибут нельзя использовать, потому что словарь не скомпилирован 13.11.2014

Ответы:


1

Проблема была решена как-то неэлегантно. Я только что создал страницу, переместил туда ресурсы и использовал ее вместо ResourceDictionary:

<Page x:Class="DbEditor.Components.ScalarPage" ...>
    <Page.Resources>
        <Grid x:Key="stringEditor" x:Shared="False">
            <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"  IsEnabled="{Binding IsReadOnly}"></TextBox>
        </Grid>

        <Grid x:Key="intEditor" x:Shared="False">
            <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" PreviewTextInput="IntTextBox_PreviewTextInput" IsEnabled="{Binding IsReadOnly}"></TextBox>
        </Grid>

    ...

    </Page.Resources>    
</Page>

и загрузка ресурсов:

scalarPage = new ScalarPage();               
return scalarPage.FindResource(key) as FrameworkElement;
13.11.2014
  • Это выглядит не круто, поэтому, если кто-то предоставит больше WPF и правильный ответ, я охотно его приму. 13.11.2014
  • Вы можете объяснить, для чего вы его используете? Ваше текущее решение кажется немного тупым и может быть решено гораздо лучше, но информации недостаточно, чтобы дать правильное решение. 13.11.2014
  • @bonyjoe, в моем проекте я разрабатываю редактор свойств для фреймворка 3.5 (я знаю о wpftoolkit, но это не то, что мне нужно), в зависимости от некоторых параметров, таких как тип, имя и другие, я назначаю элемент управления редактору свойств моего объекта свойства который используется как DataContext моего ObjectPropertiesEditor. Это значение используется в привязке как Content в элементе управления ContentPresenter редактора. Вот почему я загружаю эти элементы управления таким образом во время выполнения. 13.11.2014
  • Вместо этого вы можете использовать свойство ContentTemplateSelector в ContentPresenter msdn.microsoft.com/en-us/library/, это передаст текст данных в предоставленный вами селектор, и в селекторе вы можете выбрать и вернуть правильный шаблон. Здесь показан пример msdn .microsoft.com / en-us / library / 13.11.2014
  • Из-за архитектуры на основе плагинов редакторы не могут быть загружены с помощью ContentTemplateSelector: объект, который хранит название свойства, значение, редактор, isreadonly и другие связанные данные, инициализируется каскадом экземпляров фильтра, которые могут быть загружены из других dll. 13.11.2014

  • 2

    Вместо этого вы можете использовать DataTemplates в своем словаре ресурсов и установить их в свойстве ContentTemplate, содержащем элементы управления, а не в свойстве Content, как я предполагаю, вы сейчас это делаете.

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

    ex

        <DataTemplate x:Key="stringEditor">
           <Grid>
               <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"  IsEnabled="{Binding IsReadOnly}"></TextBox>
           </Grid>
        </DataTemplate>
    
    <ContentControl ContentTemplate="{StaticResource stringEditor}"/>
    
    12.11.2014
  • К сожалению, я не могу использовать StaticResource - я загружаю информацию о том, какой шаблон использовать из базы данных. Кроме того, удаление атрибута x: Shared даже при использовании контейнера DataTempalte запрещает добавление загруженного элемента более одного раза. 13.11.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..