Создание C # WPF Image Button с шаблоном, который я могу динамически изменять в коде - PullRequest
1 голос
/ 26 июля 2010

Привет, я выяснил, как создать шаблон кнопки изображения в C # WPF, и я наткнулся на это . Это кажется мне действительно полезным, за исключением двух проблем:

  1. Я хочу иметь возможность динамически изменять изображения в коде C #, поскольку эта кнопка будет использовать изображения, которые я загружаю динамически через документы XML.
  2. ИСПРАВЛЕНО Я получаю сообщение об ошибке «Имя« InitializeComponent »не существует в текущем контексте». Вот мой код (обратите внимание, у меня нет отключенного изображения, только нажатой и нормальный. Normal.png и другой просто заполнители.

Я надеялся использовать это в нескольких местах, но я всегда могу создать несколько разных версий. Однако мне нужно, чтобы изображения загружались динамически, и я не могу выяснить, как заставить изображение, указанное в моем коде на C #, в основном действовать как кнопка. Спасибо

ПРИМЕЧАНИЕ. Я могу заставить кнопку работать хорошо, за исключением изменения части исходного изображения. этот код у меня сейчас.

        <Button x:Class="CFYLauncher.PageNavButton"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Image x:Name="NormalImg" Source="\img\btn_arrow.png"/>
                <Image x:Name="PressedImg" Source="\img\btn_arrow_selected.png" Visibility="Hidden"/>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Setter TargetName="NormalImg" Property="Visibility" Value="Hidden"/>
                    <Setter TargetName="PressedImg" Property="Visibility" Value="Visible"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>

с кодом

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

    namespace CFYLauncher
{
    /// <summary>
    /// Interaction logic for PageNavButton.xaml
    /// </summary>
    public partial class PageNavButton : Button
    {
        public PageNavButton()
        {
            InitializeComponent();
        }

        public string ImageUri
        {
            set
            {
                this.NormalImg.Source = new BitmapImage(value);
            }
        }

    }
}

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

  1. «Ошибка 1« CFYLauncher.PageNavButton »не содержит определения для« NormalImg »и не найден метод расширения« NormalImg », принимающий первый аргумент типа« CFYLauncher.PageNavButton »(если вы пропустили директиву using или ссылка на сборку?)
  2. «Ошибка 2: наилучший перегруженный метод сопоставления для« System.Windows.Media.Imaging.BitmapImage.BitmapImage (System.Uri) »содержит недопустимые аргументы» и «Невозможно преобразовать строку» в «System.Uri»

Когда я изменяю 'public string ImageUri' на 'public Uri ImageUri', 2 ошибки в 2) исчезают, но он все равно не может найти NormalImg, что для меня не имеет смысла, потому что оно прямо там .. Должно быть, я упускаю что-то действительно очевидное

Ответы [ 2 ]

0 голосов
/ 26 июля 2010

В обратном порядке:

2) как говорит SteveCav, ваши файлы XAML и cs имеют разные пространства имен, ваша ошибка «Имя InitializeComponent не существует в текущем контексте», как правило, означает выделенный коди файлы XAML не были сопоставлены компилятором.

1) для изменения изображения во время выполнения, добавьте атрибут x: Id x: Name к одному из изображений и установитесвойство Source во время выполнения (обратите внимание, что в C # вы можете; просто установите его в путь, вместо этого установите для него BitmapImage, инициализированный вместо этого путем)


<Image Source="{Binding ImageUri}" Visibility="Hidden" />

myImage.Source = new BitmapImage(where my Uri is);

Это выглядит из комментария каквы хотите установить его снаружи шаблона, и в этом случае я бы рекомендовал добавить открытое свойство:


public Uri ImageUri { get; set;}

Тогда ваш код вызова может просто позвонить myButton.ImageUri = <em>Uri for my image</em>

0 голосов
/ 26 июля 2010

Чтобы исправить сообщение об ошибке, измените пространство имен на TestWpfApplication или измените класс x: на «CFYLauncher.PageNavButton»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...