Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Пропадает картинка / 9 сообщений из 9, страница 1 из 1
04.03.2020, 14:02
    #39934148
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
Добрый день!
Столкнулся с проблемой. Ниже код, в котором описывается стиль кнопки, которой я устанавливаю картинку в качестве контента.
При запуске, у одной кнопки есть картинка, у другой нет. Хотя стиль применяется на 2 кнопки одинаково, исчезает лишь картинка.
Почему так происходит?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
<Window x:Class="TestWindow1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestWindow1" Height="450" Width="800">
    <Window.Resources>
        <ResourceDictionary>
            <SolidColorBrush x:Key="GroupControlForeground" Color="#DBDCDC"/>
            <SolidColorBrush x:Key="TitleButtonIsMouseOverBackground" Color="#FFFCF4"/>
            <SolidColorBrush x:Key="TitleButtonIsMouseOverBorderBrush" Color="#E5C365"/>
            <BitmapImage x:Key="MinimizeButtonImage" UriSource="../Images/MinimizeDark.png"/>

            <!-- No border button style -->
            <Style TargetType="Button" x:Key="TitleButtonStyle">
                <Setter Property="Background" Value="Transparent"/>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="Foreground" Value="{StaticResource GroupControlForeground}"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                <Setter Property="VerticalContentAlignment" Value="Center"/>
                <Setter Property="Padding" Value="1"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Border x:Name="Chrome" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"
                            BorderThickness="1" BorderBrush="Transparent">
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                          Margin="{TemplateBinding Padding}" 
                                          RecognizesAccessKey="True" 
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="#ADADAD"/>
                                    <Setter Property="Opacity" TargetName="Chrome" Value="0.5"/>
                                </Trigger>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter TargetName="Chrome" Property="Background" Value="{StaticResource TitleButtonIsMouseOverBackground}"/>
                                    <Setter TargetName="Chrome" Property="BorderBrush" Value="{StaticResource TitleButtonIsMouseOverBorderBrush}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <!-- MinimizeButtonStyle -->
            <Style TargetType="Button" BasedOn="{StaticResource TitleButtonStyle}" x:Key="MinimizeButtonStyle">
                <Setter Property="Content">
                    <Setter.Value>
                        <Image Source="{StaticResource MinimizeButtonImage}" Width="18" Height="18"/>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal">
            <Button Style="{StaticResource MinimizeButtonStyle}"
                    Width="32" Height="32"/>
            <Button Style="{StaticResource MinimizeButtonStyle}"
                    Width="32" Height="32"/>
            
        </StackPanel>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
04.03.2020, 14:05
    #39934155
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
Если у кнопки стиль сделать TitleButtonStyle, а контент установить в самой кнопке, а не в стиле, то все работает
...
Рейтинг: 0 / 0
04.03.2020, 14:48
    #39934184
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
всё дело в том, что элемент управления может находится только в 1 месте в визуальном дереве, если его добавляют в 2 разных элемента управления, то он просто удалится в 1 месте и добавиться в другом.
свойство Content очень хитрое, если вы задаете в качестве значения для этого свойства объект UIElement, то ContentPresenter отобразит сам элемент управления.
Передавайте в контент самый ресурс, а элемент управления Image определите в шаблон (ContentTemplate), тогда для каждой кнопки будет создан уникальный UIElement Image, а ресурс (картинка) будет общая.
...
Рейтинг: 0 / 0
04.03.2020, 15:59
    #39934237
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
Roman Mejtes
всё дело в том, что элемент управления может находится только в 1 месте в визуальном дереве, если его добавляют в 2 разных элемента управления, то он просто удалится в 1 месте и добавиться в другом.
свойство Content очень хитрое, если вы задаете в качестве значения для этого свойства объект UIElement, то ContentPresenter отобразит сам элемент управления.
Передавайте в контент самый ресурс, а элемент управления Image определите в шаблон (ContentTemplate), тогда для каждой кнопки будет создан уникальный UIElement Image, а ресурс (картинка) будет общая.

Спасибо за ответ.
...
Рейтинг: 0 / 0
05.03.2020, 22:38
    #39934953
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
Супер_Пав.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
            <Style TargetType="Button" BasedOn="{StaticResource TitleButtonStyle}" x:Key="MinimizeButtonStyle">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Image Source="{StaticResource MinimizeButtonImage}" Width="18" Height="18"/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
...
Рейтинг: 0 / 0
05.03.2020, 22:58
    #39934955
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
Eld Hasp
Супер_Пав.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
            <Style TargetType="Button" BasedOn="{StaticResource TitleButtonStyle}" x:Key="MinimizeButtonStyle">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Image Source="{StaticResource MinimizeButtonImage}" Width="18" Height="18"/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>


можно 1 шаблон на все кнопки сделать, ресурс можно передавать через content
...
Рейтинг: 0 / 0
06.03.2020, 01:07
    #39934985
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
ресурсы иконок и литералы (текст на кнопках, к примеру) лучше подключать через динамические ресурсы, тогда иконки и текст можно будет переопределить через темы и скины или иконка может даже в рамках локализации измениться (для примера иконка сортировки как в Excel от А до Я, от A до Z) и другие всевозможные ништяки. Ведь не так уж и сложнее вместо StaticResource написать Dynamic. к примеру в Европейских странах можно делать немецкий, французский, английский и т.д. так как там все давно уже перемешались =) я кстати часто даже русский делаю, но в прод почему он не уходит :D мелочи это очень важно
...
Рейтинг: 0 / 0
06.03.2020, 01:45
    #39934990
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
Roman Mejtes
можно 1 шаблон на все кнопки сделать, ресурс можно передавать через content

Знаю.
В своё время, благодаря вам, разобрался с этим.
Здесь не хотел вдаваться в объяснения, поэтому внёс наименьшие изменения.

Супер_Пав, пример с DynamicResource ниже.
Добавли третью кнопку для демонстрации.
В привязку не обязательно передавать такой же тип как свойство.
Достаточно передать значение которое сможет "переварить" конвертер для такого типа.
Конвертеры из string есть для всех дефолных типов используемых в WPF.


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
            <Style TargetType="Button" BasedOn="{StaticResource TitleButtonStyle}" x:Key="MinimizeButtonStyle">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Image Source="{DynamicResource MinimizeButtonImage}" Width="18" Height="18"/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal">
            <Button Style="{StaticResource MinimizeButtonStyle}"
                    Width="32" Height="32"/>
            <Button Style="{StaticResource MinimizeButtonStyle}"
                    Width="32" Height="32"/>
            <Button Style="{StaticResource MinimizeButtonStyle}"
                    Width="32" Height="32">
                <Button.Resources>
                    <sys:String x:Key="MinimizeButtonImage">Resources/Плюс.png</sys:String>
                </Button.Resources>
            </Button>
        </StackPanel>
    </Grid>
...
Рейтинг: 0 / 0
11.03.2020, 07:18
    #39936163
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пропадает картинка
Спасибо за подсказки! В проекте использую динамические ресурсы, т.к. позволяю пользователям выбрать тему приложения.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Пропадает картинка / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]