如何在样式中使用附加属性?
我有一个按钮样式中创建的映像。现在,我已经创建了一个附加属性,这样我可以设置源的图像。应该是直线前进,但我坚持了下来。
I have created an Image within a ButtonStyle. Now I have created an Attached Property so that I can set the Source for that Image. Should be straight forward but I am stuck with it.
这是我的缩短按钮样式:
This is my shortened ButtonStyle:
<Style x:Key="ToolBarButtonStyle" TargetType="Button">
...
<Image x:Name="toolbarImage" Source="{TemplateBinding PrismExt:ImageSourceAttachable:ImageSource}" Width="48" Height="48">
</Image>
...
</Style>
这是附加属性的定义,请注意,我不知道如何解决的回调,为的DependencyProperty似乎是而不是图像按钮。和按键并不在它的风格暴露我的形象。它的棘手。
And this is the attached property definition, Note that I have no idea how to fix the callback, as the dependencyproperty seems to be the button instead of the image. And Button doesn't expose my Image within its style. Its tricky.
namespace SalesContactManagement.Infrastructure.PrismExt
{
public class ImgSourceAttachable
{
public static void SetImgSource(DependencyObject obj, string imgSource)
{
obj.SetValue(ImgSourceProperty, imgSource);
}
public static string GetImgSource(DependencyObject obj)
{
return obj.GetValue(ImgSourceProperty).ToString();
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ImgSourceProperty =
DependencyProperty.RegisterAttached("ImgSource", typeof(string), typeof(ImgSourceAttachable), new PropertyMetadata(Callback));
private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//((Button)d).Source = new BitmapImage(new Uri(Application.Current.Host.Source, e.NewValue.ToString()));
}
}
}
这是我如何设置内部XAML图像源:
This is how I set the image source within XAML:
<Button PrismExt:ImgSourceAttachable.ImgSource="./Images/New.png" Style="{StaticResource ToolBarButtonStyle}">
</Button>
任何想法吗? 非常感谢,
Any ideas please? Many Thanks,
下面是如何在一个样式设置附加属性。
Here is how you can set your attached property in a style
<Style x:Key="ToolBarButtonStyle" TargetType="Button">
<Setter Property="PrismExt:ImgSourceAttachable.ImgSource"
Value="./Images/New.png"/>
<!--...-->
</Style>
当绑定到附加属性则路径应该是括号内,以便尽量使用的RelativeSource
绑定与 TemplatedParent
而不是
When binding to attached properties then the Path should be within parentheses so try to use RelativeSource
Binding with TemplatedParent
instead
<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>
编辑:上面的code工作在WPF,Silverlight中的图片
显示了在运行时,但它不能在设计师与例外。您可以使用下面的code在PropertyChangedCallback获得图片
作为一种解决方法
The above code works in WPF, in Silverlight the Image
shows in runtime but it fails in the designer with an exception. You can use the following code in the PropertyChangedCallback to get the Image
as a workaround
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;
}