如何在 Windows 10 个 UWP 应用程序中将 SourceUri 和 BitmapIcon 绑定到 RadioButton

How to Bind the SourceUri a BitmapIcon to RadioButton in Windows 10 UWP Apps

我正在尝试为 Windows 10 SplitView 控件制作典型的单选按钮样式 - 带有图标和文本。我尝试将 UriSource 属性 模板绑定到 RadioButton 的标签 属性。但是这里的问题是Tag是字符串类型而UriSource是Uri。所以它不起作用。有没有办法以其他方式设置 UriSource?

风格的相关片段:

<Grid Name="BackgroundGrid" Background="Transparent" VerticalAlignment="Stretch">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="48"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <BitmapIcon Height="38" UriSource="{TemplateBinding Tag}" Margin="5,8,5,5" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                            <ContentPresenter x:Name="ContentPresenter" AutomationProperties.AccessibilityView="Raw" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Content="{TemplateBinding Content}" Grid.Column="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" TextWrapping="Wrap" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Grid>

和单选按钮:

<RadioButton Style="{StaticResource SplitViewRadioButtonStyle}" Content="Home" x:Name="Home" Tag="/Assets/Home.png"/>

最简单的方法是将 ms-appx/// 添加到应用中的资源中

Tag="ms-appx///Assets/Home.png"

附加 属性 怎么样?

我喜欢这种方法而不是转换器,因为您可以将它附加到您想要的任何控件,并且它具有更好的性能。

附上属性

public class Properties
{
    public static Uri GetIconUri(DependencyObject obj)
    {
        return (Uri)obj.GetValue(IconUriProperty);
    }

    public static void SetIconUri(DependencyObject obj, Uri value)
    {
        obj.SetValue(IconUriProperty, value);
    }

    public static readonly DependencyProperty IconUriProperty =
        DependencyProperty.RegisterAttached("IconUri", typeof(Uri), typeof(Properties), new PropertyMetadata(null));
}

样式内绑定

<BitmapIcon UriSource="{Binding Path=(local:Properties.IconUri), RelativeSource={RelativeSource TemplatedParent}}" ...

用法

<RadioButton local:Properties.IconUri="Assets/Home.png" ...

所以我通过扩展 RadioButton 控件并添加两个属性(即 IconUri 和 IconBitmap)来制定解决方案。

 public static readonly DependencyProperty IconUriProperty = DependencyProperty.Register("IconUri", typeof(Uri), typeof(CustomRadioButton), new PropertyMetadata(null, OnIconBitmapChanged));

    private static void OnIconBitmapChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ImageRadioButton current = d as CustomRadioButton;
        if(current!=null)
        {
            current.IconBitmap = new BitmapImage(current.IconUri);
        }
    }

    public Uri IconUri
    {
        get { return (Uri)GetValue(IconUriProperty); }
        set { SetValue(IconUriProperty, value); }
    }

    public static readonly DependencyProperty IconBitmapProperty = DependencyProperty.Register("IconBitmap", typeof(BitmapImage), typeof(CustomRadioButton), new PropertyMetadata(null));

    public BitmapImage IconBitmap
    {
        get { return (BitmapImage)GetValue(IconBitmapProperty); }
        set { SetValue(IconBitmapProperty, value); }
    }

然后将样式中的图像控件绑定到IconBitmap。因为,这里我们直接绑定到 BitmapImage,所以它不会失败。也适用于 Web URI。

Xaml 对于 RadioButton:

<templatedControls:CustomRadioButton IconUri="uri" Style="{StaticResource CustomRadioButtonStyle}"/>

其风格:

<Image Source="{TemplateBinding IconBitmap}" />

要使样式与您的扩展单选按钮一起使用,只需将样式的 'Target' 从 RadioButton 替换为 templatedControls:CustomRadioButton,其中 templatedControls 是具有 CustomRadioButton 的 XAML 命名空间。