Вот другой простой метод с помощью 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]
С тех пор я обнаружил, что пропустил важную часть документации из 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);
Есть более простой, встроенный способ сделать это. Установите 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>