2009-09-02 122 views
0

我用Mike Swanson的illustrator to xaml converter将我的一些图像转换为xaml。 转换创建一个包含图像的视图框。这些视图框是我在程序中创建资源文件的。动态显示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类来将绘图大小调整为单元格大小吗?我该如何动态地做到这一点?

回答

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(); 
    } 
} 

网格单元现在包括含视框,我觉得有点别扭一个ContentControl中视框。