2016-05-08 3 views
2

Я хочу реализовать преобразователь значений, чтобы указать Point для RenderTransform. Это работает нормально, пока я просто не реализую интерфейс IValueConverter. Я знаю, что я могу реализовать класс MarkupExtension, чтобы каждый раз объявлять отдельный ресурс XAML для моего конвертера. Когда я пытаюсь реализовать это, у меня естьInvalidCastException во время разработки, когда указать преобразователь как MarkupExtension

InvalidCastException: невозможно лить объект типа «System.Object», чтобы ввести «System.Windows.Data.IValueConverter».

реализация конвертер: использование

[ValueConversion(typeof(Point), typeof(Transform))] 
public class PointToTransformConverter : MarkupExtension, IValueConverter 
{ 
    private PointToTransformConverter _instance = null; 

    public object Convert(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     var point = (Point)value; 

     return new TransformGroup 
     { 
      Children = new TransformCollection 
      { 
       new TranslateTransform(point.X, point.Y) 
      } 
     }; 
    } 

    public object ConvertBack(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     var transform = value as TransformGroup; 
     if (transform?.Children.Count > 0) 
     { 
      var translateTransform = transform.Children[0] as TranslateTransform; 
      if (translateTransform != null) 
      { 
       return new Point(
        translateTransform.X, 
        translateTransform.Y); 
      } 
     } 

     return null; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return _instance ?? (_instance = new PointToTransformConverter()); 
    } 
} 

XAML:

<local:PathControl x:Class="PathToWiringTube.PathView" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:local="clr-namespace:PathToWiringTube" 
        xmlns:view="clr-namespace:PathToWiringTube.View" 
        xmlns:vm="clr-namespace:PathToWiringTube.VM" 
        xmlns:crocodile="clr-namespace:Crocodile;assembly=Crocodile" 
        mc:Ignorable="d" 
        d:DataContext="{d:DesignInstance vm:PathVm}"> 
    <local:PathControl.Resources> 
     <crocodile:PointToTransformConverter x:Key="pointToTransformConverter"/> 
    </local:PathControl.Resources> 
    <Canvas> 
     <ItemsControl x:Name="itemsMarkers" ItemsSource="{Binding Markers}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <view:SplineDensityMarker Width="5" RenderTransform="{Binding Position, Converter={StaticResource pointToTransformConverter}}"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Canvas> 
</local:PathControl> 

Что я делаю неправильно?

ответ

0

Я проверил мой код на другой среде и обнаружили, что она работает. Я провел исследование для несоответствия версии Visual Studio и узнал об этом (14.0.23107.0 D14REL и 14.0.24720.00 Update1). После установки последней версии Visual Studio Update 2 в моей старой среде все работает нормально.

1

Не могли бы вы попробовать приведенный ниже код и проверить, не пришло ли исключение? Я исправил его. Экземпляр должен быть статическим и xaml, вы можете напрямую ссылаться на конвертер, а не называть его статическим ресурсом. Это основное использование использования MarkupExtension . Код ниже должен работать нормально. Если возникнут какие-либо проблемы, пожалуйста, вернитесь.

Преобразователь:

[ValueConversion(typeof(Point), typeof(Transform))] 
public class PointToTransformConverter : MarkupExtension, IValueConverter 
{ 
    private static PointToTransformConverter _instance = null; 

    public object Convert(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     var point = (Point)value; 

     return new TransformGroup 
     { 
      Children = new TransformCollection 
      { 
       new TranslateTransform(point.X, point.Y) 
      } 
     }; 
    } 

    public object ConvertBack(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     var transform = value as TransformGroup; 
     if (transform?.Children.Count > 0) 
     { 
      var translateTransform = transform.Children[0] as TranslateTransform; 
      if (translateTransform != null) 
      { 
       return new Point(
        translateTransform.X, 
        translateTransform.Y); 
      } 
     } 

     return null; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return _instance ?? (_instance = new PointToTransformConverter()); 
    } 
} 

Xaml:

<local:PathControl x:Class="PathToWiringTube.PathView" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:local="clr-namespace:PathToWiringTube" 
        xmlns:view="clr-namespace:PathToWiringTube.View" 
        xmlns:vm="clr-namespace:PathToWiringTube.VM" 
        xmlns:crocodile="clr-namespace:Crocodile;assembly=Crocodile" 
        mc:Ignorable="d" 
        d:DataContext="{d:DesignInstance vm:PathVm}"> 
    </local:PathControl.Resources> 
    <Canvas> 
     <ItemsControl x:Name="itemsMarkers" ItemsSource="{Binding Markers}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <view:SplineDensityMarker Width="5" RenderTransform="{Binding Position, Converter={crocodile:PointToTransformConverter}}"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Canvas> 
</local:PathControl> 
+0

Да, я еще сказал, что он работает нормально. Но как я могу реализовать в этом случае класс MarkupExtension и интерфейс IValueConverter? –

+0

Нет. Я не хотел проверять, работает ли конвертер без расширения разметки, т.е. путем добавления в качестве статического ресурса? – ViVi

+0

Я действительно обновил код. Пожалуйста, проверьте сейчас. – ViVi

Смежные вопросы