C# Windows Phone控件模板&;转换器:从程序集中的图像资源加载BitmapImage时出现问题

C# Windows Phone控件模板&;转换器:从程序集中的图像资源加载BitmapImage时出现问题,c#,.net,silverlight,xaml,windows-phone-7,C#,.net,Silverlight,Xaml,Windows Phone 7,这基本上是我问题的后续行动。 我已经成功地使用模板实现了这一点,但是,我希望它有点通用,这样我就不必到处重复代码 工作版本(硬编码)如下: <UserControl.Resources> <ControlTemplate x:Key="TrebleCheckboxImageTemplate" TargetType="CheckBox"> <Image x:Name="imgTreble" MinWidth="100"

这基本上是我问题的后续行动。 我已经成功地使用模板实现了这一点,但是,我希望它有点通用,这样我就不必到处重复代码

工作版本(硬编码)如下:

    <UserControl.Resources>
        <ControlTemplate x:Key="TrebleCheckboxImageTemplate" TargetType="CheckBox">
            <Image x:Name="imgTreble" MinWidth="100" Source="Images/treble_checked.png">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CheckStates">
                        <VisualState x:Name="Checked">
                            <Storyboard>
                                    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="imgTreble" Storyboard.TargetProperty="(Image.Source)">
                                        <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                                <DiscreteObjectKeyFrame.Value>
                                                        <BitmapImage UriSource="Images/treble_checked.png" />
                                                </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Unchecked">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="imgTreble" Storyboard.TargetProperty="(Image.Source)">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                            <DiscreteObjectKeyFrame.Value>
                                                    <BitmapImage UriSource="Images/treble_unchecked.png" />
                                            </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                            </Storyboard>                           
                        </VisualState>
                        <VisualState x:Name="Indeterminate"/>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </Image>

        </ControlTemplate>
    </UserControl.Resources>


<StackPanel x:Name="LayoutRoot" Background="{StaticResource PhoneForegroundBrush}" Orientation="Horizontal">
        <CheckBox Height="72" HorizontalAlignment="Left" Background="White" VerticalAlignment="Top" Template="{StaticResource TrebleCheckboxImageTemplate}" Margin="0,0,10,0" >
            <Custom:Interaction.Triggers>
                <Custom:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Command="{Binding TreblePressedCommand}"/>
                </Custom:EventTrigger>
            </Custom:Interaction.Triggers>
        </CheckBox>

    </StackPanel>

当然,图像路径是硬编码的。所以,我想让它成为通用的,这样你就可以实例化一个复选框,告诉它它的图像,模板对所有人都是一样的

我创建了ImageCheckbox控件类:

public class ImageCheckbox : CheckBox
    {

        /// <summary>
        /// The <see cref="CheckedImagePath" /> dependency property's name.
        /// </summary>
        public const string CheckedImagePathPropertyName = "CheckedImagePath";

        /// <summary>
        /// Gets or sets the value of the <see cref="CheckedImagePath" />
        /// property. This is a dependency property.
        /// </summary>
        public string CheckedImagePath
        {
            get
            {
                return (string)GetValue(CheckedImagePathProperty);
            }
            set
            {
                SetValue(CheckedImagePathProperty, value);
            }
        }

        /// <summary>
        /// Identifies the <see cref="CheckedImagePath" /> dependency property.
        /// </summary>
        public static readonly DependencyProperty CheckedImagePathProperty = DependencyProperty.Register(
            CheckedImagePathPropertyName,
            typeof(string),
            typeof(ImageCheckbox),
            new PropertyMetadata(null));


        /// <summary>
        /// The <see cref="UnCheckedImagePath" /> dependency property's name.
        /// </summary>
        public const string UnCheckedImagePathPropertyName = "UnCheckedImagePath";

        /// <summary>
        /// Gets or sets the value of the <see cref="UnCheckedImagePath" />
        /// property. This is a dependency property.
        /// </summary>
        public string UnCheckedImagePath
        {
            get
            {
                return (string)GetValue(UnCheckedImagePathProperty);
            }
            set
            {
                SetValue(UnCheckedImagePathProperty, value);
            }
        }

        /// <summary>
        /// Identifies the <see cref="UnCheckedImagePath" /> dependency property.
        /// </summary>
        public static readonly DependencyProperty UnCheckedImagePathProperty = DependencyProperty.Register(
            UnCheckedImagePathPropertyName,
            typeof(string),
            typeof(ImageCheckbox),
            new PropertyMetadata(null));


    }
公共类ImageCheckbox:复选框
{
/// 
///依赖项属性的名称。
/// 
公共常量字符串CheckedImagePathPropertyName=“CheckedImagePath”;
/// 
///获取或设置
///属性。这是一个依赖属性。
/// 
公共字符串CheckedImagePath
{
收到
{
返回(字符串)GetValue(CheckedImagePathProperty);
}
设置
{
SetValue(CheckedImagePathProperty,值);
}
}
/// 
///标识依赖项属性。
/// 
公共静态只读DependencyProperty CheckedImagePathProperty=DependencyProperty.Register(
CheckedImagePathPropertyName,
类型(字符串),
类型(ImageCheckbox),
新属性元数据(空);
/// 
///依赖项属性的名称。
/// 
公用常量字符串uncheckDimagePathPropertyName=“uncheckDimagePath”;
/// 
///获取或设置
///属性。这是一个依赖属性。
/// 
公共字符串取消选中DimagePath
{
收到
{
返回(字符串)GetValue(取消选中DimagePathProperty);
}
设置
{
SetValue(取消选中DimagePathProperty,值);
}
}
/// 
///标识依赖项属性。
/// 
公共静态只读DependencyProperty取消选中DimagePathProperty=DependencyProperty.Register(
取消选中DimagePathPropertyName,
类型(字符串),
类型(ImageCheckbox),
新属性元数据(空);
}
我创建了一个转换器(因为我遇到了必须将字符串转换为图像源的Uri的问题)

公共类StringToImageConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值==null)
{
返回null;
}
如果(!UriParser.IsKnownScheme(“pack”))
{
Register(新的GenericUriParser
(GenericUriParserOptions.GenericAuthority)、“pack”、-1);
}
if(值为字符串)
{
var image=新的位图图像();
image.UriSource=新Uri(String.Format(@)pack://application:,,/Images/{0}”,值为字符串);
//image.UriSource=新Uri(String.Format(@)pack://application:,,,/Adagio.Presentation;component/Images/{0}”,值为字符串),UriKind.Absolute);
image.ImageFailed+=新事件处理程序(image\u ImageFailed);
image.ImageOpened+=新事件处理程序(image\u ImageOpened);
返回图像;
}
if(值为Uri)
{
var bi=新的位图图像{UriSource=(Uri)值};
返回bi;
}
返回null;
}
无效图像\u图像已打开(对象发送器,System.Windows.RoutedEventArgs e)
{
抛出新的NotImplementedException();
}
无效映像\u映像失败(对象发送器,System.Windows.ExceptionRoutedEventArgs e)
{
抛出新的NotImplementedException();
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
您可以看到,该转换器已尝试了数千种不同的组合,但没有一种工作。。。 然后,新的xaml:

<ControlTemplate x:Key="CheckboxImageTemplate" TargetType="Controls:ImageCheckbox">
            <Image x:Name="imgForTemplate" MinWidth="100" Source="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CheckedImagePath, Converter={StaticResource stringToImageConverter}}">
                <!--
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CheckStates">
                        <VisualState x:Name="Checked">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="imgForTemplate"  Storyboard.TargetProperty="(Image.Source)">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                        <DiscreteObjectKeyFrame.Value>
                                            <BitmapImage UriSource="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CheckedImagePath, Converter={StaticResource stringToImageConverter}}" />
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Unchecked">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="imgForTemplate" Storyboard.TargetProperty="(Image.Source)">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                        <DiscreteObjectKeyFrame.Value>
                                            <BitmapImage UriSource="{Binding RelativeSource={RelativeSource TemplatedParent},Path=UnCheckedImagePath, Converter={StaticResource stringToImageConverter}}" />
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Indeterminate"/>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>-->
            </Image>

        </ControlTemplate>

<StackPanel x:Name="LayoutRoot" Background="{StaticResource PhoneForegroundBrush}" Orientation="Horizontal">
        <Controls:ImageCheckbox CheckedImagePath="treble_checked.png" UnCheckedImagePath="treble_unchecked.png" Height="72" HorizontalAlignment="Left" VerticalAlignment="Top" Template="{StaticResource CheckboxImageTemplate}" Margin="0,0,10,0" >
            <Custom:Interaction.Triggers>
                <Custom:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Command="{Binding TreblePressedCommand}"/>
                </Custom:EventTrigger>
            </Custom:Interaction.Triggers>
        </Controls:ImageCheckbox>

    </StackPanel>

我一开始就试图让它工作起来,但我似乎甚至没有得到要加载的图像的第一个源属性。注释部分(VisualStateManager声明)也不起作用,但我认为这一定是同一个问题。。在这种情况下,我需要一个转换器来返回Uri,而不是
<ControlTemplate x:Key="CheckboxImageTemplate" TargetType="Controls:ImageCheckbox">
            <Image x:Name="imgForTemplate" MinWidth="100" Source="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CheckedImagePath, Converter={StaticResource stringToImageConverter}}">
                <!--
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CheckStates">
                        <VisualState x:Name="Checked">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="imgForTemplate"  Storyboard.TargetProperty="(Image.Source)">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                        <DiscreteObjectKeyFrame.Value>
                                            <BitmapImage UriSource="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CheckedImagePath, Converter={StaticResource stringToImageConverter}}" />
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Unchecked">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="imgForTemplate" Storyboard.TargetProperty="(Image.Source)">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                        <DiscreteObjectKeyFrame.Value>
                                            <BitmapImage UriSource="{Binding RelativeSource={RelativeSource TemplatedParent},Path=UnCheckedImagePath, Converter={StaticResource stringToImageConverter}}" />
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Indeterminate"/>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>-->
            </Image>

        </ControlTemplate>

<StackPanel x:Name="LayoutRoot" Background="{StaticResource PhoneForegroundBrush}" Orientation="Horizontal">
        <Controls:ImageCheckbox CheckedImagePath="treble_checked.png" UnCheckedImagePath="treble_unchecked.png" Height="72" HorizontalAlignment="Left" VerticalAlignment="Top" Template="{StaticResource CheckboxImageTemplate}" Margin="0,0,10,0" >
            <Custom:Interaction.Triggers>
                <Custom:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Command="{Binding TreblePressedCommand}"/>
                </Custom:EventTrigger>
            </Custom:Interaction.Triggers>
        </Controls:ImageCheckbox>

    </StackPanel>
<Controls:ImageCheckbox CheckedImagePath="Images/treble_checked.png" UnCheckedImagePath="Images/treble_unchecked.png" Height="72" HorizontalAlignment="Left" VerticalAlignment="Top" Template="{StaticResource CheckboxImageTemplate}" Margin="0,0,10,0" >
<BitmapImage UriSource="{Binding Path=UnCheckedImagePath, RelativeSource={RelativeSource TemplatedParent}}" />
<BitmapImage UriSource="{TemplateBinding UnCheckedImagePath}" />
<StackPanel x:Name="LayoutRoot" Background="{StaticResource PhoneForegroundBrush}" Orientation="Horizontal">
        <Controls:ImageCheckbox Style="{StaticResource TheImageCheckboxStyle}" CheckedImagePath="Images/treble_checked.png" UnCheckedImagePath="Images/treble_unchecked.png" Height="72" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,10,0" >
            <Custom:Interaction.Triggers>
                <Custom:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" Command="{Binding TreblePressedCommand}"/>
                </Custom:EventTrigger>
            </Custom:Interaction.Triggers>
        </Controls:ImageCheckbox>

    </StackPanel>
<UserControl.Resources>

        <Style x:Key="TheImageCheckboxStyle" TargetType="Controls:ImageCheckbox">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CheckBox">
                        <Grid Background="Transparent">
                            <VisualStateManager.VisualStateGroups>                                   
                                <VisualStateGroup x:Name="CheckStates">
                                    <VisualState x:Name="Checked">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Visibility">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Source">
                                                <!--  Magic!  -->
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=CheckedImagePath}" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Unchecked">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Visibility">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Source">
                                                <!--  Magic!  -->
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=UnCheckedImagePath}" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Grid Margin="{StaticResource PhoneTouchTargetLargeOverhang}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="32" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <Border x:Name="CheckBackground"
                                        Width="32"
                                        Height="32"
                                        HorizontalAlignment="Left"
                                        VerticalAlignment="Center"
                                        Background="{TemplateBinding Background}"
                                        BorderBrush="{TemplateBinding Background}"
                                        BorderThickness="{StaticResource PhoneBorderThickness}"
                                        IsHitTestVisible="False" />
                                <Rectangle x:Name="IndeterminateMark"
                                           Grid.Row="0"
                                           Width="16"
                                           Height="16"
                                           HorizontalAlignment="Center"
                                           VerticalAlignment="Center"
                                           Fill="{StaticResource PhoneRadioCheckBoxCheckBrush}"
                                           IsHitTestVisible="False"
                                           Visibility="Collapsed" />
                                <!--  Magic! Default to UnCheckedImagePath  -->
                                <Image x:Name="CheckMark"
                                       Width="24"
                                       Height="18"
                                       HorizontalAlignment="Center"
                                       VerticalAlignment="Center"
                                       IsHitTestVisible="False"
                                       Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=UnCheckedImagePath}"
                                       Stretch="Fill"
                                       Visibility="Collapsed" />
                                <ContentControl x:Name="ContentContainer"
                                                Grid.Column="1"
                                                Margin="12,0,0,0"
                                                Content="{TemplateBinding Content}"
                                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                                Foreground="{TemplateBinding Foreground}"
                                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                Padding="{TemplateBinding Padding}"
                                                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

        </Style>
<local:ImageCheckBox HorizontalAlignment="Left"
                     VerticalAlignment="Top"
                     CheckedImagePath="CheckedImage.png"
                     Content="CheckBox"
                     UnCheckedImagePath="UnCheckedImage.png" />
public partial class ImageCheckBox // NameSpace: MyControls
{
    public ImageCheckBox()
    {
        InitializeComponent();
    }

    public const string CheckedImagePathPropertyName = "CheckedImagePath";

    public Uri CheckedImagePath
    {
        get
        {
            return (Uri)GetValue(CheckedImagePathProperty);
        }
        set
        {
            SetValue(CheckedImagePathProperty, value);
        }
    }

    public static readonly DependencyProperty CheckedImagePathProperty =
        DependencyProperty.Register(CheckedImagePathPropertyName,
            typeof(Uri), typeof(ImageCheckBox), new PropertyMetadata(null));

    public const string UnCheckedImagePathPropertyName = "UnCheckedImagePath";

    public Uri UnCheckedImagePath
    {
        get
        {
            return (Uri)GetValue(UnCheckedImagePathProperty);
        }
        set
        {
            SetValue(UnCheckedImagePathProperty, value);
        }
    }

    public static readonly DependencyProperty UnCheckedImagePathProperty =
        DependencyProperty.Register(UnCheckedImagePathPropertyName, 
            typeof(Uri), typeof(ImageCheckBox), new PropertyMetadata(null));
}
<CheckBox x:Class="MyControls.ImageCheckBox"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:l="clr-namespace:WindowsPhoneApplication1"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          d:DesignHeight="480"
          d:DesignWidth="480"
          mc:Ignorable="d">
    <CheckBox.Resources>
        <Style x:Key="PhoneButtonBase"
               TargetType="ButtonBase">
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}" />
            <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" />
            <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}" />
            <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}" />
            <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}" />
            <Setter Property="Padding" Value="10,3,10,5" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ButtonBase">
                        <Grid Background="Transparent">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal" />
                                    <VisualState x:Name="MouseOver" />
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentContainer"
                                                                           Storyboard.TargetProperty="Foreground">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneBackgroundBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonBackground"
                                                                           Storyboard.TargetProperty="Background">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneForegroundBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonBackground"
                                                                           Storyboard.TargetProperty="BorderBrush">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneForegroundBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentContainer"
                                                                           Storyboard.TargetProperty="Foreground">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneDisabledBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonBackground"
                                                                           Storyboard.TargetProperty="BorderBrush">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneDisabledBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonBackground"
                                                                           Storyboard.TargetProperty="Background">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="Transparent" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Border x:Name="ButtonBackground"
                                    Margin="{StaticResource PhoneTouchTargetOverhang}"
                                    Background="{TemplateBinding Background}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    CornerRadius="0">
                                <ContentControl x:Name="ContentContainer"
                                                Content="{TemplateBinding Content}"
                                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                                Foreground="{TemplateBinding Foreground}"
                                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                Padding="{TemplateBinding Padding}"
                                                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="PhoneRadioButtonCheckBoxBase"
               BasedOn="{StaticResource PhoneButtonBase}"
               TargetType="ToggleButton">
            <Setter Property="Background" Value="{StaticResource PhoneRadioCheckBoxBrush}" />
            <Setter Property="BorderBrush" Value="{StaticResource PhoneRadioCheckBoxBrush}" />
            <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMedium}" />
            <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}" />
            <Setter Property="HorizontalContentAlignment" Value="Left" />
            <Setter Property="VerticalContentAlignment" Value="Center" />
            <Setter Property="Padding" Value="0" />
        </Style>
    </CheckBox.Resources>
    <CheckBox.Style>
        <Style BasedOn="{StaticResource PhoneRadioButtonCheckBoxBase}"
               TargetType="l:ImageCheckBox">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CheckBox">
                        <Grid Background="Transparent">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal" />
                                    <VisualState x:Name="MouseOver" />
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckBackground"
                                                                           Storyboard.TargetProperty="Background">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneRadioCheckBoxPressedBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckBackground"
                                                                           Storyboard.TargetProperty="BorderBrush">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneRadioCheckBoxPressedBorderBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneRadioCheckBoxCheckBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="IndeterminateMark"
                                                                           Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneRadioCheckBoxCheckBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckBackground"
                                                                           Storyboard.TargetProperty="Background">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneRadioCheckBoxDisabledBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckBackground"
                                                                           Storyboard.TargetProperty="BorderBrush">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneDisabledBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneRadioCheckBoxCheckDisabledBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="IndeterminateMark"
                                                                           Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneRadioCheckBoxCheckDisabledBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentContainer"
                                                                           Storyboard.TargetProperty="Foreground">
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{StaticResource PhoneDisabledBrush}" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="CheckStates">
                                    <VisualState x:Name="Checked">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Visibility">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Source">
                                                <!--  Magic!  -->
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=CheckedImagePath}" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Unchecked">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Visibility">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CheckMark"
                                                                           Storyboard.TargetProperty="Source">
                                                <!--  Magic!  -->
                                                <DiscreteObjectKeyFrame KeyTime="0"
                                                                        Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=UnCheckedImagePath}" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Indeterminate">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="IndeterminateMark"
                                                                           Storyboard.TargetProperty="Visibility">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Grid Margin="{StaticResource PhoneTouchTargetLargeOverhang}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="32" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <Border x:Name="CheckBackground"
                                        Width="32"
                                        Height="32"
                                        HorizontalAlignment="Left"
                                        VerticalAlignment="Center"
                                        Background="{TemplateBinding Background}"
                                        BorderBrush="{TemplateBinding Background}"
                                        BorderThickness="{StaticResource PhoneBorderThickness}"
                                        IsHitTestVisible="False" />
                                <Rectangle x:Name="IndeterminateMark"
                                           Grid.Row="0"
                                           Width="16"
                                           Height="16"
                                           HorizontalAlignment="Center"
                                           VerticalAlignment="Center"
                                           Fill="{StaticResource PhoneRadioCheckBoxCheckBrush}"
                                           IsHitTestVisible="False"
                                           Visibility="Collapsed" />
                                <!--  Magic! Default to UnCheckedImagePath  -->
                                <Image x:Name="CheckMark"
                                       Width="24"
                                       Height="18"
                                       HorizontalAlignment="Center"
                                       VerticalAlignment="Center"
                                       IsHitTestVisible="False"
                                       Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=UnCheckedImagePath}"
                                       Stretch="Fill"
                                       Visibility="Collapsed" />
                                <ContentControl x:Name="ContentContainer"
                                                Grid.Column="1"
                                                Margin="12,0,0,0"
                                                Content="{TemplateBinding Content}"
                                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                                Foreground="{TemplateBinding Foreground}"
                                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                Padding="{TemplateBinding Padding}"
                                                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </CheckBox.Style>
</CheckBox>