Как я могу добавить Путь, который был определен в XAML ResourceDictionary, многократно к форме WPF во времени выполнения?

Вот другой простой метод с помощью del в одном лайнере:

for key in e_keys: del your_dict[key]

e_keys список ключей, которые будут исключены. Это обновит Ваш dict вместо того, чтобы дать Вам новый.

, Если Вы хотите новый вывод dict, затем сделайте копию dict перед удалением:

new_dict = your_dict.copy()           #Making copy of dict

for key in e_keys: del new_dict[key]
11
задан Sebastian Gray 4 September 2009 в 08:17
поделиться

3 ответа

С тех пор я обнаружил, что пропустил важную часть документации из MSDN :

Совместно используемые типы и типы UIElement:

Словарь ресурсов - это техника для определение общих типов и ценностей эти типы в XAML. Не все типы или значения подходят для использования с ResourceDictionary. Для большего информация о том, какие типы считается доступным для совместного использования в Silverlight, см. словари ресурсов.

В частности, все производные от UIElement типы не являются общими, если они исходят из шаблонов и применения шаблон для определенного элемента управления пример. За исключением случая шаблона, ожидается, что UIElement будет существовать только в одном месте в дереве объектов один раз создан и имеет UIElement быть доступным для совместного использования потенциально нарушит этот принцип.

Я резюмирую это так: он работает не так, потому что он не создает новый экземпляр каждый раз, когда я выполняю этот код - он только создает ссылку на объект - вот почему он работает один раз, но не несколько раз. Итак, после небольшого чтения я придумал 3 возможных способа решения моей проблемы:

1) Использовать технику для создания глубокой копии нового объекта. Пример из другого вопроса StackOverflow - Глубокое клонирование объектов

2) Сохраните XAML в строках в приложении, а затем используйте средство чтения XAML для создания экземпляров путей:

System.Windows.Shapes.Path newPath = (System.Windows.Shapes.Path)System.Windows.Markup.XamlReader.Parse("<Path xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'  Width='20' Height='80' Stretch='Fill' Fill='#FF000000' Data='M 20,25.2941L 20,29.4118L 15.9091,29.4118L 15.9091,40L 12.2727,40L 12.2727,29.4118L 2.54313e-006,29.4118L 2.54313e-006,25.6985L 13.4872,7.62939e-006L 15.9091,7.62939e-006L 15.9091,25.2941L 20,25.2941 Z M 12.2727,25.2941L 12.2727,5.28493L 2.09517,25.2941L 12.2727,25.2941 Z M 20,65.2941L 20,69.4118L 15.9091,69.4118L 15.9091,80L 12.2727,80L 12.2727,69.4118L -5.08626e-006,69.4118L -5.08626e-006,65.6985L 13.4872,40L 15.9091,40L 15.9091,65.2941L 20,65.2941 Z M 12.2727,65.2941L 12.2727,45.2849L 2.09517,65.2941L 12.2727,65.2941 Z ' HorizontalAlignment='Left' VerticalAlignment='Top' Margin='140,60,0,0'/>");
LayoutRoot.Children.Add(newPath);

3) Только сохраните данные пути в словаре ресурсов. Создайте новый экземпляр Path в коде, примените данные Path к новому Path, а затем вручную добавьте другие интересующие меня свойства.

XAML - данные Path хранятся как StreamGeometry:

<UserControl.Resources>
    <ResourceDictionary>
        <StreamGeometry x:Key="N44">M 20,25.2941L 20,29.4118L 15.9091,29.4118L 15.9091,40L 12.2727,40L 12.2727,29.4118L 2.54313e-006,29.4118L 2.54313e-006,25.6985L 13.4872,7.62939e-006L 15.9091,7.62939e-006L 15.9091,25.2941L 20,25.2941 Z M 12.2727,25.2941L 12.2727,5.28493L 2.09517,25.2941L 12.2727,25.2941 Z M 20,65.2941L 20,69.4118L 15.9091,69.4118L 15.9091,80L 12.2727,80L 12.2727,69.4118L -5.08626e-006,69.4118L -5.08626e-006,65.6985L 13.4872,40L 15.9091,40L 15.9091,65.2941L 20,65.2941 Z M 12.2727,65.2941L 12.2727,45.2849L 2.09517,65.2941L 12.2727,65.2941 Z</StreamGeometry>
    </ResourceDictionary>
</UserControl.Resources>

C # код для создания экземпляра и применения других значений:

System.Windows.Shapes.Path bPath = new System.Windows.Shapes.Path();
bPath.Data = (System.Windows.Media.Geometry)this.FindResource("N44");

bPath.Width = 20;
bPath.Height = 80;

bPath.VerticalAlignment = System.Windows.VerticalAlignment.Top;
bPath.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;

left = left + 40;

System.Windows.Thickness thickness = new System.Windows.Thickness(left,100,0,0);
bPath.Margin = thickness;

bPath.Fill = System.Windows.Media.Brushes.Black;
LayoutRoot.Children.Add(bPath);
12
ответ дан 3 December 2019 в 03:18
поделиться

Просто создайте стиль для пути и примените его.

3
ответ дан 3 December 2019 в 03:18
поделиться

Есть более простой, встроенный способ сделать это. Установите x:Shared="False" для ресурса. Это позволит использовать его повторно. Затем используйте его столько раз, сколько захотите.

<UserControl.Resources>
    <ResourceDictionary>
        <Path x:Shared="False" x:Key="N44" Width="20" Height="80" Stretch="Fill" Fill="#FF000000" Data="..."/>
    </ResourceDictionary>
</UserControl.Resources>
13
ответ дан 3 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: