Как связать источник изображения в ControlTemplate из кода позади? - PullRequest
0 голосов
/ 03 февраля 2011

Мне нужно связать источник изображения, определенный в коде, в ControlTemplate.У меня проблема с тем, чтобы он работал правильно.Мне интересно, может ли кто-нибудь помочь.

Изображение в ControlTemplate стиля Button.Я создаю этот стиль кнопки на нескольких страницах XAML.Моя цель - определить экземпляр Icon в каждом коде этих страниц xaml, чтобы разместить значок, уникальный для каждой страницы XAML.Возможно, это может быть лучший способ определить уникальные значки, которые должны отображаться на каждой странице XAML, где будет загружен стиль кнопки.

Ниже приведена ссылка на решение, которое я создал.Это простой пример, где у меня есть 2 xaml страницы с кнопками в одном стиле.Мне нужно иметь возможность загрузить icon1.png в кнопку, когда mainWindow.xaml открыт, и icon2.png, когда Page1.xaml открыт.

http://cid -0c29483cf3a6a14d.office.live.com / self.aspx / WPF% 5E_Tests / BindingImageFromCode.zip

1 Ответ

0 голосов
/ 05 февраля 2011

Я вижу пару решений вашей проблемы.Вы никогда не узнаете, что на самом деле является родителем вашего Button, поэтому код, связанный с привязкой к свойству для Window, Page и т. Д., Будет трудно реализовать без особого жесткого кодирования.

подход 1

Подпишитесь на событие Loaded для Button, найдите Image в шаблоне Button с помощью FindName и установите источник оттуда.Это также можно сделать с помощью присоединенного поведения

Xaml

<Button Style="{DynamicResource ButtonStyle1}"
        Loaded="Button_Loaded"
        ...>

кода позади

private void Button_Loaded(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    Image imgIcon2 = button.Template.FindName("imgIcon2", button) as Image;
    Uri uri = new Uri("Resources/icon1.png", UriKind.Relative);
    ImageSource imgSource = new BitmapImage(uri);
    imgIcon2.Source = imgSource;
}

Подход 2

Создайте подкласс Button, называемый, например, ImageButton, где вы добавляете новое свойство UriSource, которое вы можете связать внутри шаблона.

<Style x:Key="ButtonStyle1" TargetType="{x:Type local:ImageButton}">
    <!--...-->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ImageButton}">
                <!--...-->
                <Image x:Name="imgIcon2"
                       Source="{Binding RelativeSource={RelativeSource self},
                                        Path=UriSource}"
                                        .../>
                <!--...-->
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Используется как

<local:ImageButton Style="{DynamicResource ButtonStyle1}"
                   UriSource="Resources/icon1.png"
                   ...>

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

...