我正在尝试为我的WinRT项目创建一个ImageToggleButton,它根据其IsChecked属性更改它的图像。
在Visual Studio 2012和Visual Studio Express for Windows 8的设计器中,ToggleButton的行为符合预期,但在运行时,图像不会显示。
有什么想法吗?
XAML:
<Page.Resources>
<local:BooleanImageConverter x:Name="BoolImgConverter"/>
</Page.Resources>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<ToggleButton HorizontalAlignment="Left" Height="200" Margin="260,205,0,0" VerticalAlignment="Top" Width="833" Background="Yellow">
<Image Source="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Parent.IsChecked, Converter={StaticResource BoolImgConverter}, ConverterParameter=Assets/chkMusic}"/>
</ToggleButton>
</Grid>
CodeBehind:
public class BooleanImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string culture)
{
bool state = (bool)value;
string baseName = (string)parameter;
return string.Format("{0}_{1}checked.png", baseName, state ? "" : "un");
}
public object ConvertBack(object value, Type targetType, object parameter, string culture)
{
return null;
}
}
代码说明:
我将一个Image控件放入ToggleButton并使用转换器将图像源绑定到包含(父)ToggleButton的IsChecked属性,该转换器根据IsChecked装饰给定的ConverterParameter以提供引用所需图像文件的字符串。
当然我可以在后面的代码中执行此操作,但我更愿意尽可能在XAML中执行此操作。
目前我还没有在构建ControlTemplate之后,我会尝试使用RelativeSource FindAncestor和本论坛的其他建议,但这些dids似乎在Windows应用商店应用中不起作用(或者我错了吗?)。
我很感激任何建议。
由于
(顺便说一句:我试图将windows-store-app添加为此帖子的标签,但无法创建此新标签 - 其他人会这样做吗)
答案 0 :(得分:0)
父母从来没有像你想象的那样工作。有几种方法可以满足您的需求。
第一个是保持RelativeSource绑定,但删除IsChecked的路径。这会将控制传递给转换器。在其中,您可以使用VisualTreeHelper获取父级。
第二种是命名你的ToggleButton并使用ElementName绑定
绑定它<ToggleButton x:Name="MusicToggle" HorizontalAlignment="Left" Height="200" Margin="260,207,-793,-207" VerticalAlignment="Top" Width="833" Background="Yellow">
<Image Source="{Binding IsChecked, ElementName=MusicToggle, Converter={StaticResource BoolToImage}, ConverterParameter=Assets/chkMusic}"/>