WPF - Как добавить изображение к кнопке единой сетки? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть два изображения, определенные следующим образом:

Image Wall = new Image();
Wall.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Wall.png"));
Image Corridor = new Image();
Corridor.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Corridor.png"));

У меня есть равномерная сетка, и в каждой из ее ячеек есть кнопка. Моя цель - сделать так, чтобы одна из этих картинок появлялась на каждой из этих кнопок в зависимости от состояния DataTrigger. Мой код выполняется, но картинки не появляются, и я получаю два предупреждения: «Не удалось разрешить ресурс« Коридор »» и «Не удалось разрешить ресурс« Стена »». Вот мой код xaml:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <ItemsControl Grid.Row="1" ItemsSource="{Binding Fields}">

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="{Binding TableSize}" Columns="{Binding TableSize}" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Command="{Binding SelectCommand}" CommandParameter="{Binding Number}" BorderThickness="0">

                    <Button.RenderTransform>
                        <ScaleTransform ScaleX="1" ScaleY="1" />
                    </Button.RenderTransform>
                    <Button.Style>
                        <Style TargetType="Button">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Background}" Value="Corridor">
                                    <Setter Property="Foreground" Value="{DynamicResource Corridor}" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Background}" Value="Wall">
                                    <Setter Property="Foreground" Value="{DynamicResource Wall}" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Background}" Value="Player">
                                    <Setter Property="Background" Value="Yellow" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>

        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Row" Value="{Binding X}" />
                <Setter Property="Grid.Column" Value="{Binding Y}" />
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</Grid>

Наконец, это коллекция ObservableCollection, к которой я привязал свою кнопку. Его свойство background берет свое значение из значения, называемого _model, потому что я использую архитектуру MVVM, которая не так важна в этом вопросе. Все, что имеет значение, это то, что свойство Background может быть только Corridor, Wall или Player.

ObservableCollection<DungeonField> Fields = new ObservableCollection<DungeonField>();
for (Int32 i = 0; i < 9; ++i)
{
    for (Int32 j = 0; j < 9; ++j)
        Fields.Add(new DungeonField
        {
            Background = _model.GetField(i, j).ToString(),
            X = i,
            Y = j,
            Number = i * 9 + j,
        });
}

У меня есть эти два изображения, добавленные в мой проект в качестве ресурсов, и для их Действия по сборке установлено значение Resource. Я совершенно новичок ie в манипулировании изображениями в wpf, поэтому мой вопрос: что мне не хватает?

Заранее спасибо

Редактировать: я решил, что не должен использовать DynamicResource в xaml в части DataTrigger, потому что я уже объявил переменную Image, чтобы я мог просто привязать ее к кнопкам. Использование Binding вместо DynamicResource приводит к тому, что все эти предупреждения исчезают, но изображения по-прежнему не отображаются в сетке.

1 Ответ

0 голосов
/ 21 апреля 2020

Я понял. Мне не нужно объявлять эти два изображения в начале моего вопроса, и первые два DataTriggers должны выглядеть так:

<DataTrigger Binding="{Binding Background}" Value="Corridor">
    <Setter Property="Source" Value="Resources/Corridor.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Background}" Value="Wall">
    <Setter Property="Source" Value="Resources/Wall.png" />
</DataTrigger>
...