Стиль теряется, когда другой элемент управления с тем же стилем загружается в приложение WPF - PullRequest
0 голосов
/ 09 июня 2019

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

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

Вот определение стиля в App.xaml:

   <Style x:Key="SaveButton" TargetType="telerik:RadButton">
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Content">
            <Setter.Value>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="5" Text="Save"/>
                    <Image Source="Resources\icons\save.png" Margin="5" 
                    Height="16" Width="16"></Image>
                </StackPanel>
            </Setter.Value>
        </Setter>
    </Style>

Окно с кнопкой, несущей стиль SaveButton, загружено правильно.Но из этого окна, когда загружается другой пользовательский элемент управления с еще одной кнопкой с тем же стилем SaveButton, кнопка пользовательского элемента управления отображается правильно, но кнопка в окне становится совершенно пустой (без полей, без изображения, без текста).

Любая помощь в этом отношении приветствуется.

1 Ответ

1 голос
/ 10 июня 2019

Поскольку вы явно устанавливаете свойство Content для Button, его значение может быть применено только один раз. По умолчанию атрибут XAML x:Shared имеет значение true. Это означает, что любой данный запрос ресурса всегда возвращает один и тот же экземпляр. В вашем случае это означает, что каждый раз, когда применяется Style, применяется одно и то же значение ContentControl.Content. Чтобы опустить это, у вас есть три варианта.

Первый вариант - установить для атрибута XAML тега Style значение true:

<Style x:Shared=False ...></Style>

Второй вариант - переопределить ControlTemplate из Control:

<Style ...>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="5" Text="Save"/>
                    <Image Source="Resources\icons\save.png" Margin="5" 
                    Height="16" Width="16"></Image>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Третий вариант - переопределить ContentControl.ContentTemplate напрямую:

<Style ...">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="5" Text="Save"/>
                    <Image Source="Resources\icons\save.png" Margin="5" 
                    Height="16" Width="16"></Image>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...