Ответ 1
Вот как вы можете установить свое прикрепленное свойство в стиле
<Style x:Key="ToolBarButtonStyle" TargetType="Button">
<Setter Property="PrismExt:ImgSourceAttachable.ImgSource"
Value="./Images/New.png"/>
<!--...-->
</Style>
При привязке к прикрепленным свойствам путь должен находиться в круглых скобках, поэтому используйте RelativeSource
Связывание с TemplatedParent
вместо
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Image x:Name="toolbarImage"
Source="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=(PrismExt:ImgSourceAttachable.ImgSource)}"
Width="48"
Height="48">
</Image>
</ControlTemplate>
</Setter.Value>
</Setter>
Изменить: Вышеприведенный код работает в WPF, в Silverlight Image
отображается во время выполнения, но с ошибкой он не работает в дизайнере. Вы можете использовать следующий код в PropertyChangedCallback, чтобы получить Image
в качестве обходного пути
private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Button button = d as Button;
Image image = GetVisualChild<Image>(button);
if (image == null)
{
RoutedEventHandler loadedEventHandler = null;
loadedEventHandler = (object sender, RoutedEventArgs ea) =>
{
button.Loaded -= loadedEventHandler;
button.ApplyTemplate();
image = GetVisualChild<Image>(button);
// Here you can use the image
};
button.Loaded += loadedEventHandler;
}
else
{
// Here you can use the image
}
}
private static T GetVisualChild<T>(DependencyObject parent) where T : DependencyObject
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}