@Untiwe

Почему при запросе объекта стиля, получается null?

Есть стиль, прописанный в ресурсах.

<Window.Resources>
        
        <Style x:Name="NubmersStyle" TargetType="TextBlock" BasedOn="{StaticResource BaseFontFamily}">
            <Setter Property="Control.FontSize" Value="50"/>
            <Setter Property="Control.Background" Value="Transparent"/>
            <Setter Property="Control.HorizontalContentAlignment" Value="Center"/>
            <Setter Property="Control.VerticalContentAlignment" Value="Center"/>
            <Setter Property="Control.HorizontalAlignment" Value="Stretch"/>
            <Setter Property="Control.VerticalAlignment" Value="Stretch"/>
            <Setter Property="Control.Foreground" Value="white"/>
        </Style>


 </Window.Resources>


Я пытаюсь поменять цвет текста в коде. Для этого в гугле быстро находится решение, которое надо чуть поменять и получается это

public void SetStyles()
        {
            Setter setter = new Setter(Control.ForegroundProperty, Color.FromArgb(0, 0, 0, 0));
            Style = Resources["NubmersStyle"] as Style;
            Style.Setters.Add(setter);
        }


Из него видно, что я общаюсь к словарю ресурсов по ключу, получаю объект и привожу его у типу Style.
Вот только после приведения типов, я получаю null и при добавлении нового setter получаю ошибку. Из дебагера видно, что словарь Resources есть и у него даже есть ключ с именем NubmersStyle Я так догадываюсь, что тут ошибка с приведением типов, но это только догадка. 613a01da53f85301268743.jpeg
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Как вариант, можно создать окно, в котором задать заранее определённые стили, задать им TargetType и это надо сделать. Задать каждому стилю уникальный ключ. Создать в Code Behind окна свойство с текущим стилем и его менять. К этому свойству можно прибиндиться TextBlock(ом). Можно всё это сделать красивее и т.д., но суть из примера будет ясна, думаю.

Вот можно посмотреть как здесь предлагают Changing the styles at runtime in WPF

<Window
    x:Class="Monitor.SomeWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:Monitor"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="SomeWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Window.Resources>
        <Style
            x:Key="BaseFontFamily"
            TargetType="TextBlock">
            <Setter Property="FontSize" Value="90" />
        </Style>
        <Style
            x:Key="Numbers1Style"
            BasedOn="{StaticResource BaseFontFamily}"
            TargetType="TextBlock">
            <Setter Property="Foreground" Value="LightCoral" />
        </Style>
        <Style
            x:Key="Numbers2Style"
            BasedOn="{StaticResource BaseFontFamily}"
            TargetType="TextBlock">
            <Setter Property="Foreground" Value="Bisque" />
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock
            Grid.Row="0"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Style="{Binding TimeBlockStyle, RelativeSource={RelativeSource AncestorType=local:SomeWindow}}"
            Text="{Binding Path=RightTeam.TeamCounter, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
        <Button
            Grid.Row="1"
            Click="OnButtonClick" />
    </Grid>
</Window>


public partial class SomeWindow : Window
{
    public static readonly DependencyProperty TimeBlockStyleProperty = DependencyProperty.Register(
        nameof(TimeBlockStyle), typeof(Style), typeof(SomeWindow), new PropertyMetadata(default(Style)));

    public Style TimeBlockStyle
    {
        get { return (Style)GetValue(TimeBlockStyleProperty); }
        set { SetValue(TimeBlockStyleProperty, value); }
    }

    public SomeWindow()
    {
        InitializeComponent();
        TimeBlockStyle = (Style)Resources["Numbers1Style"];
    }

    private void OnButtonClick(object sender, RoutedEventArgs e)
    {
        TimeBlockStyle = (Style)Resources["Numbers2Style"];
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AndromedaStar
.Net - monkey
Resources["NubmersStyle"] - опечатка. А опечатка случилась из-за магических слов. В таком стиле на C# стараются не писать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы