Обязательное использование параметра x:Shared=False Невозможно

Этот вопрос может быть очень похож на такие вопросы, как Ошибка при использовании ресурсов x:Shared=False во внешней сборке в WPF, но мне не удалось найти решение, к которому я мог бы относиться, или, скорее, получить представление о том, как решить эту проблему.

Почему я упомянул обязательное использование в заголовке, так это то, что я не смог найти альтернативный способ решения моей проблемы, кроме как с использованием установки X:shared в false.

Моя проблема заключается в том, что в конкретном представлении, имеющем Icons , для Elements of Like Type Icons, похоже, используется совместное использование, поэтому, даже если есть два или более типов, Icon будет отображаться только с одним элементом.

Этот вопрос оправдан и в этих вопросах о переполнении стека.

Контент отображается только в одном элементе в заданное время

WPF: можно использовать StaticResource только один раз

Я был бы очень признателен за любую помощь/предложения по преодолению этого


person Community    schedule 22.08.2019    source источник
comment
Одним из способов полностью избежать использования x:Shared было бы использование шаблонов данных для ваших значков. Напишите шаблон данных, который отображает значок, а затем, чтобы отобразить значок, вы можете использовать пользовательский элемент управления, например: <UserControl ContentTemplate="{StaticResource HomeIconTemplate}" />, где HomeIconTemplate — это значение x:Key для рассматриваемого шаблона данных.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 22.08.2019


Ответы (2)


Я мог бы рассмотреть использование DataTemplates для создания значков, если по какой-либо причине x: Shared является проблемой. DataTemplate создает копию содержимого при применении, поэтому совместное использование не является проблемой.

Ресурс:

<DataTemplate x:Key="FileSystemIcon">
    <Canvas Width="12" Height="12">
        <Path 
            Stroke="Black" 
            Fill="White"  
            Data="M20,4L4,4A2,2,0,0,0,2,6L2,18A2,2,0,0,0,4,20L20,20A2,2,0,0,0,22,18L22,6A2,2,0,0,0,20,4 M20,18L4,18 4,8 12,13 20,8 20,18 M20,6L12,11 4,6 4,6 20,6 20,6z" 
            />
    </Canvas>
</DataTemplate>

Использование:

<UserControl ContentTemplate="{StaticResource FileSystemIcon}" />
person 15ee8f99-57ff-4f92-890c-b56153    schedule 22.08.2019
comment
Привет, Эд! Это было отличное решение, и оно действительно помогло. Если позволяет время, вы также были бы очень признательны за вашу помощь в этом вопросе -name-is-data-t" title="управление контентом xname не отвратительно подхватывается целевым именем - это данные t">stackoverflow.com/questions/57620004/ Спасибо. - person ; 23.08.2019

Сложность заключается в том, что у вас есть множество цветов. В настоящее время наблюдается тенденция к более простым значкам с фоном и передним планом. Для которого вы можете «просто» использовать один путь и геометрию.

Увидев, что это несколько форм и несколько цветов, вы можете использовать DrawingImage.

Я сделал этот пример в пользовательском элементе управления, это примерно как одна из ваших иконок.

       xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
        mc:Ignorable="PresentationOptions"
                 >
        <UserControl.Resources>
            <DrawingImage x:Key='icon'  PresentationOptions:Freeze="True">
                <DrawingImage.Drawing>
                    <DrawingGroup>
                        <DrawingGroup.Children>
                            <GeometryDrawing Geometry="M17,17A5,5,0,0,1,12,22A5,5,0,0,1,7,17C7,15.36,7.79,13.91,9,13L9,5A3,3,0,0,1,12,2A3,3,0,0,1,15,5L15,13C16.21,13.91,17,15.36,17,17 M11,8L11,14.17C9.83,14.58,9,15.69,9,17A3,3,0,0,0,12,20A3,3,0,0,0,15,17C15,15.69,14.17,14.58,13,14.17L13,8 11,8z"
                                             Brush="Wheat"
                                             >
                                <GeometryDrawing.Pen>
                                    <Pen Thickness="1" Brush="Green"/>
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                            <GeometryDrawing Geometry="M17,18L12,15.82 7,18 7,5 17,5 M17,3L7,3A2,2,0,0,0,5,5L5,21 12,18 19,21 19,5C19,3.89,18.1,3,17,3z"
                                             Brush="Lavender"
                                             >
                                <GeometryDrawing.Pen>
                                    <Pen Thickness="1" Brush="Red"/>
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                        </DrawingGroup.Children>
                    </DrawingGroup>
                </DrawingImage.Drawing>
            </DrawingImage>
        </UserControl.Resources>
        <Grid>
            <StackPanel>
                <Image  Width="12" Height="12" Source="{StaticResource icon}"/>
                <Image  Width="12" Height="12" Source="{StaticResource icon}"/>
            </StackPanel>

        </Grid>
    </UserControl>
person Andy    schedule 22.08.2019
comment
Привет, Энди. Эти цвета использовались, чтобы просто получить разнообразие на выходе. Спасибо за ваш ответ, я попробую в будущем :) - person ; 22.08.2019