Динамическое изменение свойства стиля - PullRequest
0 голосов
/ 24 сентября 2011

Я работаю над приложением WPF. У меня есть словарь ресурсов, в котором я написал собственные стили для всплывающей подсказки и для кнопки. На самом деле, для кнопки я сделал два стиля. Один из них, включил изображение, чтобы появиться слева от содержимого в кнопке.

<Style x:Key="ButtonImageStyle" TargetType="{x:Type Button}">
     ........
   <TextBlock Margin="5.25,2.417,5.583,5.25" Foreground = White />
   <Image x:Name="ButtonImage" Source="/MyProject;component/Images/icoMainMenu01.png" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="-100,0,0,0" Width="16" Height="16"/>
   .... </Style

Теперь в MainWindow.xaml у меня есть следующее:

<Button Style="{DynamicResource ButtonImageStyle}" x:Name="JustButton" Click="JustButton_Click" Height="50" ToolTip="Press for 1" Content="1" Margin="310,282,400,238"  />

Я хочу иметь возможность изменить это изображение. У меня будет как 8 кнопок, и я хочу, чтобы у каждой кнопки было свое изображение. Ребята, у вас есть идеи? Спасибо!

1 Ответ

0 голосов
/ 24 сентября 2011

Существуют различные варианты, от (ab) использования таких свойств, как Tag до подкласса или композиции в UserControl, вы также можете создать в приложениисвойство .

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

. Для создания подкласса вы можете использовать VS. Из новых элементов выберите Custom Control (WPF), это должно создать файл класса и добавитьбазовый стиль словаря ресурсов тем, который обычно находится в Themes/Generic.xaml.Класс будет выглядеть так:

//<Usings>

namespace Test.Controls
{
    public class ImageButton : Button
    {
        public static readonly DependencyProperty ImageProperty =
            DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton), new UIPropertyMetadata(null));
        public ImageSource Image
        {
            get { return (ImageSource)GetValue(ImageProperty); }
            set { SetValue(ImageProperty, value); }
        }
    }
}

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

<Image Source="{TemplateBinding Image}" .../>

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

<controls:ImageButton Content="Lorem Ipsum"
                      Image="Img.png"/>

(Чтобы использовать Tag, вы просто придерживаетесь обычной кнопки и используете TemplateBinding для тега и устанавливаете тег кнопок в URL)


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

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