Изменить стиль управления WPF во время выполнения с помощью Binding - PullRequest
0 голосов
/ 22 января 2020

Для игры, которую я разрабатываю, код должен изменить (во время выполнения) стиль кнопки. По сути, кнопка представляет ячейку в (подобной шахматам) игре, а атрибут ячейки (фон, передний план или изображение) представляет состояние ячейки (захвачено, повреждено, враг и т. Д. c.).

Приложение вычисляет имя стиля кнопки и устанавливает для DataContext кнопки значение «StateA», «StateB», «State C» или «StateD», в зависимости от состояния ячейки.

Я пробовал несколько альтернатив, чтобы определить стиль кнопки. Ничего не работает (см. Ниже).

Как правильно определить привязку, которая будет выбирать стиль из нескольких предопределенных стилей элемента управления во время выполнения?

        <Button Content="Button"  Style="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Click="Button_Click" />

        <Button Content="Button" Style="{DynamicResource {Binding}}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Click="Button_Click" />

Раздел стиля:

<Window x:Class="WpfApp2.MainWindow"
        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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <Style x:Key="StateA"  >
            <Setter Property="TextBlock.Background" Value="blue" />
        </Style>
        <Style x:Key="StateB" >
            <Setter Property="TextBlock.Background" Value="yellow" />
        </Style>
        <Style x:Key="StateC"  >
            <Setter Property="TextBlock.Background" Value="green" />
        </Style>
    </Window.Resources>

    <Grid>
        <Button Name="foo" Content="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Click="Button_Click" Style="{DynamicResource {Binding}}" />

    </Grid>
</Window>

1 Ответ

3 голосов
/ 22 января 2020

Используйте один Style с DataTriggers, который привязывается к вашему DataContext или свойству источника:

<Window.Resources>
    <Style x:Key="ButtonStyle" TargetType="Button">
        <Style.Triggers>
            <DataTrigger Binding="{Binding}" Value="StateA">
                <Setter Property="TextBlock.Foreground" Value="Blue" />
            </DataTrigger>
            <DataTrigger Binding="{Binding}" Value="StateB">
                <Setter Property="TextBlock.Foreground" Value="Red" />
            </DataTrigger>
            <DataTrigger Binding="{Binding}" Value="StateC">
                <Setter Property="TextBlock.Foreground" Value="Green" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid>
    <Button Name="foo" Content="{Binding}" HorizontalAlignment="Center" 
            VerticalAlignment="Center" Width="75" 
            Click="Button_Click" Style="{StaticResource ButtonStyle}" />
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...