2012-09-16 29 views
0

我试图为我的WinRT项目创建一个ImageToggleButton,它改变了它的IsChecked属性的图像。Metro/Windows Store应用程序:相对图像源绑定不起作用?

在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; 
     } 
    } 

代码描述:

我把一个图像控制到切换按钮并结合所述图像源到含有(父)的属性器isChecked切换按钮使用装饰给定的根据ConverterParameter器isChecked一个转换器提供字符串来引用所需的图像文件。

当然,我可以在代码背后做到这一点,但我希望尽可能在XAML中做到这一点。

目前,我也没有建立一个ControlTemplate后,我会尝试RelativeSource FindAncestor和这个论坛的其他建议,但这些似乎没有在Windows Store应用程序(或我错了?)。

我会很感激任何建议。

感谢

(顺便说一句:我想作为标签添加Windows商店,应用这个职位,但不能创建新的标签 - 将别人做到这一点)

+0

以下测试Shawns提示后,我算了一下,该结合不会引发此版本的转换器无论是。在启动时只有一次,但从不单击ToggleButton时。 –

回答

0

父母从来没有当过你认为它会。有几种方法可以完成你所需要的。

第一个是保持RelativeSource绑定但删除IsChecked的路径。这将把控制权交给转换器。在它中你可以使用VisualTreeHelper获得父级。

二是命名您的切换按钮,并使用绑定到它的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}"/> 

+0

谢谢Shawn的提示,我会首选解决方案1,因为2需要我指定每个我想使用的ToggleButton,而我不想这么做。只有当我将'' “{Binding RelativeSource = {RelativeSource Mode = Self},Path = Parent,Converter = {StaticResource Parent2ImgConverter}}”/>'我发现转换器在启动时只会被调用一次,而不会再次。我做错了什么? –

+0

啊是的,你需要定期检查状态。在那个笔记做一个行为可能会更好。行为不在WinRT,但你可以添加然后与[http://winrtbehaviors.codeplex.com/](http://winrtbehaviors.codeplex.com/) –

+0

谢谢肖恩,再次!我会试试这个。 –