Wannabe Pro Ответов: 2

Шаблон кнопки XAML


У меня есть такой код, теперь я хочу спросить, могу ли я повторно использовать этот код, чтобы установить другую картинку для другой кнопки, но использовать один и тот же шаблон, а в ресурсах каким-то образом добавить больше изображений, и пусть кнопка выбирает картинку на основе некоторого идентификатора кнопки.

Что я уже пробовал:

<Window.Resources>
        <!--Image Resources-->
        <BitmapImage x:Key="DefaultImage"
                     UriSource="/WPF_LogIn_Terminal;component/Images/Loginbtn.png" />
        <BitmapImage x:Key="OnClickImage"
                     UriSource="/WPF_LogIn_Terminal;component/Images/Loginbtn_clicked.png" />
 <!-- Button Style-->
        <ControlTemplate x:Key="ButtonTemplate"
                         TargetType="Button">
            <Grid Width="95"
                  Height="32"
                  Background="Transparent">
                <Image Name="defaultImage"
                       Source="{StaticResource DefaultImage}"
                       Stretch="Uniform"
                       Visibility="Visible" />
                <Image Name="clickedImage"
                       Source="{StaticResource OnClickImage}"
                       Stretch="Uniform"
                       Visibility="Collapsed" />
                <Label x:Name="ContentLabel"
                       Content="{Binding Content,RelativeSource={RelativeSource AncestorType=Button}}"
                       Foreground="{Binding Foreground,RelativeSource={RelativeSource AncestorType=Button}}"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       FontSize="{Binding FontSize,RelativeSource={RelativeSource AncestorType=Button}}" />

            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsPressed"
                         Value="true">
                    <Setter TargetName="ContentLabel"
                            Property="Foreground"
                            Value="White" />
                    <Setter TargetName="defaultImage"
                            Property="Visibility"
                            Value="Collapsed" />
                    <Setter TargetName="clickedImage"
                            Property="Visibility"
                            Value="Visible" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

    </Window.Resources>

2 Ответов

Рейтинг:
17

jimmson

Привет,

да, это возможно, то, что вам нужно, - это пользовательский контроль. В этом пользовательском элементе управления вы можете создать свойство зависимости для пути к изображению и использовать его в своем шаблоне.

Я рекомендую вам ознакомиться с этими статьями "how to" о том, как создавать пользовательские элементы управления:
MSDN: попробуйте: создайте пользовательский элемент управления WPF
Учебник WPF: как создать пользовательский элемент управления WPF


Wannabe Pro

Спасибо за быстрый ответ. Я пытаюсь избежать пользовательского контроля, потому что это не то, что я буду повторно использовать, это только для стартовой страницы, а не для всего проекта. Другие кнопки сделаны с пользовательским управлением, но там я обновляю картинку динамично, и я думаю, потому что эти картинки статичны, что мне не нужна дополнительная работа, чтобы просто вызвать их. Может быть, чтобы отделить их в некоторых XAML. Resources, но тогда я не знаю, как назвать их конкретно для каждой кнопки.

jimmson

Как я понимаю, вы используете кнопку несколько раз на этой начальной странице - вы просто хотите изменить изображение для каждой кнопки. Я все еще думаю, что пользовательский элемент управления-это лучший способ, и его легко создать. Не имеет значения, используете ли Вы контроль только в одном месте или нет. Это также чистый способ решения этой проблемы.

Wannabe Pro

Спасибо, я думаю, что попробую это сделать :)

jimmson

Пожалуйста. Счастливое кодирование :)

Рейтинг:
1

Graeme_Grant

Вот быстрый пользовательский элемент управления (не тестировался).

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;

namespace WpfFlyoutMock3.Control
{
    public class ImageButton : Button
    {
        static ImageButton()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(BitmapImage), 
                new FrameworkPropertyMetadata(typeof(BitmapImage)));
        }

        #region Properties

        public static readonly DependencyProperty PathDataProperty = DependencyProperty.Register
            (
                "Image",
                typeof(BitmapImage),
                typeof(ImageButton),
                new PropertyMetadata(null)
            );

        public BitmapImage Image
        {
            get { return (BitmapImage)GetValue(PathDataProperty); }
            set { SetValue(PathDataProperty, value); }
        }

        #endregion
    }
}


Wannabe Pro

Спасибо, я знаком с пользовательским управлением, но я думаю, что могу избежать их для этого сценария, но, по-видимому, я не могу. Тогда я просто останусь с ними:)