所以我试图在XAML中设置一些按钮的样式,然后遇到一个关于绑定的staticresource的问题。
我试图让按钮有一个Grid系统,有2个cols。左侧的图像和右侧的(或文本)的contentpresenter。我希望图像对于此按钮的每个实例都不同,因此图像上的Source需要不同。我可能以错误的方式接近这个但是我想到的唯一方法是让按钮XAML反映控件模板中的不同图像是使用按钮的Tag属性,将其设置为源字符串。然后使用IValueConverter将字符串转换为位图图像。但绑定给了我一个可怕的时间。我尽我所能搜索,无法为我的生活找到它!
以下是样式代码:
<Style x:Key="ServerButtonTop" TargetType="{x:Type Button}">
<Setter Property="Background" Value="#0d5b8f" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Width" Value="220"/>
<Setter Property="Height" Value="60" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Margin" Value="20" />
<Setter Property="FontSize" Value="20" />
<!-- Template for the buttons -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="#dddddd" BorderThickness="1" Background="{TemplateBinding Background}" CornerRadius="3">
<Grid Width="{TemplateBinding Width}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Width="40" Height="40" Source="{TemplateBinding Tag, Converter={StaticResource StringToImage}}" />
<ContentPresenter Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Name="thetext" />
</Grid>
</Border>
<!-- trigger for mouse over -->
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Black" />
<Setter Property="Background" Value="#ACD9F8" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform" TargetName="thetext">
<Setter.Value>
<TranslateTransform Y="1.0" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
问题在于行:
<Image Width="40" Height="40" Source="{TemplateBinding Tag, Converter={StaticResource StringToImage}}" />
并且要完成XAML部分,这就是我想要实现的目标:
<Button Style="{StaticResource ServerButtonTop}" Content="Button Text" Tag="Resources/imagename.png" />
整个按钮完美运行,样式和网格布局以及所有内容,只是它不会显示图像。
以下是IValueConverter类的代码
[ValueConversion(typeof(string), typeof(BitmapImage))]
public class StringToImage : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo info)
{
return new BitmapImage(new Uri((string)value));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo info)
{
throw new NotImplementedException();
}
}
目前我遇到的问题是&#34;资源&#39; StringToImage&#39;无法解决。&#34;在玩耍的同时,我得到了一个&#34; IValueConvert无法转换为字符串&#34;的错误。
IValueConverter类紧挨着同一XAML窗口的命名空间中的窗口类。
答案 0 :(得分:0)
在没有一堆位图的情况下测试它有点棘手。我认为这应该有效:
<Image Width="40" Height="40" Source="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource StringToImage}}" />
很好地解释为什么这应该在这里工作:WPF TemplateBinding vs RelativeSource TemplatedParent