Я вижу пару решений вашей проблемы.Вы никогда не узнаете, что на самом деле является родителем вашего 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, но это, похоже, не работает ..