В приложении WPF у меня есть стиль, используемый для кнопок:
<Style TargetType = "Button" x:Key = "ButtonEllipse">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "Button">
<StackPanel Orientation = "Vertical">
<ContentPresenter HorizontalAlignment = "Center" VerticalAlignment = "Center" Margin = "0 0 0 10"/>
<Image x:Name = "ButtonImage" HorizontalAlignment = "Center" VerticalAlignment = "Center" Stretch = "None" Source = "/MyProject;component/Images/ButtonEllipse.png"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Для большинства кнопок это нормально, но для одного конкретного экземпляра я хочу использовать тот же шаблон, но изменить изображение на ButtonEllipseNew.png (что является значением свойства модели представления). Кнопка определяется так:
<Button Content = "Test" Style = "{StaticResource ButtonEllipse}">
</Button>
Как я могу изменить значение источника изображения в шаблоне только для этой конкретной кнопки? Я хочу привязать источник к свойству в модели представления.
Изображение определяется в общем стиле (не всегда используется в одной и той же модели). Вопрос в том, как использовать привязку только в одном конкретном экземпляре, а для остальных оставить значение по умолчанию.
затем просто определите второй стиль и измените изображение ... или вам нужно написать настраиваемый элемент управления кнопкой, который определяет свойство зависимости изображения
Он динамический (следовательно, привязка), я не могу написать стиль для каждого возможного значения
пользовательские элементы управления кнопками, как и другие приложения anwsers, кстати, замена изображений на векторный контент будет обязательной - вы можете найти их на сайте materialdesign.com или нарисовать их с помощью expresion Designer 4 (бесплатно) - тогда ни стиля, ни пользовательской кнопки, просто контент - github.com/TheCamel/ArchX/blob/master/ArchX/Views/…





Боюсь, вы не сможете повторно использовать только часть ControlTemplate. Вы должны определить шаблон в целом:
WPF: есть ли способ переопределить часть ControlTemplate без переопределения всего стиля?
Что вы можете сделать, так это привязать свойство SourceImage в шаблоне к некоторому свойству, которое затем можно установить индивидуально для каждого элемента управления, к которому применяется шаблон:
<Style TargetType = "Button" x:Key = "ButtonEllipse">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "Button">
<StackPanel Orientation = "Vertical">
<ContentPresenter HorizontalAlignment = "Center" VerticalAlignment = "Center" Margin = "0 0 0 10"/>
<Image x:Name = "ButtonImage" HorizontalAlignment = "Center" VerticalAlignment = "Center" Stretch = "None"
Source = "{Binding Tag, RelativeSource = {RelativeSource AncestorType=Button}}"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
...
<Button Content = "Test" Style = "{StaticResource ButtonEllipse}" Tag = "image.png" />
Использовал привязку отсюда для привязки к прикрепленному свойству, которое работало (см. Также ниже)
Я бы написал настраиваемый элемент управления, который выглядит примерно так:
internal class IconButton : Button
{
public ImageSource Source
{
get { return (ImageSource)GetValue(SourceProperty); }
set { SetValue(SourceProperty, value); }
}
public static readonly DependencyProperty SourceProperty =
DependencyProperty.Register("Source", typeof(ImageSource), typeof(IconButton), new PropertyMetadata(null));
}
Затем отредактируйте свой стиль, чтобы он соответствовал ему:
<Style TargetType = "{x:Type location:IconButton}" x:Key = "ButtonEllipse">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "{x:Type location:IconButton}">
<StackPanel Orientation = "Vertical">
<ContentPresenter HorizontalAlignment = "Center" VerticalAlignment = "Center" Margin = "0 0 0 10"/>
<Image x:Name = "ButtonImage" HorizontalAlignment = "Center" VerticalAlignment = "Center" Stretch = "None" Source = "{TemplateBinding Source"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
Где location - это пространство имен, определенное xaml, в котором размещается класс IconButton.
Затем просто установите свойство Source вашей кнопки. Вы также можете повозиться со свойством Source, чтобы установить значение по умолчанию.
Работал так же, но с прикрепленным свойством (нет необходимости наследовать Button и изменять все типы решения).
Отлично, рад, что это помогло.
Чтобы привязать свойство к своему стилю, вы должны сделать следующее:
Создайте пользовательский элемент управления, назовите его ButtonImage.cs
public class ButtonImage : Button
{
public ImageSource Source
{
get
{
return (ImageSource)GetValue(SourceProperty);
}
set
{
SetValue(SourceProperty, value);
}
}
public static readonly DependencyProperty SourceProperty =
DependencyProperty.Register("Source",
typeof(ImageSource),
typeof(ButtonImage),
new PropertyMetadata(null));
}
Я бы создал ResourceDictionary, чтобы вы могли использовать его для всех своих стилей. Назовем его Dictionary.xaml. Здесь вы определяете свой стиль, например:
<ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local = "clr-namespace:WpfApplication4">
<Style TargetType = "{x:Type local:ButtonImage}" x:Key = "ButtonEllipse">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "{x:Type local:ButtonImage}">
<StackPanel Orientation = "Vertical">
<ContentPresenter HorizontalAlignment = "Center" VerticalAlignment = "Center" Margin = "0 0 0 10"/>
<Image x:Name = "ButtonImage" HorizontalAlignment = "Center" VerticalAlignment = "Center" Stretch = "None" Source = "{TemplateBinding Source}"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Тогда, по вашему мнению, вы можете:
<Window x:Class = "WpfApplication4.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:wpfApplication4 = "clr-namespace:WpfApplication4"
mc:Ignorable = "d"
Title = "MainWindow" Height = "450" Width = "800">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source = "Dictionary.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<wpfApplication4:ButtonImage Margin = "0,50,0,0" Content = "Test" Source = "{Binding Name}" Style = "{StaticResource ButtonEllipse}" />
</Grid>
</Window>
{Binding ImageProp} в свойстве viewmodel?