动态显示xaml资源?

时间:2009-09-02 18:14:51

标签: wpf resources triggers datatemplate

我使用Mike Swanson的illustrator to xaml converter将我的一些图像转换为xaml。 转换创建一个包含图像的视图框。这些视图框我在我的程序中创建了资源文件。

下面的代码展示了我正在尝试做的事情:我有一个viewmodel,它有一个名为PrimaryWinding的枚举变量,类型为Windings。枚举的值PrimD和PrimY选择资源中的相应PrimD和PrimY xaml文件。

<UserControl.Resources>
    <DataTemplate x:Key="PrimTrafo" DataType="{x:Type l:Windings}">
        <Frame Source="{Binding}" x:Name="PART_Image" NavigationUIVisibility="Hidden">
            <Frame.LayoutTransform>
                <ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
            </Frame.LayoutTransform>
        </Frame>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding}" Value="PrimD">
                <Setter TargetName="PART_Image" Property="Source" Value="Resources\PrimD.xaml" />
            </DataTrigger>
            <DataTrigger Binding="{Binding}" Value="PrimY">
                <Setter TargetName="PART_Image" Property="Source" Value="Resources\PrimY.xaml" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</UserControl.Resources>

<!--The contentcontrol that holds the datatemplate defined above-->
<Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"></ColumnDefinition>
        <ColumnDefinition Width="2*"></ColumnDefinition>
        <ColumnDefinition Width="1*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <ContentControl Grid.Column="0" Content="{Binding PrimaryWinding}" ContentTemplate="{StaticResource PrimTrafo}"/>
</Grid>

此代码有效。只有我无法将图纸调整为网格单元的大小。我添加了ScaleTransform类来调整图像大小 框架是否是一个错误的类来保存图纸?
我应该使用ScaleTransform类将绘图大小调整为单元格的大小吗?我怎么能动态地做到这一点?

1 个答案:

答案 0 :(得分:0)

我找到了一个有效的解决方案,但我仍然不喜欢它。如果我将ContentControl放在Viewbox中,它会将内容调整为网格单元格的大小。 这也适用于我的第一条消息中的代码。我还尝试了另一种解决方案,即构建一个基于枚举值创建视图的转换器 我仍然希望有人知道更好的解决方案吗?

<Viewbox Grid.Column="0" Stretch="Fill">
    <ContentControl Content="{Binding PrimaryWinding,  Converter={StaticResource viewboxConverter}}"/>
</Viewbox>

视图框转换器枚举值的代码:

[ValueConversion(typeof(Windings), typeof(Viewbox))]
public sealed class WindingsToViewboxConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        try
        {
            string source=null;
            switch ((Windings)value)
            {
                case Windings.PrimD:
                    source = Properties.Resources.PrimD;
                    break;
                case Windings.PrimY:
                    source =Properties.Resources.PrimY;
                    break;
                default:
                    break;
            }
            Viewbox viewbox = (Viewbox)XamlReader.Parse(source);
            return viewbox;
        }
        catch
        {
            return new Viewbox();
        }
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

网格单元格现在有一个包含内容控件的视图框,其中包含一个视图框,我觉得有点尴尬。