Создание объектов в стилях несколько раз - PullRequest
0 голосов
/ 23 марта 2020

Допустим, у меня много объявлений кнопок в WPF. Эти объявления кнопок очень похожи и различаются только одним свойством. Вот пример кода:

<Button x:Name="Button1"
        ...>
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button>

<Button x:Name="Button2"
        ...>
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button> 

<Button x:Name="Button3"
        ...>
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button> 

<Button x:Name="Button4"
        ...>
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button>

<Button x:Name="Button5"
        ...>
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button>

Все эти кнопки выглядят одинаково, они просто различаются по своему названию.

Поскольку все свойства кнопки одинаковы (кроме имени) Я создал стиль, содержащий все одинаковые свойства, и использовал этот стиль во всех моих кнопках.

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="..." Value="..." />
</Style>

<Button x:Name="Button1"
        Style="{StaticResource ButtonStyle">
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button>

<Button x:Name="Button2"
        Style="{StaticResource ButtonStyle">
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button> 

<Button x:Name="Button3"
        Style="{StaticResource ButtonStyle">
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button> 

<Button x:Name="Button4"
        Style="{StaticResource ButtonStyle">
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button>

<Button x:Name="Button5"
        Style="{StaticResource ButtonStyle">
    <Image Source="{StaticResource ButtonImage}"
           Style="{StaticResource ButtonImageStyle}" />
</Button>

Пока все работает нормально.

Теперь, так как даже изображение то же самое на всех кнопках, я хотел переместить это изображение в стиль.

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="..." Value="..." />
    <Setter Property="Content">
        <Setter.Value>
            <Image Source="{StaticResource ButtonImage}"
                   Style="{StaticResource ButtonImageStyle}" />
        </Setter.Value>
    </Setter>
</Style>

<Button x:Name="Button1"
        Style="{StaticResource ButtonStyle" />

<Button x:Name="Button2"
        Style="{StaticResource ButtonStyle" />

<Button x:Name="Button3"
        Style="{StaticResource ButtonStyle" />

<Button x:Name="Button4"
        Style="{StaticResource ButtonStyle" />

<Button x:Name="Button5"
        Style="{StaticResource ButtonStyle" />

Но теперь я вижу только изображение на текущей активной кнопке, все остальные кнопки не показывают образ. Я предполагаю, что при перемещении изображения в стиль оно создается только один раз в памяти, и поэтому его можно показать только один раз.

Есть ли способ сообщить WPF, что объект, созданный в стиле, следует создавать отдельно? для каждого объекта, который использует этот стиль?

Ответы [ 3 ]

0 голосов
/ 23 марта 2020

Вы можете определить Image как отдельный нераспределенный ресурс:

<Image x:Key="img" x:Shared="false" Source="{StaticResource ButtonImage}" 
    Style="{StaticResource ButtonImageStyle}" />
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Content" Value="{StaticResource img}" />
</Style>
0 голосов
/ 23 марта 2020

Спасибо.

Решение x:Shared, упомянутое в двух ответах, не сработало, по крайней мере, в коде, который я должен был поддерживать.

Но я нашел ContentTemplate с помощью кнопки, и помещая мои Image в DataTemplate и помещая эти DataTemplate в мой стиль, я работал.

0 голосов
/ 23 марта 2020

Вы должны каждый раз создавать новое изображение, так как оно не будет уничтожено. Поэтому поместите x:Shared="false":

<Image x:Key="ButtonImage" x:Shared="false".. />

в определение ресурса изображения, это должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...